模拟体育竞技

时间:2021-04-04 23:39:05

一、模拟排球体育竞技

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon May 13 16:37:13 2019
@author: AMAO
"""
#e15.1MatchAnalysis.py
from random import random
def printIntro():#打印程序的介绍性信息
    print("amao 12号程序模拟两个选手A和B的乒乓球竞技比赛")
    print("amao 12号程序运行需要A和B的能力值(以0到1之间的小数表示)")
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):#利用A,B的的能力值模拟一局比赛
    winsA,winsB=0,0
    for i in range(n):
        pingpangA,pingpangB=simOneGame(probA,probB)#simOneGame函数用于模拟每次打球得分
        if(pingpangA>pingpangB):#计数循环,记录每个成员赢了分
            winsA+=1
        else:
            winsB+=1
        if(winsA-winsB==2 and winsA>=10 and winsB>=10):
            break
        elif(winsB-winsA==2 and winsA>=10 and winsB>=10):
            break
        elif (winsA==11 and winsB<10 )or (winsB==11 and winsA<10):
            break
    return winsA,winsB
def simOneGame(probA,probB):#用于模拟一次打球
    pingpangA,pingpangB=0,0
    serving="A"#先由A发球
    if(serving=='A'):
        if random() < probA:#通过随机数和概率确定发球放是否赢得比分(random()<prob)
            pingpangA += 1#若A赢得比分,则发球权不变
        else:
            serving='B'#反之发球权给B
    else:
        if random() < probB:
            pingpangB += 1
        else:
            serving="A"
    return pingpangA,pingpangB
def WholeGame(n,probA,probB):#用于模拟一场完整的球赛
    c=eval(input("单人淘汰赛请输入1,团体或双人淘汰赛请输入2:"))#单人赛采取七局两胜制,团体或双人采取五局三胜制
    if c==1:
        I,J,G=0,0,7
        for i in range(G):
            print("第{}局比赛".format(i+1))#打印出每局比赛的结果
            winsA,winsB=simNGames(n,probA,probB)
            printsummary(winsA,winsB)
            if winsA>winsB:
                I+=1
            elif winsA<winsB:
                J+=1
            if (I==4 and J<4) or(J==4 and I<4):
                break
        print("最终结果如下:")#打印最终结果
        print("选手A总共获胜{}局比赛,占比{:0.1%}".format(I,I/G))
        print("选手B总共获胜{}局比赛,占比{:0.1%}".format(J,J/G))
    if c==2:
        I,J,G=0,0,5
        for i in range(G):
            print("第{}局比赛:".format(i+1))#打印每局比赛结果
            winsA,winsB=simNGames(n,probA,probB)
            printsummary(winsA,winsB)
            if winsA>winsB:
                I+=1
            elif winsA<winsB:
                J+=1
            if (I==3 and J<3) or(J==3 and I<3):
                break
        print("最终结果如下:")#打印最终比赛结果
        print("团队A总共获胜{}局比赛,占比{:0.1%}".format(I,I/G))
        print("团队B总共获胜{}局比赛,占比{:0.1%}".format(J,J/G))
                  
def printsummary(winsA,winsB):#输出A,B获胜的比赛局次及概率
    n=winsA+winsB
    print("竞技分析开始,共比赛{}次".format(n))
    print("A得分为{},占比{:0.1%}".format(winsA,winsA/n))
    print("B得分为{},占比{:0.1%}\n".format(winsB,winsB/n))
def main():
    printIntro()
    probA,probB,n = getInputs()
    WholeGame(n,probA,probB)
main()

运行结果如下:

 

模拟体育竞技

二、程序打包

打包成功生成exe文件

模拟体育竞技