国二python真题赏析——经典体育竞技类击球案例

我们在这个实例中,我们需要根据对两个人A、B的能力值来预测两人的胜率各是多少。
我们假定以下比赛规则:
双人击球比赛:
1、A、B两个人,回合制的五局三胜。
2、开始时一方先发球,直至判分,接下去胜者发球。
3、球员只能在发球局得分,15分胜一局。
我们处理一个问题时的两种思路有自顶而下和自底而上:
自顶向下:(执行)
将一个很大的问题表述为许许多多个小问题的组合,然后利用相同的方法来分解小问题,直到小问题可以简单解决。
自底向上:(设计)
分单元去测试,逐步组装,即按自顶向下的相反路径去操作,直到系统每一部分以组装的思路都经过测试与验证。
在这道题中,我们先分析题目的步骤:
步骤:
1、整体框架
2、将最基本的介绍性信息打出
3、获得参数
4、通过得到A和B两人的各项能力值来模拟n局比赛
5、输出球员模拟的比赛获胜情况,并算出概率
下面我们就一步步来实现:

  • 整体框架
def main():
    Printintro()#打印基本的介绍性信息
    A,B,n = getInput()#获得参数,其中A为运动员A的能力值,B为运动员B的能力值,n为双方一共打的回合数
    winsA,winsB = simuGames(A,B,n)#winsA是运动员A获胜的总场次,winsB是运动员B获胜的总场次 
    Printsumary(winsA,winsB)#打印出每个运动员获胜的场次及胜率
    
if __name__ == '__main__':
    main()    
  • 打印最基本的介绍性信息
def Printintro():
    print('这是一个python竞技体育的小项目')
    print('用来模拟两个运动员进行比赛,从而估算出胜率')
    print('运动员A和运动员B的能力值在0-1之间')
  • 获得参数
def getInput():
    A = eval(input('请输入运动员A的能力值:'))
    B = eval(input('请输入运动员B的能力值:'))
    n = eval(input('请输入比赛的总回合数:'))
    return A,B,n
  • 通过得到A和B两人的各项能力值来模拟n局比赛
    这部分是本题中稍难的地方,对初学者不太友好,需要多看几遍
def simuGames(A,B,n):
    winsA,winsB = 0,0
    for i in range(n):
        scoreA,scoreB = simuoneGame(A,B)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA,winsA

def simuoneGame(A,B):
    scoreA,scoreB = 0,0
    FQ = 'A'
    while not game_over(scoreA,scoreB):
        if FQ == 'A':
            if random.random() < A:
                scoreA += 1
            else:
                FQ = 'B'
        else:
            if random.random() < B:
                scoreB += 1
            else:
                FQ = 'A'
    return scoreA,scoreB    
  • 输出球员模拟的比赛获胜情况,并算出概率
def Printsumary(winsA,winsB):
    N = winsA + winsB
    print('运动员A获胜的总场次为{},胜率为{:0.1%}'.format(winsA,winsA/N))
    print('运动员B获胜的总场次为{},胜率为{:0.1%}'.format(winsB,winsB/N))

以上就是所有的步骤,最终整合一下:

import random

def PrintIntro():
    print('这是一个python竞技体育的小项目')
    print('用来模拟两个运动员进行比赛,从而估算出胜率')
    print('运动员A和运动员B的能力值在0-1之间')

def getInput():
    A = eval(input('请输入运动员A的能力值:'))
    B = eval(input('请输入运动员B的能力值:'))
    n = eval(input('请输入比赛的总回合数:'))
    return A,B,n

def simGames(n,A,B):
    winsA,winsB = 0,0
    for i in range(n):
        scoreA,scoreB = simoneGames(A,B)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA,winsB

def simoneGames(A,B):
    scoreA,scoreB = 0,0
    FQ = 'A'
    while not Gameover(scoreA,scoreB):
        if FQ == 'A':
            if random.random() < A:
                scoreA += 1
            else:
                FQ = 'B'
        else:
            if random.random() < B:
                scoreB += 1
            else:
                FQ = 'A'
    return scoreA,scoreB

def Gameover(scoreA,scoreB):
    return scoreA == 15 or scoreB == 15

def Printsumary(winsA,winsB):
    N = winsA + winsB
    print('运动员A获胜的总场次为{},胜率为{:0.1%}'.format(winsA,winsA/N))
    print('运动员B获胜的总场次为{},胜率为{:0.1%}'.format(winsB,winsB/N))

def main():
    PrintIntro()#打印基本的介绍性信息
    A,B,n = getInput()#获得参数,其中A为运动员A的能力值,B为运动员B的能力值,n为双方一共打的回合数
    winsA,winsB = simGames(n,A,B)#winsA是运动员A获胜的总场次,winsB是运动员B获胜的总场次
    Printsumary(winsA,winsB)#打印出每个运动员获胜的场次及胜率

if __name__ == '__main__':
    main()
这是一个python竞技体育的小项目
用来模拟两个运动员进行比赛,从而估算出胜率
运动员A和运动员B的能力值在0-1之间
请输入运动员A的能力值:0.65
请输入运动员B的能力值:0.68
请输入比赛的总回合数:10000
运动员A获胜的总场次为4664,胜率为46.6%
运动员B获胜的总场次为5336,胜率为53.4%

做这个题的时候我也出现了问题,就是函数调用参数的问题,一定要按照先后顺序调用,或者直接标出变量传递也可以。

可以简化一些去掉gameover()函数:

import random

def PrintIntro():
    print('这是一个python竞技体育的小项目')
    print('用来模拟两个运动员进行比赛,从而估算出胜率')
    print('运动员A和运动员B的能力值在0-1之间')

def getInput():
    A = eval(input('请输入运动员A的能力值:'))
    B = eval(input('请输入运动员B的能力值:'))
    n = eval(input('请输入比赛的总回合数:'))
    return A,B,n

def simGames(n,A,B):
    winsA,winsB = 0,0
    for i in range(n):
        scoreA,scoreB = simoneGames(A,B)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA,winsB

def simoneGames(A,B):
    scoreA,scoreB = 0,0
    FQ = 'A'
    if scoreA != 15 or scoreB != 15:
        if FQ == 'A':
            if random.random() < A:
                scoreA += 1
            else:
                FQ = 'B'
        else:
            if random.random() < B:
                scoreB += 1
            else:
                FQ = 'A'
    return scoreA,scoreB

def Printsumary(winsA,winsB):
    N = winsA + winsB
    print('运动员A获胜的总场次为{},胜率为{:0.1%}'.format(winsA,winsA/N))
    print('运动员B获胜的总场次为{},胜率为{:0.1%}'.format(winsB,winsB/N))

def main():
    PrintIntro()#打印基本的介绍性信息
    A,B,n = getInput()#获得参数,其中A为运动员A的能力值,B为运动员B的能力值,n为双方一共打的回合数
    winsA,winsB = simGames(n,A,B)#winsA是运动员A获胜的总场次,winsB是运动员B获胜的总场次
    Printsumary(winsA,winsB)#打印出每个运动员获胜的场次及胜率

if __name__ == '__main__':
    main()

你可能感兴趣的:(国二python真题赏析——经典体育竞技类击球案例)