本文嘗試採用自頂向下的設計方法進行體育競技分析。
基本規則:
兩個球員,交替用球拍擊球。一方首先具有發球權,雙方連續擊打,球落地則該回合結束。
如果輸掉這一回合的是發球方,雙方均不加分,但發球權要交給另一方。如果發球方贏得了這一回合,則發球方贏得1
分,並繼續擁有發球權。
首先到達15
分的一方贏得本局比賽,比賽總共進行
n 局。
使用python3
編寫程式,模擬比賽過程,統計在
n 局比賽中
2個球員各自贏了幾局比賽並計算獲勝的概率。。。
體育競技分析的ipo
模式:
輸入i(input)
:兩個球員的能力值,模擬比賽的次數(其中,運動員的能力值,可以通過發球方贏得本回合的概率來表示,
乙個能力值為
0.8的球員,在他發球時,有
80%的可能性贏得1分)
處理p(process)
:模擬比賽過程
輸出o(output)
:兩個球員獲勝的概率
該體育競技程式,我們採用自頂向下的設計方法。
自頂向下的設計是一種解決複雜問題的行之有效的方法。其步驟如下:
自頂向下設計的基本思想,如下圖:
python3的源**如下:
#體育競技分析程式
#頂層設計(第一階段)
from random import *
def main():
printintroduce()#列印程式的介紹資訊
#通過getinputs()來獲取
# 2個球員的能力值(每場比賽中每一回合獲勝的可能性)和比賽次數
probabilitya,probabilityb,n=getinputs()
#通過simulatengames()求得2個球員在n次比賽中獲勝的次數
winsa,winsb=simulatengames(n,probabilitya,probabilityb)
#通過printsummary()來輸出比賽的結果資訊
printsummary(winsa,winsb)
#第二階段
def printintroduce():
print('this program simulates a game between two players,a and b')
print('probability (a number between 0 and 1) is used!')
def getinputs():
a=eval(input('what is the probability of player a wins?'))
b=eval(input('what is the probability of player b wins?'))
n=eval(input('how many games to simulate?'))
return a,b,n
def simulatengames(n,probabilitya,probabilityb):
#定義球員a,b贏得比賽的次數,初始值為0
winsa=0
winsb=0
#通過for迴圈來模擬n場比賽
for i in range(n):
#simulateonegame()用來模擬一場比賽
#輸入為球員的能力值,即每場比賽中每一回合獲勝的可能性
#返回的是本場比賽2個球員的得分
#根據返回的得分來確定本場比賽的勝負
scorea,scoreb=simulateonegame(probabilitya,probabilityb)
if scorea>scoreb:
winsa+=1
else:
winsb=winsb+1
return winsa,winsb
def printsummary(winsa,winsb):
n=winsa+winsb
print('\ngames simulated:%d' % n)
print('wins for a:()'.format(winsa,winsa/n))
print('wins for b:()'.format(winsb,winsb/n))
#第三階段
def simulateonegame(probabilitya,probabilityb):
#每場比賽,2個球員的得分初始為0
scorea=0
scoreb=0
#本場比賽誰先發球(設定每場比賽總是球員a先發球)
starting='a'
while not gameover(scorea,scoreb):
if starting=='a':
#random()函式用來生成乙個隨機小數,範圍在區間 [0,1)內
if random()
執行程式2
次,第一次結果如下:
上圖說明,2
個球員的能力值相差很大時,比賽結果呈現出壓倒性趨勢,與現實中的實際比賽相符。
第二次結果如下:
生活中有這樣一種現象,2
個球員,儘管能力上只有很小的差距,但是能力稍差的球員經常被能力稍強的球員擊敗。
上**釋了這種現象,儘管能力差別小,但能力值稍小的球員,大概需要進行3
局比賽,才能贏一局,可見,他贏得一場3局或
5局的比賽可能性很小。。。
(完)
python自頂向下的設計方法進行體育競技分析
1自頂向下的設計方法 以乙個總問題開始,試圖把它表達為很多小問題組成的解決方案。再用同樣的技術依次攻破每個小問題,最終問題變得非常小,以至於可以很容易解決。然後只需把所有的碎片組合起來,就可以得到乙個程式。頂層設計 自頂向下設計中最重要的是頂層設計。以體育競技分析為例,可以從問題的ipo描述開始。大...
伸展樹 (自頂向下的設計)
伸展樹的設計有兩種設計模式,第一種 自低向上的設計方式,第二種 設計方式 自頂向下的設計方式,對於由低向上的設計,每乙個結點樹保留指向其父結點的的額外的結點,第二種方式由sedgewick 大神的 演算法 一書感謝這一 位大神。伸展樹又叫自適應查詢樹,實質上二叉搜尋樹的的變形,允許各種型別的二叉樹操...
「自頂向下 逐步求精」的設計方法
自頂向下的設計方法是一種程式開發技術,其中問題被分解為更容易處理的子問題,這些子問題的解決方案組合起來構成整體問題的解決方案。首先要理解問題,列出必須處理的資訊。這些資訊可能是問題中的資料。明確採用什麼樣的解決方案。如果是報表,明確要採用的格式。列出你對問題或資訊的假設。思考如何手動地解決這個問題,...