Python之体育竞技比赛分析实例,学习自顶向下程序设计思想

模拟N场比赛
抽象+自动化
当N越大,比赛结果分析会越科学
假设比赛规则
1、双人击球比赛:A&B,回合制,5局3胜
2、开始时一方先发球,直至判分,接下来胜者发球
3、球员只能在发球局得分,15分为一局
自顶向下
解决复杂问题的有效方法。
将一个总的问题表达为若干个小问题的组成形式。
自底向上
分单元测试,逐步组装
程序总体框架及步骤:
1、打印程序介绍性信息 --printInfo()
2、获得程序运行参数:proA,proB,n --getInput()
3、利用球员A和B的能力值,模拟n局比赛 --simNGames()
4、输出A和B获胜比赛的场次及概率 --printSummary()

第一阶段   自顶向下设计
def  main():  #主程序流程
         printInfo()
         proA,proB,n = getInput()
         winsA,winsB = simNGames(n,proA,proB)
         printSummary(winsA,winsB)
         
def  printInfo():  #打印程序介绍信息
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")

def getInput():    #获得选手的能力值和模拟的比赛场次
    a = eval(input("请输入选手A的能力值(0-1):"))
    b = eval(input("请输入选手B的能力值(0-1):"))
    n = eval(input("模拟比赛的场次:"))
    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 simNGames(n, proA, proB):  #将模拟N场比赛分解为模拟循环模拟N次一场比赛
    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 simOneGame(proA,proB):   #模拟一场比赛,加入gameOver()条件函数
    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 gameOver(a,b):   #gameOver()条件函数
    return a==15 or b==15

你可能感兴趣的:(个人日志)