Python课后题 体育竞技分析[自顶向下和自底向上]

课程内容及课件参考:Python语言程序设计 BIT 嵩天

自顶向下和自底向上

自顶向下 (设计):解决复杂问题的有效方法

  • 将一个总问题表达为若干个小问题组成的形式
  • 使用同样方法进一步分解小问题 ,直至小问题可以用计算机简单明了的解决。Python课后题 体育竞技分析[自顶向下和自底向上]_第1张图片
    自底向上(执行) :逐步组建复杂系统的有效测试方法
  • 分单元测试,逐步组装
  • 按照自顶向下相反的路径操作系统各部分以组装的思路都经过测试和验证
    Python课后题 体育竞技分析[自顶向下和自底向上]_第2张图片

体育竞技分析

Python课后题 体育竞技分析[自顶向下和自底向上]_第3张图片

  • 需求:如何科学分析体育竞技比赛?
  • 输入:球员的水平
  • 输出:可预测的比赛成绩

  • 问题分析:体育竞技分析:模拟N场比赛
  • 计算思维:抽象+自动化
  • 模拟:抽象比赛过程+自动化执行N场比赛 -当N越大时,比赛结果分析会越科学

  • 比赛规则:双人击球,5局3胜,开始时一方先发球,直至判分,接下来胜者发球 -球员只能在发球局得分,15分胜一局。

  • 程序总体框架及步骤
printlnfo()				#步骤1:打印程序的介绍性信息            		
getlnputs()				#步骤2:获得程序运行参数:proA, proB, n 		
simNGames()				#步骤3:利用球员A和B的能力值,模拟n局比赛 		
printSummary()			#步骤4:输出球员A和B获胜比赛的场次及概率		

(0)main()主函数模块
Python课后题 体育竞技分析[自顶向下和自底向上]_第4张图片

def main():
    printIntro()	#欢迎语句
    probA, probB, n = getInputs()	#获得用户A、B能力值与比赛场次N
    winsA, winsB = simNGames(n, probA, probB)	#获得A与B的场次
    printSummary(winsA, winsB)	#返回A与B的结果

(1)printIntro() 用户体验模块

def printIntro():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")

(2)getInputs() 获得AB与场次模块

def getInputs():
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手B的能力值(0-1): "))
    n = eval(input("模拟比赛的场次: "))
    return a, b, n

(3)simNGames() 模拟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

其中simOneGame() 模拟n次单局比赛=模拟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

Python课后题 体育竞技分析[自顶向下和自底向上]_第5张图片
完整代码:

#MatchAnalysis.py
from random import random
def printIntro():
    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 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 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():
    printIntro()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)
main()

结论:能力值相差不大的运动员,随着比赛场次得不断增加,比赛结果的差距会逐渐拉大。

你可能感兴趣的:(python练习手册)