Python之體育競技比賽分析實例,學習自頂向下程序設計思想

模擬N場比賽
抽象+自動化
當N越大,比賽結果分析會越科學
假設比賽規則
1、雙人擊球比賽:A&B,回合制,5局3勝
2、開始時一方先發球,直至判分,接下來勝者發球
3、球員只能在發球局得分,15分爲一局
自頂向下
解決複雜問題的有效方法。
將一個總的問題表達爲若干個小問題的組成形式。
自底向上
分單元測試,逐步組裝
程序總體框架及步驟:
1、打印程序介紹性信息 --printInfo()
2、獲得程序運行參數:proA,proB,n --getInput()
3、利用球員A和B的能力值,模擬n局比賽 --simNGames()
4、輸出A和B獲勝比賽的場次及概率 --printSummary()

第一階段   自頂向下設計
def  main():  #主程序流程
         printInfo()
         proA,proB,n = getInput()
         winsA,winsB = simNGames(n,proA,proB)
         printSummary(winsA,winsB)
         
def  printInfo():  #打印程序介紹信息
    print("這個程序模擬兩個選手A和B的某種競技比賽")
    print("程序運行需要A和B的能力值(以0到1之間的小數表示)")

def getInput():    #獲得選手的能力值和模擬的比賽場次
    a = eval(input("請輸入選手A的能力值(0-1):"))
    b = eval(input("請輸入選手B的能力值(0-1):"))
    n = eval(input("模擬比賽的場次:"))
    return a,b,n

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 simNGames(n, proA, proB):  #將模擬N場比賽分解爲模擬循環模擬N次一場比賽
    winsA,winsB = 0,0
    for i in range(n):
        scoreA,scoreB = simOneGame(proA,proB)
        if scoreA>scoreB:
            winsA +=1
        else:
            winsB +=1
    return winsA,winsB

def simOneGame(proA,proB):   #模擬一場比賽,加入gameOver()條件函數
    scoreA,scoreB = 0,0
    serving = "A"
    while not gameOver(scoreA,scoreB):
        if serving == "A":
            if random() < proA:
                scoreA +=1
            else:
                serving = "B"
        else:
            if random()<proB:
                scoreB +=1
            else:
                serving = "A"
    return scoreA,scoreB

def gameOver(a,b):   #gameOver()條件函數
    return a==15 or b==15

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章