1. 程式人生 > 其它 >模擬體育竟技分析

模擬體育竟技分析

from random import random


def printInfo(): # 列印程式介紹資訊
print('模擬體育竟技分析--乒乓球比賽規則--31號')
print('這個程式模擬兩個選手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 simOneGame(probA, probB): # 進行一場比賽
scoreA, scoreB = 0, 0 # 初始化AB的得分
serving = 'A' # 首先由A發球
while not gameOver(scoreA, scoreB): # 用while迴圈來執行比賽
if serving == 'A':
if random() < probA: # random() 方法返回隨機生成的一個實數,它在[0,1)範圍內。
scoreA += 1 # 用隨機數來和能力值比較從而分出勝負
else:
serving = 'B'
else:
if random() < probB:
scoreB += 1
else:
serving = 'A'
return scoreA, scoreB


def simNGames(n, probA, probB): # 進行N場比賽
winsA, winsB = 0, 0 # 初始化AB的勝場數
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB


def gameOver(c, d): # 比賽結束
return (c == 11 and d < 10) or (d == 11 and c < 10) or (c >= 10 and d >= 10 and (c - d >= 2 or d - c >= 2))


def printSummary(n, winA, winB): # 列印比賽結果
print('競技分析開始,共模擬{}場比賽'.format(n))
print('選手A獲勝{}場比賽,佔比{:.2f}%'.format(winA, winA / n * 100))
print('選手B獲勝{}場比賽,佔比{:.2f}%'.format(winB, winB / n * 100))


def main():
printInfo()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(n, winsA, winsB)


main()