采用乒乓球比赛规则
a.一局比赛:
在一局比赛中,先得11分的一方为胜方;10平后,先多得2分的一方为胜方。
b.一场比赛:
单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜制。
程序要求:
1.打印程序的介绍性信息式(要求包括你们学号后两位信息)
2.输入I(input):两个球员(球队)的能力值,模拟比赛的次数
3.处理P(process):模拟比赛过程
4.输出O(output):两个球员(球队)获胜的概率(输出谁做的结果截图),
5. 运用pyinstaller打包可以执行的文件。
分析:
1、体育竞技分析:模拟N场比赛
2、计算思维:抽象 + 自动化
3、模拟:抽象比赛过程,自动模拟N场比赛,当N越大时,比赛结果分析越科学。
4、本次比赛规则:
a、回合制,先由一方发球,如胜利,则得1分并继续发球,如失败,则双方分数不改变并交换球权。
球员AB的能力为0-1之间的一个数值先得11分的一方为胜方;10平后,先多得2分的一方为胜方。
b、单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜制。
重点:
思维方式:自顶向下即将一个复杂问题分解成几个问题,再细分成一个个具体的小问题,从而来解决复杂问题。
自底向上为自顶向下的逆过程,即解决复杂问题的方法,逐步解决一个个小问题,来达成目的。
将体育竞技分析分解为以下几个小步骤
1、打印程序的介绍性信息式
2、获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次)
3、利用球员AB的能力值,模拟n场比赛
4、输出球员AB获胜的场次及概率
<1>. 单人赛模拟程序
from random import random # 打印程序介绍信息 def printIntro(): print("信计13号进行比赛分析结果:") print("这是团体赛模拟程序:") # 获得程序运行参数 def getInputs(): a = eval(input("请输入队伍A的能力值(0-1): ")) b = eval(input("请输入队伍B的能力值(0-1): ")) n = eval(input("模拟比赛的场次: ")) return a, b, n # 进行N场比赛 def simNGames(n, probA, probB): winsA, winsB = 0, 0 for i in range(n): for j in range(7): # 进行7局4胜的比赛 scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB # 正常比赛结束 def gameOver(a, b): return a == 11 or b == 11 def gameOver2(a, b): # 进行抢12比赛结束 return a == 12 or b == 12 # 进行一场比赛 def simOneGame(probA, probB): scoreA, scoreB = 0, 0 # 初始化AB的得分 serving = "A" while not gameOver(scoreA, scoreB): # 用while循环来执行比赛 if scoreA == 10 and scoreB == 10: return(simtwoGame2(probA,probB)) if serving == "A": if random() < probA: # 用随机数生成胜负 scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving="A" return scoreA, scoreB def simtwoGame2(probA,probB): scoreA, scoreB=10, 10 serving = "A" # 假如先让队伍A发球 while not gameOver2(scoreA, scoreB): if serving == "A": if random() < probA: scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: 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()
<2>. 团体赛模拟程序
from random import random # 打印程序介绍信息 def printIntro(): print("信计13号进行比赛分析结果:") print("这是团体赛模拟程序:") # 获得程序运行参数 def getInputs(): a = eval(input("请输入队伍A的能力值(0-1): ")) b = eval(input("请输入队伍B的能力值(0-1): ")) n = eval(input("模拟比赛的场次: ")) return a, b, n # 进行N场比赛 def simNGames(n, probA, probB): winsA, winsB = 0, 0 for i in range(n): for j in range(7): # 进行7局4胜的比赛 scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB # 正常比赛结束 def gameOver(a, b): return a == 11 or b == 11 def gameOver2(a, b): # 进行抢12比赛结束 return a == 12 or b == 12 # 进行一场比赛 def simOneGame(probA, probB): scoreA, scoreB = 0, 0 # 初始化AB的得分 serving = "A" while not gameOver(scoreA, scoreB): # 用while循环来执行比赛 if scoreA == 10 and scoreB == 10: return(simtwoGame2(probA,probB)) if serving == "A": if random() < probA: # 用随机数生成胜负 scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving="A" return scoreA, scoreB def simtwoGame2(probA,probB): scoreA, scoreB=10, 10 serving = "A" # 假如先让队伍A发球 while not gameOver2(scoreA, scoreB): if serving == "A": if random() < probA: scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: 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()
标签:winsB,scoreA,scoreB,probB,乒乓球,体育竞技,probA,模拟,比赛 From: https://www.cnblogs.com/T1an-/p/17923363.html