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)

    运行结果:

  • 相关阅读:
    接口和抽象类的异同点
    实体对象间传值克隆
    什么是反射&反射的8个类的用法
    ERP中反射的两个实例
    基础02 Java 跨平台原理
    基础01 dos命令
    lists删除
    多字段 java对象排序
    Java对象排序
    MySQL表中数据的迁移
  • 原文地址:https://www.cnblogs.com/Zmanqing/p/14026226.html
Copyright © 2011-2022 走看看