模擬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