# 体育竞技
from random import random
def printInfo():
print("模拟两个选手A和B的羽毛球竞技比赛")
print("程序需要两个选手的能力值0-1")
print("规则:三局两胜--21分制")
print("作者:37李长宇")
def getInput():
a = eval(input("请输入选手A的能力值(0-1):"))
b = eval(input("请输入选手B的能力值(0-1):"))
m = eval(input("比赛的局数:"))
n = eval(input("模拟比赛的场次:"))
return a, b, m, n
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 simNGames(m, n, probA, probB):
winsA, winsB = 0, 0
wa, wb = 0, 0
for i in range(n):
for i in range(m):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
wa += 1
else:
wb += 1
if wa == 2:
winsA += 1
wa, wb = 0, 0
break
if wb == 2:
winsB += 1
wa, wb = 0, 0
break
return winsA, winsB
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(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 gameOver(a, b):
if (a >= 20 or b >= 20):
if (abs(a - b) == 2 and a <= 29 and b <= 29):
return True
else:
return a == 30 or b == 30
else:
return False
def main():
printInfo()
probA, probB, m, n = getInput()
winsA, winsB = simNGames(m, n, probA, probB)
printSummary(winsA, winsB)
main()
![]()
![]()
![]()