3月2日星期一
先设计main函数
设计printIntro()函数打印一些介绍性内容,提高用户体验
设计getInputs()函数获得用户输入的三个参数,并把输入转换为数字,用return返回一个元组类型
设计printSummary(winsA,winsB)函数根据A、B获胜场次将相关信息和概率打印出来,那么A获胜和B获胜场次之和就是整体的比赛场次,那么它们的概率就是他们每个人获胜的场次与总获胜场次的比值,使用求和获得总场次并且用三个print语句打印相关的信息
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))
构造一个模拟一局比赛的函数叫simOneGame()
这个函数只需要获得选手A、选手B的能力值并且返回这一局比赛他们的分数,模拟N局比赛就是N次调用模拟一局比赛函数,然后将这样的结果进行一个整合
先来设计N次比赛函数,首先让A,B的获胜场次都置为0,然后N次调用simOneGame()函数获得A,B的分数,当A的分数大于B时,A的获胜场次加1,否则B的获胜场次加1
def simNGame(n,probA,probB):
winsA,winsB=0,0
for i in range(n):
scoreA,scoreB=simOneGame(probA,probB)
if scoreA>scoreB:
winsA+=1
else:
winB+=1
return winsA,winsB
在模拟一场比赛中进一步的分析一局比赛中可能的功能模块,定义一个gameover()函数来判断一局比赛是否结束
比赛不结束的情况下我们进行如下操作,选手A发球,生成一个随机变量,如果这个变量在A能力的范围之内,A获得1分,用这样的方式随机性的表达A能力与A获得分数之间的关系,如果随机函数生成之后,超越了A的能力范围,那么我们认为当前的发球局换为B,serving=“B”,对B也是一样
def simOneGame(probA,probB):
scoreA,scoreB=0,0
serving=“A”#选手A发球
while not gameOver(scoreA,scoreB):
if serving==“A”:
if random()
else:
serving=“B”
else:
if random()
else:
serving=“A”
return scoreA,scoreB
如果A或B的分数达到15分则,gameOver返回true or false
def gameOver(a,b)
return a15 or b15
代码一:
#MatchAnalysis.py
from random import random
def printInfo():
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1的小数表示)")
def getInputs():
a=eval(input("请输入选手A的能力值(0-1):"))
b=eval(input("请输入选手B的能力值(0-1):"))
n=eval(input("模拟比赛的场次:"))
return a,b,n
def simNGames(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 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 gameOver(a,b):#返回true或False
return a= =15 or b= =15
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 main():
printInfo()
probA,probB,n=getInputs()
winsA,winsB=simNGames(n,probA,probB)
printSummary(winsA,winsB)
main()