Python之体育竞技比赛分析实例,学习自顶向下程序设计思想
程序员文章站
2022-07-16 21:50:25
...
模拟N场比赛
抽象+自动化
当N越大,比赛结果分析会越科学
假设比赛规则:
1、双人击球比赛:A&B,回合制,5局3胜
2、开始时一方先发球,直至判分,接下来胜者发球
3、球员只能在发球局得分,15分为一局
自顶向下:
解决复杂问题的有效方法。
将一个总的问题表达为若干个小问题的组成形式。
自底向上:
分单元测试,逐步组装
程序总体框架及步骤:
1、打印程序介绍性信息 --printInfo()
2、获得程序运行参数:proA,proB,n --getInput()
3、利用球员A和B的能力值,模拟n局比赛 --simNGames()
4、输出A和B获胜比赛的场次及概率 --printSummary()
第一阶段 自顶向下设计
def main(): #主程序流程
printInfo()
proA,proB,n = getInput()
winsA,winsB = simNGames(n,proA,proB)
printSummary(winsA,winsB)
def printInfo(): #打印程序介绍信息
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInput(): #获得选手的能力值和模拟的比赛场次
a = eval(input("请输入选手A的能力值(0-1):"))
b = eval(input("请输入选手B的能力值(0-1):"))
n = eval(input("模拟比赛的场次:"))
return a,b,n
def printSummary(winsA, winsB): #输出最后的模拟结果
n = winsA+winsB
print("竞技分析开始,共模拟{}场比赛".format(n))
print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB / n))
def simNGames(n, proA, proB): #将模拟N场比赛分解为模拟循环模拟N次一场比赛
winsA,winsB = 0,0
for i in range(n):
scoreA,scoreB = simOneGame(proA,proB)
if scoreA>scoreB:
winsA +=1
else:
winsB +=1
return winsA,winsB
def simOneGame(proA,proB): #模拟一场比赛,加入gameOver()条件函数
scoreA,scoreB = 0,0
serving = "A"
while not gameOver(scoreA,scoreB):
if serving == "A":
if random() < proA:
scoreA +=1
else:
serving = "B"
else:
if random()<proB:
scoreB +=1
else:
serving = "A"
return scoreA,scoreB
def gameOver(a,b): #gameOver()条件函数
return a==15 or b==15