上次也写了一个关于顶层设计的体育竞技模拟的程序,但是学习后感觉还是不对,所以重新编辑了一下,再理一理思路。
首先有一个主程序main()
往下依次把问题分解为:
1.打印基本信息(介绍规则,所需信息等等)
2.获取必要参数(回合/场次,双方对手的能力值)
3.计算要求场次下A,B的胜率,场次
4.输出结果介绍
———————————————分割线——————————————————
定义顶层函数
def main(): #顶层设计
printIntro()
probA,probB,n = getInput()
winsA,winsB = simNGame(n,probA,probB)
printOutput(winsA,winsB)
可以看到main()下有四个函数:
第一个是printIntro()
printIntro() #输出基本信息
具体如下:
def printIntro():
print('该程序模拟两名队员的比赛')
print('有A,B两名球员')
print('各自的能力值用(0,1)之间的数字表示')
第二个是getInput():
def getInput():
probA = eval(input('请输入A球员的能力值:'))
probB = eval(input('请输入B球员的能力值:'))
n = eval(input('请输入模拟的场次:'))
return probA,probB,n
返回三个值:A的能力值,B的能力值,模拟的场次
得到基本参数后就可以进行n回合的计算
由于n个回合可以看作是一个回合的n次循环运行,所以要定义一个1次循环的记分模式:simNGame(n,probA,probB):
def simNGame(n,probA,probB):
winsA = 0;winsB = 0;i = 0
while i < n:
scoreA , scoreB = simOneGame(probA,probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
i += 1
return winsA,winsB
scoreA和scoreB的值由一次回合的得分决定
一次回合的代码如下:
def simOneGame(probA,probB):
import random
scoreA = 0
scoreB = 0
serving = 'A'
while scoreA != 15 and scoreB != 15:
if serving == 'A':
if random.random() < probA:
scoreA += 1
else:
scoreB += 1
serving = 'B'
else:
if random.random() < probB:
scoreB += 1
else:
scoreA += 1
serving == 'A'
return scoreA,scoreB
这样基本工作就已经完成了,来到最后一个函数printOutput(winsA,winsB):
def printOutput(winsA,winsB):
total = winsA+winsB
print('模拟的总场次为:',total)
print('A选手的获胜场次为{},胜率为{}'.format(winsA,winsA/total))
print('B选手的获胜场次为{},胜率为{}'.format(winsB,winsB/total))
这样就完成啦,调用结果
main()
就好啦
这是一道非常经典的面向过程的题目。
但现代编程中,面向对象更符合一般认识世界描述世界的方式,所以面向对象已成主流编程方式,面向过程仅在处理具体,规则明确,程序具体的事件模拟时有所使用,其余基本被面向对象取代。
所以最近我也在加紧学习面向对象编程,使用类,实例等方式定义一个对象。