zoukankan      html  css  js  c++  java
  • python 足球模拟

    # 比赛规则:
    # 1. 比赛分为两场,每场为45分钟
    #       上半场: 一方挑选进攻的球门,另一方获得开球权
    #       下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权
    # 2. 在进球后开球时,开球方为失球一方
    # 3. 在没有违反任何比赛规则时,进攻球队得分。
    # 4. 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。
    
    from random import random, randint
    from time import time
    def printInfo():
        '''
        function: 打印程序的介绍信息
        '''
        print("{:*^70}".format("产品简介"))
        print("足球竞技模拟")
        print("通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!")
        print("06号詹曼青")
        print("{:*^70}".format("模拟开始"))
    
    def getInputs():
        '''
        function: 获得用户输入的参数
        '''
        probA = eval(input("请输入队伍A的能力值(0~1):"))
        probB = eval(input("请输入队伍B的能力值(0~1):"))
        n = eval(input("请输入需要模拟比赛的场次数:"))
        return probA, probB, n
    
    def printResult(n, via, winsA, winsB):
        '''
        function: 输出模拟比赛的结果
        '''
        print("{:*^70}".format("模拟结束"))
        print("竞技分析开始,共模拟{}场比赛。".format(n))
        print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
        print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
        print(">>>两队平局{}场,占比{:0.1%}".format(via,via/n))
    
    def simNGames(n, probA, probB):
        '''
        function: 模拟n场比赛
        n: 模拟n场比赛
        probA, probB: 分别为队伍A和B的能力值
        winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
        '''
        via, winsA, winsB = 0, 0, 0
        for _ in range(n):
            scoreA, scoreB = simOneGame(probA, probB)
            if scoreA == scoreB:
                via += 1
            elif scoreA > scoreB:
                winsA += 1
            else:
                winsB += 1
        return via, winsA, winsB
    
    def simOneGame(probA, probB):
        '''
        function: 模拟一场比赛, 分上半场和下半场
        probA, probB: 分别为队伍A和B的能力值
        scoreA, scoreB: 分别为队伍A和B一场比赛的分数
        return: 返回队伍A和B在本场比赛中获得的分数
        '''
        winA, winB = 0, 0
        for N in range(2):
            scoreA, scoreB = simAGame(N, probA, probB)
            winA += scoreA
            winB += scoreB
        return winA, winB
    
    def simAGame(N, probA, probB):
        '''
        function: 模拟半场比赛
        probA, probB: 分别为队伍A和B的能力值
        scoreA, scoreB: 分别为队伍A和B半场比赛的分数
        return: 返回队伍A和B在本半场比赛中获得的分数
        '''
        scoreA, scoreB = 0, 0
        if N == 0:
            serving = 'A'            # 发球方
        else:
            serving = 'B'
        for _ in range(gameOver()):
            if serving == 'A':
                if random() < probA:
                    scoreA += 1
                    serving = 'B'
            else:
                if random() < probB:
                    scoreB += 1
                    serving = 'A'
        return scoreA, scoreB
    
    def gameOver():
        '''
        function: 定义半场比赛的结束条件
        通过randint产生一个随机数作为半场比赛的回合数, 若达到半场比赛的回合数则结束比赛
        return: 若比赛结束的条件成立返回真,否则为假
        '''
        return randint(3, 10)
    
    if __name__ == "__main__":
        printInfo()
        probA, probB, n = getInputs()
        Time = time()
        via, winsA, winsB = simNGames(n, probA, probB)
        print("模拟用时: {:.1f}s".format(time()-Time))
        printResult(n, via, winsA, winsB)

    运行结果:

  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/Zmanqing/p/14026226.html
Copyright © 2011-2022 走看看