任务要求:
编写程序,模拟体育竞技分析
C.羽毛球比赛规则
>21分制,3局2胜为佳
>每球得分制
>每回合中,取胜的一方加1分
>当双方均为20分时,领先对方2分的一方赢得该局比赛
>当双方均为29分时,先取得30分的一方赢得该局比赛
>一局比赛的获胜方在下一局率先发球
一.首先编写程序
步骤一:顶层设计
from random import *
#顶层设计
def main():
printIntroduce()#打印程序的介绍信息
probabilityA,probabilityB,n=getInputs()#通过getsInputs函数来获取2个球员的能力值和比赛次数
winsA,winsB=simulateNGames(n,probabilityA,probabilityB)#通过simulateNGames()求得2个球员在n次比赛中获胜的次数
printSummary(winsA,winsB)#通过printSummary()来输出比赛的结果信息
步骤二:
#第二阶段
def printIntroduce():
print('这个程序模拟两个选手A和B的羽毛球竞技比赛')
print('程序运行需要A和B的能力值')
def getInputs():
a=eval(input('请输入选手A的能力值(0~1):'))
b=eval(input('请输入选手B的能力值(0~1):'))
n=eval(input('比赛胜利达到多少局获胜:'))
return a,b,n
def simulateNGames(n,probabilityA,probabilityB):
'''定义球员A,B赢得比赛的次数,初始值为0,
通过for循环来模拟n次比赛
用simulateOneGame()来模拟一场比赛'''
winsA,winsB=0,0
while not judge(n,winsA,winsB):
'''返回本场比赛2个球员的得分,根据得分来确定本场比赛的胜负'''
scoreA,scoreB=simulateOneGame(probabilityA,probabilityB)
if scoreA>scoreB:
winsA+=1
else:
winsB+=1
return winsA,winsB
def printSummary(winsA,winsB):
n=winsA+winsB
print('\n比赛开始,共模拟%d场比赛'%n)
print('选手A获胜{}场比赛,占比{:0.1%}'.format(winsA,winsA/n))
print('选手B获胜{}场比赛,占比{:0.1%}'.format(winsB,winsB/n))buzhousan
步骤三:
#第三阶段
def simulateOneGame(probabilityA,probabilityB):
'''每场比赛,2个球员的得分初始为0,设定每场比赛总是A先发球,
用random函数生成一个随机小数,范围在【0,1)内'''
scoreA,scoreB=0,0
starting='A'
while not gameOver(scoreA,scoreB):
if starting=='A':
if random()<probabilityA:
scoreA+=1
else:
scoreB+=1
starting='B'
else:
if random()<probabilityB:
scoreB+=1
else:
scoreB+=1
starting='A'
return scoreA,scoreB
def gameOver(a,b):
'''任意一方达到20分就结束比赛'''
if a>29 or b>29:
return True
elif a>20 or b>20:
if abs(a-b)>1:
return True
else:
return False
def judge(n,winsA,winsB):
if winsA==n or winsB==n:
return True
else:
return False
main()
二.执行效果