体育竞技模拟(兵兵球)
比赛规则
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()