模擬體育競賽
阿新 • • 發佈:2020-11-23
from random import * #定義一個Info類,功能是列印介紹性資訊,並且獲得使用者輸入的兩隊伍能力值,模擬場次 class Info: def __init__(self): print('這個程式是模擬兩支隊伍A和B的排球比賽') print('程式執行需要A和B的能力值(以0到1之間的小數表示)') def GetInput(self): A = eval(input('請輸入隊伍A的能力值(0-1):')) B = eval(input('請輸入隊伍B的能力值(0-1):')) N = eval(input('模擬比賽場次:')) return A, B, N #定義了一個OneGame類,功能是用來完成一場5局3勝制的比賽 class OneGame: def simOneGame(self, probA, probB): A_win, B_win, count = 0, 0, 1 while not (A_win == 3 or B_win == 3): serving = choice(['A', 'B']) #這裡我選擇的是隨機開球方 scoreA, scoreB = 0, 0 while not OneGame.Gameover(count, scoreA, scoreB): if serving == 'A': if random() < probA: scoreA += 1 else: serving = 'B' else: if random() < probB: scoreB += 1 else: serving = 'A' if scoreA > scoreB : A_win += 1 else: B_win += 1 if count == 5: count = 1 count += 1 return A_win, B_win @classmethod def Gameover(self, count, scoreA, scoreB): #這個函式是用來判斷比賽是否結束 if count < 5: return (scoreA >= 25 or scoreB >= 25) and abs(scoreA - scoreB) >= 2 else: return (scoreA >= 15 or scoreB >= 15) and abs(scoreA - scoreB) >= 2 #定義了一個NGame類,繼承了OneGame的屬性和方法,功能是完成N場5局3勝制比賽 class NGame(OneGame): def simNGames(self, n, A, B): winsA, winsB = 0, 0 for i in range(n): win_numA, win_numB = self.simOneGame(A, B) if win_numA > win_numB: winsA += 1 else: winsB += 1 return winsA, winsB #定義了一個PrintSummary類,功能是列印比賽結果 class PrintSummary: def __init__(self, N, winA, winB): print('競技分析開始,共模擬{}場比賽'.format(N)) print('隊伍A獲勝{}場比賽,佔比{:.2f}%'.format(winA, winA/N * 100)) print('隊伍B獲勝{}場比賽,佔比{:.2f}%'.format(winB, winB/N * 100)) def main(): match_info = Info() #建立一個Info物件 A, B, N = match_info.GetInput() #使用Info類的GetInput方法獲得能力值和場次 match = NGame() #建立一個NGame物件 A_win, B_win = match.simNGames(N, A, B) #獲得A, B兩隊獲勝的比賽場數 PrintSummary(N, A_win, B_win) #列印比賽結果 input("please input any key to exit!") main()