编程语言
首页 > 编程语言> > python-体育(羽毛球)竞技模拟

python-体育(羽毛球)竞技模拟

作者:互联网

体育竞技分析

一、程序总体框架及步骤:

步骤1:打印程序的介绍性信息

步骤2:获得程序运行参数:probA,probB,n

步骤3:利用球员A和B的能力值,模拟n局比赛

步骤4:输出球员A和B获得比赛的场次和概率

框架表示:

 

二、程序设计(自顶向下):

代码简单介绍:

函数名称 函数说明
printInfo() 打印程序的介绍信息
getInputs() 获得用户输入的参数
printResult(n, winsA, winsB) 输出模拟比赛的结果
simNGames(n, probA, probB) 模拟n场比赛
simOneGame(probA, probB) 模拟一场比赛,包括五局,采取五局三胜制
simAGame(N, probA, probB) 模拟一局比赛
GameOver(N, scoreA, scoreB) 定义一局比赛的结束条件

具体函数代码:

顶层设计:

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

步骤一:printIntro()函数

def printInfo():
    print("这个程序模拟两个选手A和B的体育竞技比赛")
    print("程序需要两个选手的能力值0-1") 
    print("规则:")
    print("作者: 学号:")

步骤二:getInputs()函数

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

步骤三:simNGames()函数

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

步骤四:printSummary()函数

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))

三、羽毛球竞技程序设计实例:

比赛规则·

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

#体育竞技
from random import random
def main(): printInfo() probA,probB,m,n = getInput() winsA,winsB = simNGames(m,n,probA,probB) printSummary(winsA,winsB) main()

def printInfo(): print("这个程序模拟两个选手A和B的羽毛球竞技比赛") print("程序需要两个选手的能力值0-1") print("规则:三局两胜--21分制") print("作者:阮满欢 学号:470.67") 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

运行结果:

 

 三、程序打包

使用pyinstaller打包,把Python脚本打包成可执行的文件。即把.py文件打包成.exe文件,则可以直接运行结果。

1.首先要安装pyinstaller库

在cmd中输入下面一句代码:

pip install  pyinstaller

2.使用pyinstaller时;在上述代码的main函数的最后加上 input() 语句,防止程序一运行完就自动退出。

 

四、篮球比赛模拟实例

赛事规则:

1.1 篮球比赛

篮球比赛由两个队参加,每队出场5名队员。每队目标是在对方球篮得分,并阻止对方队在本方球篮得分。

篮球比赛由裁判员、记录台人员和技术代表(如到场)管理。

1.2 球篮:本方/对方

被某队进攻的球篮是对方的球篮,由某队防守的球篮是本方的球篮。

1.3 比赛的胜者

在比赛时间结束时得分较多的队,将是比赛的胜者。

 

# -*- coding: utf-8 -*-
"""
Created on Mon May 13 19:46:23 2019

@author: 18 EliO FanG
"""
from math import fabs
from random import random
def printIntro():
    '''
    function: 打印程序的介绍信息
    '''
    print("模拟篮球比赛的代码分析")
    print("这个程序模拟两支队伍A和B的篮球比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
    print("作者:阮满欢 47")
def getInputs():
    a = eval(input("请输入A队的能力值(0-1): "))
    b = eval(input("请输入B队的能力值(0-1): "))
    n = eval(input("模拟比赛的场次: "))
    return a, b, n
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB
def gameOver(a,b):
    return a>b or b>a
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 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 main():
    printIntro()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)
main()

运行结果:

 

四、篮球晋级赛模拟

import random
def bsxx():#比赛信息输出
    string1="模拟体育竞技分析     模拟人:xiayiLL"
    string2="模拟篮球竞技分析"
    string3="篮球比赛规则如下:"
    string4="篮球比赛由两个队参加,每队出场5名队员。每队目标是在对方球篮得分,并阻止对方队在本方球篮得分。"
    string5="比赛采用4节制,得分最多的队伍获胜。"
    string6="若比赛结束,比分仍然相同,则进入加时赛"
    string7="加时赛规则如下:"
    string8="加时赛分为5分钟一场,球权由跳球决定,在时限内比分高的一方获胜,若时限内还未分出胜负,则继续进行加时赛,球权由第一次加时赛未获球权方拥有,如此往返,直至分出胜负为止。"
    print(string1)
    print()
    print(string2)
    print(string3)
    print(string4)
    print(string5)
    print(string6)
    print(string7)
    print(string8)
    print()

def getinput():#获取数据
    print("为了更好的模拟比赛数据,请输入两支队伍的运动员的能力值(0-1之间)")
    print("请输入第一支队伍的各位运动员能力值")
    A1=eval(input("请输入第一位运动员的综合能力值:"))
    A2=eval(input("请输入第二位运动员的综合能力值:"))
    A3=eval(input("请输入第三位运动员的综合能力值:"))
    A4=eval(input("请输入第四位运动员的综合能力值:"))
    A5=eval(input("请输入第五位运动员的综合能力值:"))
    print("请输入第二支队伍的各位运动员能力值")
    B1=eval(input("请输入第一位运动员的综合能力值:"))
    B2=eval(input("请输入第二位运动员的综合能力值:"))
    B3=eval(input("请输入第三位运动员的综合能力值:"))
    B4=eval(input("请输入第四位运动员的综合能力值:"))
    B5=eval(input("请输入第五位运动员的综合能力值:"))
    n=eval(input("请输入模拟的次数:"))
    return A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n

def onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5):#一节比赛的得分
    scoreA,scoreB=0,0
    list1=(2,3)
    for k in range(5):#设每个人在一节中能有5次投篮的机会
        if random.random()<=A1:
            scoreA+=random.choice(list1)#投中2分球或者3分球的几率是随机的
        if random.random()<=A2:
            scoreA+=random.choice(list1)
        if random.random()<=A3:
            scoreA+=random.choice(list1)
        if random.random()<=A4:
            scoreA+=random.choice(list1)
        if random.random()<=A5:
            scoreA+=random.choice(list1)
        if random.random()<=B1:
            scoreB+=random.choice(list1)
        if random.random()<=B2:
            scoreB+=random.choice(list1)
        if random.random()<=B3:
            scoreB+=random.choice(list1)
        if random.random()<=B4:
            scoreB+=random.choice(list1)
        if random.random()<=B5:
            scoreB+=random.choice(list1)
    return scoreA,scoreB

def onegame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5):#一场比赛的总得分
    sA1,sB1=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
    sA2,sB2=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
    sA3,sB3=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
    sA4,sB4=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
    scoreA=sA1+sA2+sA3+sA4
    scoreB=sB1+sB2+sB3+sB4
    return scoreA,scoreB

def allgame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n):#模拟所有场次比赛
    teamA,teamB,p=0,0,0
    for i in range(n):
        scoreA,scoreB=onegame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
        if scoreA>scoreB:
            teamA+=1
        elif scoreA<scoreB:
            teamB+=1
        else:
            t1,t2=overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
            teamA+=t1
            teamB+=t2
    return teamA,teamB

def overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5):#设加时赛中,每人能投2次球
    scoreA,scoreB,t1,t2,p1,p2=0,0,0,0,0,0
    list1=(2,3)
    for k in range(2):
        if random.random()<=A1:
            scoreA+=random.choice(list1)
        if random.random()<=A2:
            scoreA+=random.choice(list1)
        if random.random()<=A3:
            scoreA+=random.choice(list1)
        if random.random()<=A4:
            scoreA+=random.choice(list1)
        if random.random()<=A5:
            scoreA+=random.choice(list1)
        if random.random()<=B1:
            scoreB+=random.choice(list1)
        if random.random()<=B2:
            scoreB+=random.choice(list1)
        if random.random()<=B3:
            scoreB+=random.choice(list1)
        if random.random()<=B4:
            scoreB+=random.choice(list1)
        if random.random()<=B5:
            scoreB+=random.choice(list1)
    if scoreA>scoreB:
        t1+=1
    elif scoreA<scoreB:
        t2+=1
    else:
        t1,t2=overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
    return t1,t2

def alysis(n,teamA,teamB):
    print("模拟竞赛分析开始,共模拟{}场比赛".format(n))
    print("团队A获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100))
    print("团队B获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100))
    print("分析完毕")
    print()

def alysis1(n,teamA,teamB):
    print("模拟竞赛分析开始,共模拟{}场比赛".format(n))
    print("团队C获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100))
    print("团队D获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100))
    print("分析完毕")
    print()

def alysis2(n,teamA,teamB):
    print("模拟竞赛分析开始,共模拟{}场比赛".format(n))
    print("决赛队伍1获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100))
    print("决赛队伍2获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100))
    print("分析完毕")
    print()
def main():
    x=1
    bsxx()
    while x==1:
        print("开始模拟请按1     结束程序请按2")
        i=eval(input())
        if i==1:
            x1=x2=x3=x4=0
            print("队伍A:队伍B")
            A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n=getinput()
            teamA,teamB=allgame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n)
            alysis(n,teamA,teamB)
            print("队伍C:队伍D")
            C1,C2,C3,C4,C5,D1,D2,D3,D4,D5,m=getinput()
            teamC,teamD=allgame(C1,C2,C3,C4,C5,D1,D2,D3,D4,D5,m)
            alysis1(m,teamC,teamD)
            if teamA>teamB:
                print("队伍A晋级")
                m1,m2,m3,m4,m5=A1,A2,A3,A4,A5
                x1=1
            else:
                print("队伍B晋级")
                m1,m2,m3,m4,m5=B1,B2,B3,B4,B5
                x2=1
            if teamC>teamD:
                print("队伍C晋级")
                n1,n2,n3,n4,n5=C1,C2,C3,C4,C5
                x3=1
            else:
                print("队伍D晋级")
                n1,n2,n3,n4,n5=D1,D2,D3,D4,D5
                x4=1
            num1,num2=allgame(m1,m2,m3,m4,m5,n1,n2,n3,n4,n5,1000)
            alysis2(1000,num1,num2)
            if num1>num2:
                if x1==1:
                    print("队伍A取得胜利")
                elif x2==1:
                    print("队伍B取得胜利")
            else:
                if x3==1:
                    print("队伍C取得胜利")
                elif x4==1:
                    print("队伍D取得胜利")
                print()
        elif i==2:
            break
        else:
            print("输入错误,请重试")

main()

 

标签:winsB,winsA,羽毛球,python,print,eval,竞技,input,def
来源: https://www.cnblogs.com/ruanmh/p/12749085.html