美文网首页
国二python真题赏析——经典体育竞技类击球案例

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

作者: 小董不太懂 | 来源:发表于2019-08-28 17:03 被阅读0次

    我们在这个实例中,我们需要根据对两个人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真题赏析——经典体育竞技类击球案例

          本文链接:https://www.haomeiwen.com/subject/mpapectx.html