預測羽毛球隊比賽成績
前提引入
計算思維是運用計算機科學的基礎概念進行問題求解、系統設計、以及人類行為理解等涵蓋計算機科學之廣度的一系列思維活動,由周以真於2006年3月首次提出。
模擬是用來解決現實世界問題的重要手段和技術。計算機可以通過模擬現實世界的運行過程提供一般情況下無法獲得的信息。下面我們就來實戰一下,用自頂向下的設計方法編寫出預測羽毛球隊比賽成績的程序。
使用計算機模擬解決問題的實例包括:天氣預測、飛機設計、電影特效、核試驗甚至軍事對抗等。如果不采用計算機模擬,這些應用則需要極其復雜的實施過程,往往代價巨大。即使很簡單的模擬也可以揭示一些困難問題的本質規律。
自頂向下的設計方法將復雜的大問題分解為相對簡單的小問題,找出每個問題的關鍵、重點所在,然后用精確的思維定性、定量地去描述問題。其核心本質是"分解"。
任務要求:
編寫程序,模擬體育競技分析
C.羽毛球比賽規則
>21分制,3局2勝為佳
>每球得分制
>每回合中,取勝的一方加1分
>當雙方均為20分時,領先對方2分的一方贏得該局比賽
>當雙方均為29分時,先取得30分的一方贏得該局比賽
>一局比賽的獲勝方在下一局率先發球
讓我們來看看程序的執行效果
那么,下面我們就來實戰一下,用自頂向下的設計方法編寫出預測羽毛球隊比賽成績的程序
步驟一:頂層設計,我們先來設計main函數
from random import *
#頂層設計
def main():
printIntroduce()#打印程序的介紹信息
probabilityA,probabilityB,n=getInputs()#通過getsInputs函數來獲取2個球員的能力值和比賽次數
winsA,winsB=simulateNGames(n,probabilityA,probabilityB)#通過simulateNGames()求得2個球員在n次比賽中獲勝的次數
printSummary(winsA,winsB)#通過printSummary()來輸出比賽的結果信息
步驟二:把main函數中的子函數逐一攻破
#第二階段
def printIntroduce():
print('這個程序模擬兩個選手A和B的羽毛球競技比賽')
print('程序運行需要A和B的能力值')
def getInputs():
a=eval(input('請輸入選手A的能力值(0~1):'))
b=eval(input('請輸入選手B的能力值(0~1):'))
n=eval(input('比賽勝利達到多少局獲勝:'))
return a,b,n
def simulateNGames(n,probabilityA,probabilityB):
'''定義球員A,B贏得比賽的次數,初始值為0,
通過for循環來模擬n次比賽
用simulateOneGame()來模擬一場比賽'''
winsA,winsB=0,0
while not judge(n,winsA,winsB):
'''返回本場比賽2個球員的得分,根據得分來確定本場比賽的勝負'''
scoreA,scoreB=simulateOneGame(probabilityA,probabilityB)
if scoreA>scoreB:
winsA+=1
else:
winsB+=1
return winsA,winsB
def printSummary(winsA,winsB):
n=winsA+winsB
print('\n比賽開始,共模擬%d場比賽'%n)
print('選手A獲勝{}場比賽,占比{:0.1%}'.format(winsA,winsA/n))
print('選手B獲勝{}場比賽,占比{:0.1%}'.format(winsB,winsB/n))
第三階段
#第三階段
def simulateOneGame(probabilityA,probabilityB):
'''每場比賽,2個球員的得分初始為0,設定每場比賽總是A先發球,
用random函數生成一個隨機小數,范圍在【0,1)內'''
scoreA,scoreB=0,0
starting='A'
while not gameOver(scoreA,scoreB):
if starting=='A':
if random()<probabilityA:
scoreA+=1
else:
scoreB+=1
starting='B'
else:
if random()<probabilityB:
scoreB+=1
else:
scoreB+=1
starting='A'
return scoreA,scoreB
def gameOver(a,b):
'''任意一方達到20分就結束比賽'''
if a>29 or b>29:
return True
elif a>20 or b>20:
if abs(a-b)>1:
return True
else:
return False
def judge(n,winsA,winsB):
if winsA==n or winsB==n:
return True
else:
return False
main()
心得:
每層設計中,參數和返回值如何設計是重點,其他細節部分可以暫時忽略。確定事件的重要特征而忽略其它細節過程稱為抽象
自頂向下設計的第二階段是實現或進一步抽象第2 層函數
下面我們使用pyinstaller庫來打包我們剛剛寫的程序
使用cmd安裝pyinstaller庫,效果如下:
接下來我們為了方便,把源文件放到daydayup12138的文件夾:
然后cmd執行 pyinstaller C:\daydayup12138\temp003.py即可
然后,我們就可以順藤摸瓜,找到我們打包后的應用程序文件