码迷,mamicode.com
首页 > 编程语言 > 详细

【python】羽毛球竞技模拟

时间:2019-05-20 23:00:24      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:问题   核心   pytho   alt   python   作者   install   nsa   ret   

一、体育竞技模拟分析简要介绍

体育竞技模拟分析,是个IPO问题,大致过程如下:

输入:两个球员(球员A和B)的能力概率,模拟比赛的场次

处理:模拟比赛过程

输出:球员A和B分别赢得球赛的概率

二、程序设计方法

程序设计有自顶向下和自底向上两种方法,此处重点介绍自顶向下。

自顶向下的基本思想:以一个总问题出发,试图把它表达为很多小问题组成的解决方案,再用同样的技术依次攻破每个小问题,最终问题变得非常小,也就是化整为零。然后把所有的碎片组合起来,就可以得到一个程序。

自顶向下设计:

1.顶层设计

体育竞技分析从用户处得到模拟参数,最后输出结果,以下是一个基础设计的4个步骤。

步骤一:打印程序的介绍性信息。  printIntro()函数

def main():
    printIntro() 

 

 

步骤二:获得程序运行需要的参数,即probA、porbB、n。   getInputs()函数 

def main():
    printIntro()
    probA,probB,n=getInputs()

 

  

 

步骤三:利用球员A和B的能力值probA和probB,模拟n次比赛。(核心函数)  simNGames()函数

 

def main():
    printIntro()
    probA,probB,n=getInputs()
    winA,winB=simNGames(n,probA,probB)

 

  

 

步骤四:输出球员A和B获得比赛的场次及概率。   printSummary()函数

 

def main():
    printIntro()
    probA,probB,n=getInputs()
    winA,winB=simNGames(n,probA,probB)
    printSummary(winsA,winsB)

 

2.第n层设计

(1)simNGames()函数是整个函数的核心,其基本思路是模拟n场比赛,并跟踪记录每个球员赢得了多少比赛。

def simNGames(n,probA,porbB):
    winsA,winsB=0,0
    for i in range(n):
        scoreA,scoreB=simOneGame(porbA,porbB)
        if scoreA>scoreB:
            winsA+=1
        else:
            winsB+=1
            reture winsA,winsB

代码中设计了sinOneGame()函数,用于模拟一场比赛,这个函数需要知道每个球员的概率,返回两个球员的最终得分 

(2)接下来实现simOneGame()函数。模拟一场比赛,需要根据比赛规则来编写代码。

以下是羽毛球的比赛规则:

1. 21 分制,3局2胜为佳
2. 每球得分制
3. 每回合中,取胜的一方加 1 分
4. 当双方均为 20 分时,领先对方 2 分的一方赢得该局比赛
5. 当双方均为 29 分时,先取得 30 分的一方赢得该局比赛
6. 一局比赛的获胜方在下一局率先发球

 

def simOneGame(probA,porbB):
    scoreA,score=0,0
    serving="A"
    while not gameOver(scoreA,scoreB):
        if serving =="A":
            if random()<porbA:
                scoreA+=1
            else:
                serving="B"
        else:
            if random()<probB:
                scoreB+=1
            else:
                serving="A"
    return scoreA,scoreB

 

3.整个程序如下:

#体育竞技
from random import random
def printInfo():
    print("这个程序模拟两个选手A和B的羽毛球竞技比赛")
    print("程序需要两个选手的能力值0-1") 
    print("规则:三局两胜--21分制")
    print("作者:17杨宇平")

def getInput():
    a = eval(input("请输入选手A的能力值(0-1):"))

    b = eval(input("请输入选手B的能力值(0-1):"))

    m=eval(input("比赛的局数:"))

    n = eval(input("模拟比赛的场次:"))
    return a,b,m,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))


def simNGames(m,n,probA,probB):

    winsA,winsB = 0,0
    wa,wb=0,0

    for i in range(n):
        for i in range(m):

            scoreA,scoreB = simOneGame(probA,probB)

            if scoreA > scoreB:
                 wa += 1
            else:
                wb += 1

            if wa==2:
                winsA+=1
                wa,wb=0,0
                break
            if wb==2:
                winsB+=1
                wa,wb=0,0
                break
 

    return winsA,winsB
        
    
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):
    if(a>=20 or b>=20):
        if(abs(a-b)==2 and a<=29 and b<=29):
            return True
        else:
            return a==30 or b==30
    else:
        return False
    
def main():
    printInfo()
    probA,probB,m,n = getInput()
    winsA,winsB = simNGames(m,n,probA,probB)
    printSummary(winsA,winsB)
 
main()

  运行结果:

 

技术图片

三、程序打包

使用pyinstaller打包,把Python脚本打包成可执行的文件。即把.py文件打包成.exe文件。

 

【python】羽毛球竞技模拟

标签:问题   核心   pytho   alt   python   作者   install   nsa   ret   

原文地址:https://www.cnblogs.com/yyp-20190107/p/10893190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!