羽毛球比賽

1.將羽毛球比賽分析分解爲如下幾個小步驟dom

1.1打印程序的介紹性信息式
1.2得到程序運行參數:A(A的能力值),B(B的能力值),n(比賽場次)
1.3利用球員AB的能力值,模擬n場比賽
1.4輸出球員AB獲勝的場次及機率函數

2.將各個步驟定義成函數來實現:spa

    代碼以下:設計

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.

author@foldline 學號:2018310143029
"""

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()來輸出比賽的結果信息
    
#第二階段
def printIntroduce():
    print('學號:2018310143029')
    print('這個程序模擬兩個選手A和B的羽毛球競技比賽')
    print('程序運行須要A和B的能力值')
    
def getInputs():
    a=eval(input('請輸入選手A的能力值(0~1):'))
    b=eval(input('請輸入選手A的能力值(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()

3.運行結果如圖:3d

3.1.能力值高:code

3.2.能力值低:orm

4.用pyinstaller打包可執行文件:blog

相關文章
相關標籤/搜索