体育竞技分析

程序总体框架及步骤
①打印程序的介绍性信息式
②获得程序运行参数:proA,proB,n
③利用球员A和B的能力值,模拟n场比赛
④输出球员A和B获胜比赛的场次及概率
四个步骤对应四个函数
printInfo()
getInputs()
simNGames()
printSummary

#介绍性内容,提高用户体验

from random import random
def printIntro():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要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 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))

#一方率先达到15分,比赛结束,返回True/False

def gameOver(a,b):
    return a==15 or b==15

# 定义simOneGame()函数获得选手能力值,返回一局比赛分数

def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"  # 当前A为发球方
    while not gameOver(scoreA, scoreB):  # 在判断条件中,只要当前的比赛不结束,选手就要进行一定的相关操作。即比赛不结束的情况下进行循环体操作
        if serving == "A":
            if random() < probA:  # random()生成的随机变量在A的能力范围之内
                scoreA += 1
            else:  # 超过A的能力范围则发球方换为B
                serving = "B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB

# 模拟N局比赛,一场比赛模拟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 main():
    printIntro()
    probA,probB,n=getInputs()
    winsA,winsB=simNGames(n,probA,probB)
    printSummary(winsA,winsB)
main()

你可能感兴趣的:(体育竞技分析)