标签:获得 else ret png nts summary inpu eval while
比赛规则:(1)一局比赛:在一局比赛中,先得11分的一方为胜方:10平后,先多得2分的一方为胜方。
(2)一场比赛:单打的淘汰赛为七局四胜制,双打淘汰赛或团体赛为五局三胜制
解答:1、将体育竞技分析分解为以下几个小步骤
1.1打印程序的介绍性信息式
1.2获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次)
1.3利用球员AB的能力值,模拟n场比赛
1.4输出球员AB获胜的场次及概率
1.5用pyinstaller打包可执行文件
2、将各个步骤定义成函数来实现:
3.1主体函数:
1 def main(): 2 printIntro() 3 probA, probB, n = printInputs() 4 winsA, winsB = simNGames(n, probA, probB) 5 printSummary(winsA, winsB)
3.2自定义函数:
1 #打印程序介绍信息 2 def printIntro(): 3 print("19信1 002号李源淇") 4 print("这个程序模拟两个选手A和B的乒乓球比赛") 5 print("程序运行需要A和B的能力值(以0到1之间的小数表示)") 6 7 #获得程序运行参数 8 def printInputs(): 9 a = eval(input("请输入选手A的能力值(0-1): ")) 10 b = eval(input("请输入选手B的能力值(0-1): ")) 11 n = eval(input("模拟比赛的场次: ")) 12 return a, b, n 13 14 # 进行N场比赛 15 def simNGames(n, probA, probB): 16 winsA, winsB = 0, 0 17 for i in range(n): 18 for j in range(7): #进行7局4胜的比赛 19 scoreA, scoreB = simOneGame(probA, probB) 20 if scoreA > scoreB: 21 winsA += 1 22 else: 23 winsB += 1 24 return winsA,winsB 25 26 27 #进行一场比赛 28 def simOneGame(probA, probB): 29 scoreA, scoreB = 0, 0 #初始化AB的得分 30 serving = "A" 31 while not gameOver(scoreA, scoreB): #用while循环来执行比赛 32 if scoreA==10 and scoreB==10: 33 return(simOneGame2(probA,probB)) 34 if serving == "A": 35 if random() < probA: ##用随机数生成胜负 36 scoreA += 1 37 else: 38 serving="B" 39 else: 40 if random() < probB: 41 scoreB += 1 42 else: 43 serving="A" 44 return scoreA, scoreB 45 46 def simOneGame2(probA,probB): 47 scoreA,scoreB=10,10 48 serving = "A" 49 while not gameOver2(scoreA, scoreB): 50 if serving == "A": 51 if random() < probA: 52 scoreA += 1 53 else: 54 serving="B" 55 else: 56 if random() < probB: 57 scoreB += 1 58 else: 59 serving="A" 60 return scoreA, scoreB 61 62 #比赛结束 63 def gameOver(a,b): #正常比赛结束 64 return a==11 or b==11 65 def gameOver2(a,b): #进行抢12比赛结束 66 if abs((a-b))>=2: 67 return a,b 68 69 70 #输出数据 71 def printSummary(winsA, winsB): 72 n = winsA + winsB 73 print("竞技分析开始,共模拟{}场比赛".format(n)) 74 print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n)) 75 print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
3.3合并:
1 from random import random 2 3 #打印程序介绍信息 4 def printIntro(): 5 print("19信计2班23号邓若言") 6 print("这个程序模拟两个选手A和B的乒乓球比赛") 7 print("程序运行需要A和B的能力值(以0到1之间的小数表示)") 8 9 #获得程序运行参数 10 def printInputs(): 11 a = eval(input("请输入选手A的能力值(0-1): ")) 12 b = eval(input("请输入选手B的能力值(0-1): ")) 13 n = eval(input("模拟比赛的场次: ")) 14 return a, b, n 15 16 # 进行N场比赛 17 def simNGames(n, probA, probB): 18 winsA, winsB = 0, 0 19 for i in range(n): 20 for j in range(7): #进行7局4胜的比赛 21 scoreA, scoreB = simOneGame(probA, probB) 22 if scoreA > scoreB: 23 winsA += 1 24 else: 25 winsB += 1 26 return winsA,winsB 27 28 29 #进行一场比赛 30 def simOneGame(probA, probB): 31 scoreA, scoreB = 0, 0 #初始化AB的得分 32 serving = "A" 33 while not gameOver(scoreA, scoreB): #用while循环来执行比赛 34 if scoreA==10 and scoreB==10: 35 return(simOneGame2(probA,probB)) 36 if serving == "A": 37 if random() < probA: ##用随机数生成胜负 38 scoreA += 1 39 else: 40 serving="B" 41 else: 42 if random() < probB: 43 scoreB += 1 44 else: 45 serving="A" 46 return scoreA, scoreB 47 48 def simOneGame2(probA,probB): 49 scoreA,scoreB=10,10 50 serving = "A" 51 while not gameOver2(scoreA, scoreB): 52 if serving == "A": 53 if random() < probA: 54 scoreA += 1 55 else: 56 serving="B" 57 else: 58 if random() < probB: 59 scoreB += 1 60 else: 61 serving="A" 62 return scoreA, scoreB 63 64 #比赛结束 65 def gameOver(a,b): #正常比赛结束 66 return a==11 or b==11 67 def gameOver2(a,b): #进行抢12比赛结束 68 if abs((a-b))>=2: 69 return a,b 70 71 72 #输出数据 73 def printSummary(winsA, winsB): 74 n = winsA + winsB 75 print("竞技分析开始,共模拟{}场比赛".format(n)) 76 print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n)) 77 print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n)) 78 79 #主体函数 80 def main(): 81 printIntro() 82 probA, probB, n = printInputs() 83 winsA, winsB = simNGames(n, probA, probB) 84 printSummary(winsA, winsB) 85 86 main()
结果预测如下:
3.4打包可执行文件:
打包的程序在上图路径可找到:
二、采用篮球比赛规则:
(1)篮球比赛由两个队参加,每队出场5名队员。每队目标是在对方球篮得分,并阻止对方队在本方球篮得分。
(2)篮球比赛由裁判员、记录台人员和技术代表(如到场)管理。
(3)被某队进攻的球篮是对方的球篮,由某队防守的球篮是本方的球篮。
(4)在比赛时间结束时得分较多的队,将是比赛的胜者。
分析:
大体相同,自定义函数稍作改动:
1 # 进行N场比赛 2 def simNGames(n, probA, probB): 3 winsA, winsB = 0, 0 4 for i in range(n): 5 scoreA, scoreB = simOneGame(probA, probB) 6 if scoreA > scoreB: 7 winsA += 1 8 else: 9 winsB += 1 10 return winsA,winsB 11 12 13 #进行一场比赛 14 def simOneGame(probA, probB): 15 scoreA, scoreB = 0, 0 #初始化AB的得分 16 serving = "A" 17 while not gameOver(scoreA, scoreB): #用while循环来执行比赛 18 if serving == "A": 19 if random() < probA: ##用随机数生成胜负 20 scoreA += 1 21 else: 22 serving="B" 23 else: 24 if random() < probB: 25 scoreB += 1 26 else: 27 serving="A" 28 return scoreA, scoreB 29 30 31 #比赛结束 32 def gameOver(a,b): 33 return a>b or b>a
合并后结果如下:
标签:获得 else ret png nts summary inpu eval while
原文地址:https://www.cnblogs.com/zzalovelyq/p/13181856.html