'''
1.自顶向下:不断细化分解问题的方法
2.自底向上:不断组合基础方法形成系统
计算思维:抽象 自动化
计算生态:以开源项目为组织形式,充分利用“共识原则”和“社会利他”组织人员,在竞争发展、
相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径。
Python计算生态:>15万个第三方库
https://pypi.org/: 输入功能英文--->获取库--->查看方法并应用
'''
#-------------------------------------------------------------------------------------------------------------
#自顶向下实例:
from random import random
def printIntro():#初始化提示输入
print('该程序模拟某两个竞技选手A和B之间的比赛')
print('请输入两选手的能力值(0-1之间的小数表示)以及竞技场次数')
def getIputs():#获取选手输入
a,b,n=list(map(eval,input().split(' ')))
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):#单场比赛结束标志
return a==15 or b==15
def simOneGame(probA,probB):#模拟一场比赛
scoreA,scoreB=0,0
serving='A'
while not gameOver(scoreA,scoreB):
if serving=='A':
if random()<probA:
scoreA+=1
else:
serving='B'
else:
if random()<probB:
scoreB+=1
else:
serving='A'
return scoreA,scoreB
def simuNGames(n,probA,probB):#模拟所有比赛
winsA,winsB=0,0
for i in range(n):
scoreA,scoreB=simOneGame(probA,probB)
if scoreA>scoreB:
winsA+=1
else:
winsB+=1
return winsA,winsB
def main():#顶端函数
printIntro()
probA,probB,n=getIputs()
winsA,winsB=simuNGames(n,probA,probB)
printSummary(winsA,winsB)
main()