1. 程式人生 > 其它 >排球比賽模擬

排球比賽模擬

from random import random
def printIntro():
print("54號徐匡奕達的程式模擬兩個選手A和B的排球比賽")
print("程式需要A和B的能力值(以0到1之間的小數表示)")
def getInputs():
a=eval(input("請輸入選手A的能力值(0—1):"))
b=eval(input("請輸入選手B的能力值(0—1):"))
n=eval(input("模擬比賽的場次:"))
return a,b,n
def simNGames(n,probA,probB):
winsA,winsB=0,0
for i in range(n):
scoreA,scoreB=simOneGame(probA,probB)
if scoreA>scoreB:
winsA+=1
else:
winsB+=1
return winsA,winsB
def gameOver1(a,b):
return (a>=25 and a-b>2) or (b>=25 and b-a>2)
def gameOver2(a,b):
return (a>=15 and a-b>2) or (b>=15 and b-a>2)
def simOneGame(probA,probB):

for i in range (5):
winsA,winsB=0,0
scoreA,scoreB=0,0
serving="A"
while not gameOver1(scoreA,scoreB):
if serving=="A":
if random()<probA:
scoreA+=1
else:
scoreB+=1
serving="B"
else:
if random()<probB:
scoreB+=1
else:
serving="A"
scoreA+=1
if scoreA>scoreB:
winsA+=1
else:
winsB+=1
if winsA==3 or winsB==3:
break
if winsA==2 and winsB==2:
simtowGame(probA,probB)
return winsA,winsB
def simtowGame(probA,probB):

for i in range (1):
scoreA,scoreB=0,0
serving="A"
while not gameOver2(scoreA,scoreB):
if serving=="A":
if random()<probA:
scoreA+=1
else:
scoreB+=1
serving="B"
else:
if random()<probB:
scoreB+=1
else:
serving="A"
scoreA+=1
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()