模拟体育竞技分析之排球赛制(已补充)
查看代码
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()
测试结果如下:

浙公网安备 33010602011771号