欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-16 21:50:25
...

模拟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