体育竞技模拟(兵兵球)

比赛规则

1. 一场比赛: 单打:采用七局四胜制

双打淘汰赛、团体赛:采用五局三胜制2. 一局比赛: 先得11分为胜,10平后,多得2分为胜

3. 一局比赛: 每队发球2次后,接发球方即成为发球方,依此类推,直至该局比赛结束或者到双方比分都达到10分或实行轮换发球法时,发球和接发次序仍然不变,但每人只轮发一分球

# coding: utf-8

from random import random

from math import fabs

def printIntro():

print("这个程序模拟两个选手A和B的某种竞技比赛")

print("程序运行需要A和B的能力值(以0到1之间的小数表示)")

print()

def getInputs():

a = eval(input("请输入选手A的能力值(0-1):"))

b = eval(input("请输入选手B的能力值(0-1):"))

n = eval(input("模拟比赛的场次:"))

print()

return a, b, n

def printSummary(winsA,winsB):

n = winsA + winsB

print("竞技分析开始,共模拟{}场比赛".format(n))

print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))

print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))

def gameOver(a,b):

if fabs(a-b) > 2 and a > 9 and b > 9:

return True

if a == 11 and b < 10:

return True

if b == 11 and a < 10:

return True

def simOneGame(proA,proB):

scoreA, scoreB = 0, 0

serving = "A"

while not gameOver(scoreA,scoreB):

if serving == "A":

if random() < proA:

scoreA += 1

else:

serving = "B"

else:

if random() < proB:

scoreB += 1

else:

serving = "A"

return scoreA, scoreB

def simNGames(n,proA,proB):

winsA, winsB = 0, 0

for i in range(n):

scoreA, scoreB = simOneGame(proA,proB)

if scoreA > scoreB:

winsA += 1

else:

winsB += 1

return winsA, winsB

def main():

printIntro()

proA, proB, n = getInputs()

winsA, winsB = simNGames(n,proA,proB)

printSummary(winsA,winsB)

main()