【python】羽毛球竞技模拟

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

体育竞技模拟分析,是个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文件。

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

时间: 2024-07-30 07:31:00

【python】羽毛球竞技模拟的相关文章

羽毛球竞技模拟

一.体育竞技模拟分析简要介绍 体育竞技模拟分析,是个IPO问题,大致过程如下: 输入:两个球员(球员A和B)的能力概率,模拟比赛的场次 处理:模拟比赛过程 输出:球员A和B分别赢得球赛的概率 二.程序设计方法 程序设计有自顶向下和自底向上两种方法,此处重点介绍自顶向下. 自顶向下的基本思想:以一个总问题出发,试图把它表达为很多小问题组成的解决方案,再用同样的技术依次攻破每个小问题,最终问题变得非常小,也就是化整为零.然后把所有的碎片组合起来,就可以得到一个程序. 自顶向下设计: 1.顶层设计 体

python get post模拟请求

1.使用get方式时,url类似如下格式: [html] view plaincopy index.jsp?id=100&op=bind GET报问头如下: [html] view plaincopy GET /sn/index.php?sn=123&n=asa HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content

Python实现网站模拟登陆

一.实验简介 1.1 基本介绍 本实验中我们将通过分析登陆流程并使用 Python 实现模拟登陆到一个实验提供的网站,在实验过程中将学习并实践 Python 的网络编程,Python 实现模拟登陆的方法,使用 Firefox 抓包分析插件分析网络数据包等知识. 模拟登录可以帮助用户自动化完成很多操作,在不同场合下有不同的用处,无论是自动化一些日常的繁琐操作还是用于爬虫都是一项很实用的技能.本课程通过 Firefox 和 Python 来实现,环境要求如下: Python 库:urllib, ur

Python使用mechanize模拟浏览器

Python使用mechanize模拟浏览器 之前我使用自带的urllib2模拟浏览器去进行訪问网页等操作,非常多站点都会出错误,还会返回乱码.之后使用了 mechanize模拟浏览器,这些情况都没出现过,真的非常好用.这里向大家推荐一下. mechanize是对urllib2的部分功能的替换,能够更好的模拟浏览器行为,在web訪问控制方面做得更全面. 首先从安装開始吧,以ubuntu系统为例: python 绝大部分第三方软件包.都是标准安装方式,从官网下载之后.解压到一个文件夹内,然后在这个

测试开发Python培训:模拟登录新浪微博-技术篇

测试开发Python培训:模拟登录新浪微博-技术篇 一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技术实现思路,提高动手能力.这里通过大家都能接触到的系统新浪微博,作为案例. 模拟登录功能比较简单,很多人在学习自动化的时候都会以登陆来作为自己的第一个学习案例,有点像开发语言中第一段代码都是helloworld!一样.登陆简单的模拟登录,直接发post请求就OK,很容易实现. 这里用新浪微博,就是技术实

Python _X __all__ 模拟 导入&#39;私有&#39;变量 及其注意点和实例

开头是下划线的变量(如_X): 在特定的情况下,可以吧下划线放在变量名的签名(如_X)可以防止客户端使用from *语句导入模块名时,把其中的那些变量名复制出去:但是下划线不是'私有'声明:仍可以使用其他导入形式看见并且修改这类变量例如使用import __all__(语句) 此外也可以在模块顶层把变量名的字符串列表赋值给变量__all__以达到类似_X命名惯例的隐藏效果:使用此功能,from*语句只会把列在__all__列表中的这些变量名复制出来 __all__是指出要复制的变量名,而_X时指

python用socket模拟post请求

今天用python的socket模拟了下post请求,通过这个实例可以更加了解python中socket的使用,以及http请求和socket的相互关系等知识. #coding=utf-8 import socket if __name__=="__main__": s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.xxxxx.com",80)) #pyhon 字符串很长时可以

Python 操作文件模拟SQL语句功能

Python操作文件模拟SQL语句功能 一.需求 当然此表你在文件存储时可以这样表示 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 1. 可进行模糊查询,语法至少支持下面3种: 1. select name,age from staff_table where age > 22 2. select * from staff_table where dept = "IT" 3. select * from

Python爬虫之模拟登录微信wechat

不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息,甚至可以根据需要来对它们进行有效的查看和管理.是的,没错,这完全可以.本篇博主将会给大家分享一下如何模拟登录网页版的微信,并展示模拟登录后获取的好友列表信息. 微信模拟登录的过程比较复杂,当然不管怎么样方法都是万变不离其宗,我们还是使用fiddler抓包工具来模拟登录的过程.好了,下面让我们一步一