from random import random def printIntro(): print("该程序的制作者为学号尾号为9") print("这个程序模拟两个选手A和B的羽毛球比赛") print("程序运行需要A和B的能力值(以0到1之间的小数表示)") def getInputs(): a = eval(input("请输入选手A的能力值(0-1): ")) b = eval(input("请输入选手B的能力值(0-1): ")) n = eval(input("请输入模拟比赛的局数: ")) return a, b, n def simNGames(n, probA, probB): WinsA, WinsB = 0, 0 winsA, winsB = 0, 0 for i in range(1,n+1): scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 if i%3==0: if winsA>winsB: WinsA+=1 print("第{}场胜利的为A".format(int(i/3))) else: WinsB+=1 print("第{}场胜利的为B".format(int(i/3))) winsA,winsB=0,0 return WinsA, WinsB def gameOver(a,b): if a==30 or b==30: return True if a>19 and b>19: if abs(a-b)==2: return True if a<=19 or b<=19: if a==21 or b==21: return True else: return False def simOneGame(probA, probB): scoreA, scoreB = 0, 0 serving = "A" while not gameOver(scoreA, scoreB): if serving == "A": if random() < probA: scoreA += 1 else: scoreB +=1 serving="B" else: if random() < probB: scoreB += 1 else: scoreA += 1 serving="A" return scoreA, scoreB 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 main(): printIntro() probA, probB, n = getInputs() WinsA, WinsB = simNGames(n, probA, probB) printSummary(WinsA, WinsB) main()