預測羽毛球隊比賽成績python
前提引入 dom
計算思惟是運用計算機科學的基礎概念進行問題求解、系統設計、以及人類行爲理解等涵蓋計算機科學之廣度的一系列思惟活動,由周以真於2006年3月首次提出。函數
模擬是用來解決現實世界問題的重要手段和技術。計算機能夠經過模擬現實世界的運行過程提供通常狀況下沒法得到的信息。下面咱們就來實戰一下,用自頂向下的設計方法編寫出預測羽毛球隊比賽成績的程序。spa
使用計算機模擬解決問題的實例包括:天氣預測、飛機設計、電影特效、核試驗甚至軍事對抗等。若是不採用計算機模擬,這些應用則須要極其複雜的實施過程,每每代價巨大。即便很簡單的模擬也能夠揭示一些困難問題的本質規律。設計
自頂向下的設計方法將複雜的大問題分解爲相對簡單的小問題,找出每一個問題的關鍵、重點所在,而後用精確的思惟定性、定量地去描述問題。其核心本質是"分解"。orm
任務要求: blog
編寫程序,模擬體育競技分析 事件
C.羽毛球比賽規則 get
>21分制,3局2勝爲佳 input
>每球得分制
>每回閤中,取勝的一方加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便可
而後,咱們就能夠順藤摸瓜,找到咱們打包後的應用程序文件