模拟体育竞技分析

# 比赛规则:
# 1. 采用5局3胜制
# 2. 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局
# 3. 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜

from random import random
def getInputs():
#获得用户输入的参数
    a = eval(input("请输入队伍A的能力值(0->1):"))
    b = eval(input("请输入队伍B的能力值(0->1):"))
    n = eval(input("请输入比赛次数:"))
    return a, b, n

def NGames(n, probA, probB):
#模拟n场比赛
    winA, winB = 0, 0
    for _ in range(n):
        scoreA, scoreB = OneGame(probA, probB)
        if scoreA > scoreB:
            winA += 1
        else:
            winB += 1
    return winA, winB

def OneGame(probA, probB):
#模拟一场比赛,包括五局
    scoreA, scoreB, N = 0, 0, 0
    serving = 'A'
    while not GameOver(N, scoreA, scoreB):
        if serving == 'A':
            if random() > probA:
                scoreB += 1
                serving = 'B'
            else:
                scoreA += 1
        if serving == 'B':
            if random() > probB:
                scoreA += 1
                serving = 'A'
            else:
                scoreB += 1
        N += 1
        return scoreA, scoreB

def GameOver(N, a, b):
#定义赢得一局的条件
#N: 当前局次(第五局为决胜局)
    if N <= 4:
        return (a>=25 and b>=25 and abs(a-b)>=2)
    else:
        return (a>=15 and b>=15 and abs(a-b)>=2)

def printResult(n, winA, winB):
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("队伍A获胜{}场比赛,占比{:0.1%}".format(winA,winA/n))
    print("队伍B获胜{}场比赛,占比{:0.1%}".format(winB,winB/n))

if __name__ == "__main__":
    probA, probB, n = getInputs()
    winA, winB = NGames(n, probA, probB)
    printResult(n, winA, winB)

 

posted @ 2020-11-22 00:12  英魂  阅读(134)  评论(0)    收藏  举报