import random
def printIntro():
print("2019310143145")
print("模拟排球比赛")
print("五局三胜制")
print("程序运行需要ABCD的能力值(以0到1之间的小数表示)")
def getInputs():
a = eval(input("请输入选手A的能力值(0-1): "))
b = eval(input("请输入选手B的能力值(0-1): "))
c = eval(input("请输入选手C的能力值(0-1): "))
d = eval(input("请输入选手D的能力值(0-1): "))
return a,b,c,d
def simOneGame(probA, probB): # 进行一场比赛
scoreA, scoreB = 0, 0 # 初始化AB的得分
serving = "A" # 首先由A发球
while not gameOver(scoreA, scoreB): #用while循环来执行比赛
if serving == "A":
if random.random() < probA:# random() 方法返回随机生成的一个实数,它在[0,1)范围内。
scoreA += 1 # 用随机数来和能力值比较从而分出胜负
else:
serving = "B"
else:
if random.random() < probB:
scoreB += 1
else:
serving = "A"
return scoreA, scoreB
def simNGames(probA, probB): #进行5场比赛
winsA, winsB = 0, 0 # 初始化AB的胜场数
for i in range(5):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
def gameOver(a, b): #比赛结束
return (a >= 25 and a-b>1) or (b >= 25 and b-a>1) #必须大两分
def oneround(probA, probB):
roundA,roundB=0,0
while not roundover(roundA,roundB):
A,B=simNGames(probA, probB)
if A>B:
roundA+=1
else:
roundB+=1
return roundA,roundB
def Nround(probA,probB):
winsA, winsB = 0, 0
for i in range(5):
scoreA, scoreB = oneround(probA,probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
def roundover(a,b):
return a == 4 or b == 4
printIntro()
probA,probB,probC,probD = getInputs()
winA,winB=Nround(probA, probB)
print("-------------------")
print("第一轮比赛开始")
print("选手A获胜{}回合".format(winA))
print("选手B获胜{}回合".format(winB))
if winA>winB:
print("A胜利")
E=‘A‘
else:
print("B胜利")
E=‘B‘
winC,winD=Nround(probC, probD)
print("选手C获胜{}回合".format(winC))
print("选手D获胜{}回合".format(winD))
if winC>winD:
print("C胜利")
F=‘C‘
else:
print("D胜利")
F=‘D‘
print("---------------------")
print("第二轮开始")
winE=max(winA,winB)
winF=max(winC,winD)
winE,winF=Nround(probA, probB)
print("选手{}获胜{}回合".format(E,winE))
print("选手{}获胜{}回合".format(F,winF))
if winE>winF:
print("{}胜利,为冠军".format(E))
else:
print("{}胜利,为冠军".format(F))
