053 例項13-體育競技分析
阿新 • • 發佈:2020-12-13
目錄
一、"體育競技分析"問題分析
1.1 問題分析
體育競技分析
高手過招,勝負只在毫釐之間
- 需求:毫釐是多少?如何科學分析體育競技比賽?
- 輸入:球員的水平
- 輸出:可預測的比賽成績
1.2 體育競技分析:模擬N場比賽
- 計算思維:抽象 + 自動化
- 模擬:抽象比賽過程 + 自動化執行N場比賽
- 當N越大時,比賽結果分析會越科學
1.3 比賽規則
- 雙人擊球比賽:A & B,回合制,5局3勝
- 開始時一方先發球,直至判分,接下來勝者發球
- 球員只能在發球局得分,15分勝一局
二、自頂向下和自底向上
2.1 自頂向下(設計)
解決複雜問題的有效方法
- 將一個總問題表達為若干個小問題組成的形式
- 使用同樣方法進一步分解小問題
- 直至,小問題可以用計算機簡單明瞭的解決
2.2 自底向上(執行)
逐步組建複雜系統的有效測試方法
- 分單元測試,逐步組裝
- 按照自頂向下相反的路徑操作
- 直至,系統各部分以組裝的思路都經過測試和驗證
三、"體育競技分析"例項講解
3.1 體育競技分析
程式總體框架及步驟
-
步驟1:列印程式的介紹性資訊
-
步驟2:獲得程式執行引數:proA, proB, n
-
步驟3:利用球員A和B的能力值,模擬n局比賽
-
步驟4:輸出球員A和B獲勝比賽的場次及概率
-
printInfo()
-
getInputs()
-
simNGames()
-
printSummary()
3.2 第一階段:程式總體框架及步驟
def main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
def printIntro():
"""介紹性內容,提高使用者體驗"""
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 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))
3.3 第二階段:步驟3 模擬N局比賽
def simNGames(n, probA, probB):
winsA, winsB = 0, 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
3.4 第三階段
根據分數判斷局的結束
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving = "B"
else:
if random() < probB:
scoreB += 1
else:
serving = "A"
return scoreA, scoreB
def gameOver(a,b):
return a==15 or b==15
四、"體育競技分析"舉一反三
4.1 理解自頂向下和自底向上
- 理解自頂向下的設計思維:分而治之
- 理解自底向上的執行思維:模組化整合
- 自頂向下是“系統”思維的簡化
4.2 應用問題的擴充套件
- 擴充套件比賽引數,增加對更多能力對比情況的判斷
- 擴充套件比賽設計,增加對真實比賽結果的預測
- 擴充套件分析邏輯,反向推理,用勝率推算能力?