任务目标
模拟排球竞技比赛,并且得出模拟结果
比赛规则如下
前4局比赛采用25分制,每个队只有至少赢得25分,并且同时超过对方2分时,才胜一局
正式比赛采用5局3胜制,决胜局的比赛采用15分制,1队先得8分,两队交换场地,按原位置顺序继续进行比赛到结束
在决胜局(第5局)的比赛,先获15分并领先对方2分为胜
输入如下代码
1 from random import random 2 def printIntro(): 3 print("这个程序模拟两个选手A和B的排球竞技比赛") 4 print("程序需要A和B的能力值(0到1之间的小数表示)") 5 def getInputs(): 6 a=eval(input("请输入选手A的能力值(0-1):")) 7 b=eval(input("请输入选手B的能力值(0-1):")) 8 n=eval(input("模拟比赛场次:")) 9 return a,b,n 10 def simNGames(n,probA,probB): 11 winsA,winsB=0,0 12 for i in range(n): 13 scoreA,scoreB=simOneGame(probA,probB) 14 if scoreA>scoreB: 15 winsA+=1 16 else: 17 winsB+=1 18 return winsA,winsB 19 def gameOver(a,b): 20 if (a>25 and abs(a-b)>=2 )or(b>25 and abs(a-b)>=2): 21 return True 22 else: 23 return False 24 def simOneGame(probA,probB): 25 scoreA,scoreB=0,0 26 serving="A" 27 while not gameOver(scoreA,scoreB): 28 if serving=="A": 29 if random() < probA: 30 scoreA += 1 31 else: 32 serving="B" 33 else: 34 if random() < probB: 35 scoreB += 1 36 else: 37 serving="A" 38 return scoreA,scoreB 39 def final(probA,probB): 40 winsA,winsB=simNGames1(4,probA,probB) 41 printSummary(winsA,winsB) 42 if not winsA==3 or winsB==3: 43 if winsA==winsB==2: 44 winsA1,winsB1=simOneGame1(probA,probB) 45 finalprintSummary(winsA,winsB) 46 else: 47 finalprintSummary(winsA,winsB) 48 def simNGames1(n,probA,probB): 49 winsA,winsB=0,0 50 for i in range(n): 51 scoreA,scoreB=simOneGame2(probA,probB) 52 if winsA==3 or winsB==3: 53 break 54 if scoreA>scoreB: 55 winsA+=1 56 else: 57 winsB+=1 58 return winsA,winsB 59 def simOneGame2(probA,probB): 60 scoreA,scoreB=0,0 61 serving="A" 62 while not GG(scoreA,scoreB): 63 if serving=="A": 64 if random() < probA: 65 scoreA += 1 66 else: 67 serving="B" 68 else: 69 if random() < probB: 70 scoreB += 1 71 else: 72 serving="A" 73 return scoreA,scoreB 74 def simOneGame1(probA,probB): 75 scoreA,scoreB=0,0 76 serving="A" 77 while not finalGameOver(scoreA,scoreB): 78 if serving=="A": 79 if random() < probA: 80 scoreA += 1 81 else: 82 serving="B" 83 else: 84 if random() < probB: 85 scoreB += 1 86 else: 87 serving="A" 88 return scoreA,scoreB 89 def GG(a,b): 90 return a==3 or b==3 91 def finalGameOver(a,b): 92 if (a>15 and abs(a-b)>=2 )or(b>15 and abs(a-b)>=2): 93 return True 94 else: 95 return False 96 def finalprintSummary(winsA,winsB): 97 n=winsA+winsB 98 if n>=4: 99 print("进行最终决赛") 100 if winsA>winsB: 101 print("最终决赛由A获胜") 102 else: 103 print("最终决赛由B获胜") 104 else: 105 if winsA>winsB: 106 print("最终决赛由A获胜") 107 else: 108 print("最终决赛由B获胜") 109 def printSummary(winsA,winsB): 110 n=winsA+winsB 111 print("竞技分析开始,共模拟{}场比赛".format(n)) 112 print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n)) 113 print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n)) 114 def main(): 115 printIntro() 116 probA,probB,n=getInputs() 117 winsA,winsB=simNGames(n,probA,probB) 118 printSummary(winsA,winsB) 119 final(probA,probB) 120 main()
输出结果如右下角