1. 程式人生 > 實用技巧 >模擬體育競賽

模擬體育競賽

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()