比赛模拟
# -*- encoding:utf-8 -*-
'''
模拟排球竞技
@author: bpf
'''
# 比赛规则:
# 1. 采用5局3胜制
# 2. 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局
# 3. 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜
from random import random
from time import time
def printInfo(): # 打印程序介绍信息
print('模拟体育竟技分析--排球比赛规则--25号')
print('这个程序模拟两个队伍A和B的某种竞技比赛')
print('程序运行需要A和B的能力值(以0到1之间的小数表示)')
def getInputs(): #获得用户输入的参数
probA = eval(input("请输入队伍A的能力值(0~1):"))
probB = eval(input("请输入队伍B的能力值(0~1):"))
n = eval(input("请输入需要模拟比赛的场次数:"))
return probA, probB, n
def simNGames(n, probA, probB):
winsA, winsB = 0, 0
for _ in range(n):
winA, winB = simOneGame(probA, probB)
if winA > winB:
winsA += 1
else:
winsB += 1
return winsA, winsB
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 simAGame(N, probA, probB):
scoreA, scoreB = 0, 0 # 分别为队伍A和B一局比赛获得的分数
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 GameOver(N, scoreA, scoreB):
if N <= 4:
return (scoreA>=25 and abs(scoreA-scoreB)>=2) or (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 printResult(n, winsA, winsB): #比赛结果
print("{:*^70}".format("模拟结束"))
print("竞技分析开始,共模拟{}场比赛。".format(n))
print(">>>队伍A获胜{}场比赛,占比{:.2f}".format(winsA,winsA/n))
print(">>>队伍B获胜{}场比赛,占比{:.2f}".format(winsB,winsB/n))
if __name__ == "__main__":
printInfo()
probA, probB, n = getInputs()
Time = time()
winsA, winsB = simNGames(n, probA, probB)
print("模拟用时: {:.1f}s".format(time()-Time))
printResult(n, winsA, winsB)


浙公网安备 33010602011771号