模拟体育竞技分析之排球赛制(已补充)

查看代码
import random
import sys
from collections import defaultdict

#代码介绍
def printIntro():
    print("排球比赛模拟程序,作者:2024310143115")
    print("赛制规定:-前4局比赛采用25分制,每个队只有赢得至少25分,并同时超过对方2分时 ,才胜1局。")
    print("-正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按原位置顺序继续比赛到结束")
    print("-在决胜局(第五局)之比赛,先获15分并领先对方2分为胜。")
    print("程序运行需要A和B的能力值(用0-1之间的小数表示)")

#获取数值
def getInputs():
    a = eval(input("请输入选手A的能力值:"))
    b = eval(input("请输入选手B的能力值:"))
    n = eval(input("模拟比赛的场次:"))
    return a, b, n 

#模拟1局比赛
def simOneGame(probA, probB, fifth_set=False): 
    scoreA, scoreB = 0, 0
    serving = random.choice(['A', 'B']) #随机决定发球方
 
    if fifth_set:
        target = 15
    else:
        target = 25

    while True: #模拟一个球的胜负
        if random.random() < (probA / (probA + probB)):
            winner = 'A'
        else:
            winner = 'B'
        #得分规则
        if winner == serving: 
            #发球方得分
            if winner == 'A':
                scoreA += 1
            else:
                scoreB += 1
        else:
            #接球方得分,同时获得发球权
            serving = winner
            if winner == 'A':
                scoreA += 1
            else:
                scoreB += 1
        
        #检查是否达到目标分数并领先2分
        if not fifth_set: #前4局
            if (scoreA >= target) and (scoreA - scoreB >= 2):
                return 'A'
            if (scoreB >= target) and (scoreB - scoreA >= 2):
                return 'B'
        else: #第5局
            if (scoreA >= target) and (scoreA - scoreB >= 2):
                return 'A'
            if (scoreB >= target) and (scoreB - scoreA >= 2):
                return 'B' 
            #第5局8分交换场地
            if (scoreA + scoreB) == 8:
                pass #于分数无影响

#模拟一场比赛(5局3胜)
def sim_oneGame(probA, probB):
    winsA, winsB = 0, 0
    for num in range(1, 6):
        fifth_set = (num == 5)
        winner = simOneGame(probA, probB, fifth_set=False)
        if winner == 'A':
            winsA += 1
        else:
            winsB += 1
        
        #检查是否分出胜负
        if winsA == 3 or winsB ==3:
            break
    
    return 'A' if winsA > winsB else 'B'

#模拟n场比赛
def simNGames(probA, probB, n):
    winsA, winsB = 0, 0
    result = defaultdict(int) #记录比赛结果分布
    for _ in range(n):
        winner = sim_oneGame(probA, probB)
        if winner == 'A':
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB

#打印模拟结果
def printSummary(winsA, winsB, n):
    print("模拟结果:")
    print("比赛总场次:".format(n))
    print(f"选手A获胜{winsA}场比赛,占比{winsA/n}%")
    print(f"选手B获胜{winsB}场比赛,占比{winsB/n}%")

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

if __name__ == '__main__':
    main()

测试结果如下:

 

posted @ 2025-06-23 13:57  与尔5  阅读(18)  评论(0)    收藏  举报