体育赛事分析

排球赛事分析

(1)分析N场比赛

(2)思维方式:自顶向下即将一个复杂问题分解成几个问题,再细分成一个个具体的小问题,从而来解决复杂问题。自底向上为自顶向下的逆过程,即解决复杂问题的方法,逐步解决一个个小问题,来达成目的。

(3)赛制规定:前四局采用25分制,每个队只有赢得至少25分,并超过对方2分时,才胜1局

                           正式比赛采用五局三胜制,决赛局比赛采用15分制

                           每球得分制

1.将体育竞技分析分解为以下几个小步骤

1.1打印程序的介绍性信息式
1.2获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次)
1.3利用球队AB的能力值,模拟n场比赛
1.4输出球队AB获胜的场次及概率

2.将各个步骤定义成函数来实现

12115116-dbd74c54244ab9ad.png

完整代码

from random import random

def printIntro():
    print("46号")
    print("这个程序模拟两个球队A和B的排球竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
    print("{:*^70}".format("模拟开始"))
    
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("{:*^70}".format("模拟结束"))
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))

def GameOver(N,scoreA,scoreB):
    if N <= 4:
        return (scoreA>=25 and scoreB>=25 and abs(scoreA-scoreB)>=2)
    else:
        return (scoreA>=15 and abs(scoreA-scoreB)>=2) or (scoreB>=15 and abs(scoreA-scoreB)>=2)

def simAGame(N,probA,probB):
    scoreA,scoreB=0,0
    serving="A"
    while not GameOver(N,scoreA,scoreB):
        if serving=="A":
            if random() > probA:
                scoreB+=1
                serving="B"
            else:
                scoreA+=1
        else:
            if random() > probB:
                scoreA+=1
                serving="A"
            else:
                scoreB+=1
    return scoreA,scoreB
     
def simOneGame(probA,probB):
    winA,winB=0,0
    for N in range(5):
        scoreA,scoreB=simAGame(N,probA,probB)
        if scoreA > scoreB:
            winA+=1
        else:
            winB+=1
        if winA==3 or winB==3:
            break
    return winA,winB

def simNGames(n,probA,probB):
    winsA,winsB=0,0
    for i in range(n):
        winA,winB=simOneGame(probA,probB)
        if winA > winB:
            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()

猜你喜欢

转载自www.cnblogs.com/yangsenhan/p/12747654.html