• 模拟足球训练


    1. 简介: 模拟不同的两个队伍进行足球的模拟比赛。

    2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。

    P 简介:通过产生随机数得到半场比赛的回合数,再通过产生随机数得到每回合比赛的难度,若小于能力值则表示赢得本局比赛,反之输掉本场比赛。

    3. 规则简介:

    ① 比赛分为两半场,每场为45分钟。

      上半场: 一方挑选进攻的球门,另一方获得开球权;

      下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权。

    ②在进球后开球时,开球方为失球一方。

    ③ 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。

    4. 代码实现

    By the way, 此代码与上述主要不同之处在于: GameOver(),其他函数都类似

    函数名称 函数说明
    printInfo() 打印程序的介绍信息
    getInputs() 获得用户输入的参数
    printResult(n, winsA, winsB) 输出模拟比赛的结果
    simNGames(n, probA, probB) 模拟n场比赛
    simOneGame(probA, probB) 模拟一场比赛,包括上半场和下半场
    simAGame(N, probA, probB) 模拟半场比赛
    GameOver(N, scoreA, scoreB) 定义半场比赛的结束条件
    '''
     模拟足球竞技
     @author: bpf
    '''
     # 比赛规则:
     # 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("{:*^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)

    5.运行结果

     足球训练基地

    1. 简介: 模拟不同的两个队伍进行足球的模拟比赛。

    2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。

    P 简介:通过产生随机数得到半场比赛的回合数,再通过产生随机数得到每回合比赛的难度,若小于能力值则表示赢得本局比赛,反之输掉本场比赛。

    3. 规则简介:

    ① 比赛分为两半场,每场为45分钟。

      上半场: 一方挑选进攻的球门,另一方获得开球权;

      下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权。

    ②在进球后开球时,开球方为失球一方。

    ③ 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。

    4. 代码实现

    By the way, 此代码与上述主要不同之处在于: GameOver(),其他函数都类似

    函数名称 函数说明
    printInfo() 打印程序的介绍信息
    getInputs() 获得用户输入的参数
    printResult(n, winsA, winsB) 输出模拟比赛的结果
    simNGames(n, probA, probB) 模拟n场比赛
    simOneGame(probA, probB) 模拟一场比赛,包括上半场和下半场
    simAGame(N, probA, probB) 模拟半场比赛
    GameOver(N, scoreA, scoreB) 定义半场比赛的结束条件
    复制代码
      1 # -*- encoding:utf-8 -*-
      2 '''
      3 模拟足球竞技
      4 @author: bpf
      5 '''
      6 # 比赛规则:
      7 # 1. 比赛分为两场,每场为45分钟
      8 #       上半场: 一方挑选进攻的球门,另一方获得开球权
      9 #       下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权
     10 # 2. 在进球后开球时,开球方为失球一方
     11 # 3. 在没有违反任何比赛规则时,进攻球队得分。
     12 # 4. 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。
     13 
     14 from random import random, randint
     15 from time import time
     16 def printInfo():
     17     '''
     18     function: 打印程序的介绍信息
     19     '''
     20     print("{:*^70}".format("产品简介"))
     21     print("产品名称: 足球竞技模拟分析器")
     22     print("产品概述: 通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!")
     23     print("产品作者: 步平凡 - 04")
     24     print("{:*^70}".format("模拟开始"))
     25 
     26 def getInputs():
     27     '''
     28     function: 获得用户输入的参数
     29     '''
     30     probA = eval(input("请输入队伍A的能力值(0~1):"))
     31     probB = eval(input("请输入队伍B的能力值(0~1):"))
     32     n = eval(input("请输入需要模拟比赛的场次数:"))
     33     return probA, probB, n
     34 
     35 def printResult(n, via, winsA, winsB):
     36     '''
     37     function: 输出模拟比赛的结果
     38     '''
     39     print("{:*^70}".format("模拟结束"))
     40     print("竞技分析开始,共模拟{}场比赛。".format(n))
     41     print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
     42     print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
     43     print(">>>两队平局{}场,占比{:0.1%}".format(via,via/n))
     44 
     45 def simNGames(n, probA, probB):
     46     '''
     47     function: 模拟n场比赛
     48     n: 模拟n场比赛
     49     probA, probB: 分别为队伍A和B的能力值
     50     winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
     51     '''
     52     via, winsA, winsB = 0, 0, 0
     53     for _ in range(n):
     54         scoreA, scoreB = simOneGame(probA, probB)
     55         if scoreA == scoreB:
     56             via += 1
     57         elif scoreA > scoreB:
     58             winsA += 1
     59         else:
     60             winsB += 1
     61     return via, winsA, winsB
     62 
     63 def simOneGame(probA, probB):
     64     '''
     65     function: 模拟一场比赛, 分上半场和下半场
     66     probA, probB: 分别为队伍A和B的能力值
     67     scoreA, scoreB: 分别为队伍A和B一场比赛的分数
     68     return: 返回队伍A和B在本场比赛中获得的分数
     69     '''
     70     winA, winB = 0, 0
     71     for N in range(2):
     72         scoreA, scoreB = simAGame(N, probA, probB)
     73         winA += scoreA
     74         winB += scoreB
     75     return winA, winB
     76 
     77 def simAGame(N, probA, probB):
     78     '''
     79     function: 模拟半场比赛
     80     probA, probB: 分别为队伍A和B的能力值
     81     scoreA, scoreB: 分别为队伍A和B半场比赛的分数
     82     return: 返回队伍A和B在本半场比赛中获得的分数
     83     '''
     84     scoreA, scoreB = 0, 0
     85     if N == 0:
     86         serving = 'A'            # 发球方
     87     else:
     88         serving = 'B'
     89     for _ in range(gameOver()):
     90         if serving == 'A':
     91             if random() < probA:
     92                 scoreA += 1
     93                 serving = 'B'
     94         else:
     95             if random() < probB:
     96                 scoreB += 1
     97                 serving = 'A'
     98     return scoreA, scoreB
     99 
    100 def gameOver():
    101     '''
    102     function: 定义半场比赛的结束条件
    103     通过randint产生一个随机数作为半场比赛的回合数, 若达到半场比赛的回合数则结束比赛
    104     return: 若比赛结束的条件成立返回真,否则为假
    105     '''
    106     return randint(3, 10)
    107 
    108 if __name__ == "__main__":
    109     printInfo()
    110     probA, probB, n = getInputs()
    111     Time = time()
    112     via, winsA, winsB = simNGames(n, probA, probB)
    113     print("模拟用时: {:.1f}s".format(time()-Time))
    114     printResult(n, via, winsA, winsB)
    复制代码

    5. 运行结果展示,为了查看方便,我仍在cmd中运行代码

    三、晋级模拟

    1. 简介: 前2次分别对于排球和足球的模拟比赛分析,比赛规则的差距 体现 在代码上的不同,所以本次模拟分析多支队伍进行乒乓球比赛。

    2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。

    P 简介:通过产生随机数得到每局比赛的难度,若小于能力值则表示赢得本局比赛,反之输掉本局比赛。当有多个队伍时,采取两两配对,但只遍历一次,因此,本代码功能不完善,仅供参考。

    3. 规则简介:

    ①  一场比赛: 单打:采用七局四胜制; 双打淘汰赛、团体赛:采用五局三胜制。

    ② 一局比赛: 先得11分为胜,10平后,多得2分为胜

    ③ 一局比赛: 每队发球2次后,接发球方即成为发球方,依此类推,直至该局比赛结束 或者 到双方比分都达到10分时,发球和接发次序仍然不变,但每队只轮发一次球

    4. 代码实现

      本次代码与上述不同,本次采用类的方法来实现,不过基于本人对于乒乓球不熟悉及python用法有限,本次代码的功能有所限制,只能模拟数量为偶数的队伍进行比赛。待技术提升,会对代码进行改善和加强。

    复制代码
      1 # -*- encoding:utf-8 -*-
      2 '''
      3 模拟乒乓球竞技
      4 @author: bpf
      5 '''
      6 # 比赛规则:
      7 # 1. 一场比赛: 单打:采用七局四胜制
      8 #              双打淘汰赛、团体赛:采用五局三胜制
      9 # 2. 一局比赛: 先得11分为胜,10平后,多得2分为胜
     10 # 3. 一局比赛: 每队发球2次后,接发球方即成为发球方,依此类推,直至该局比赛结束
     11 #            或者到双方比分都达到10分时,发球和接发次序仍然不变,但每队只轮发一次球
     12 
     13 from random import random
     14 from pandas import DataFrame
     15 from time import time
     16 class SportCompetitionAnalyze:
     17 
     18     def PrintInfo(self):
     19         '''
     20         function: 打印程序的介绍信息
     21         '''
     22         print("{:*^70}".format("产品简介"))
     23         print("产品名称: 乒乓球竞技模拟分析器(采取单打淘汰赛制)")
     24         print("产品概述: 通过输入多个队伍的能力值(0到1之间的小数表示),能够模拟多次多个队伍的乒乓球竞技比赛,从而得出各自的胜率!")
     25         print("产品作者: 步平凡 - 04")
     26         print("{:*^70}".format("模拟开始"))
     27     
     28     def GetInputs_for_Singal(self):
     29         '''
     30         function: 获得用户输入的参数 获得单打各队员的能力值
     31         '''
     32         self.n = eval(input("请输入需要模拟比赛的场数:"))
     33         self.probAbilityList_Original = list(map(eval, input("(注:通过输入的次序进行两两配对, 即前两个分别为队员A和B;以此类推。)
    
     34             请输入各队员的能力值(0~1), 请用英文逗号隔开(输入个数为2的倍数): ").split(',')))
     35         self.probAbilityList = self.probAbilityList_Original
     36         self.probNum = len(self.probAbilityList)
     37     
     38     def GetInputs_for_Double(self):
     39         '''
     40         function: 获得用户输入的参数 获得双打各队伍各队员的能力值
     41         probAbilityList: 使用各队伍中两队员的平均能力值作为该队伍的能力值 --- 双打
     42         probAbilityList_Original: 存储原生的各队员能力值, 后续可用
     43         '''
     44         self.probAbilityList, self.probAbilityList_Original = [], []
     45         self.n = eval(input("请输入需要模拟比赛的场数:"))
     46         Original = list(map(eval, input("(注:通过输入的次序进行四四配对, 即前四个为队伍A和B;以此类推。)
    
     47             请输入各队员的能力值(0~1), 请用英文逗号隔开(输入个数为4的倍数): ").split(',')))
     48         for i in range(0, len(Original), 2):
     49             self.probAbilityList.append((Original[i] + Original[i+1])/2)
     50             self.probAbilityList_Original.append(list([Original[i], Original[i+1]]))
     51         self.probNum = len(self.probAbilityList)
     52     
     53     def PrintResult(self):
     54         '''
     55         function: 输出模拟比赛的结果
     56         data: 存储每支的比赛信息
     57         '''
     58         print("{:*^70}".format("模拟结束"))
     59         print("竞技分析结束,每组共模拟{}场比赛。".format(self.n))
     60         data = []
     61         for i in range(self.probNum):
     62             tmplist = []
     63             tmplist.append(self.probAbilityList_Original[i])  # 存储能力值
     64             tmplist.append(self.probwinsList[i])              # 存储获胜的场数
     65             tmplist.append(self.probwinsList[i]/self.n)       # 存储胜率
     66             data.append(tmplist)
     67         dataSheet = DataFrame(data , index=list(range(1, self.probNum+1)), columns=list(["Ability", "wins", "rate"]))
     68         #dataSheet.sort_values(by="wins", inplace=True)       # 对比赛胜率rate进行排序, 会混乱比赛队伍的关系, 因此不采用
     69         print(dataSheet)
     70 
     71     def simNGames(self, GAMES, WINS):
     72         '''
     73         function: 模拟n场比赛
     74         probwinsList: 存储每支队伍赢得比赛的场数 的列表
     75         winA, winB: 队伍A和B在一场比赛中获胜的局数
     76         winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
     77         '''
     78         self.probwinsList = []
     79         for i in range(0, self.probNum, 2):
     80             print("队员:", i+1, 'VS' ,i+2, "比赛中...")
     81             winsA, winsB = 0, 0
     82             for _ in range(self.n):
     83                 winA, winB = self.simOneGame(self.probAbilityList[i], self.probAbilityList[i+1], GAMES, WINS)
     84                 if winA > winB:
     85                     winsA += 1
     86                 else:
     87                     winsB += 1
     88             self.probwinsList.append(winsA)
     89             self.probwinsList.append(winsB)
     90 
     91     def simOneGame(self, probA, probB, GAMES, WINS):
     92         '''
     93         function: 模拟一场比赛  》》》 GAMES局 WINS胜
     94                 单打比赛,包括七局,采取七局四胜制
     95                 双打比赛,包括五局,采取五局三胜制
     96         scoreA, scoreB: 分别为队伍A和B一局比赛的分数
     97         winA, winB: 分别为队伍A和B一场比赛赢的局数
     98         return: 返回双方赢的局数
     99         '''
    100         winA, winB = 0, 0
    101         for _ in range(GAMES):
    102             scoreA, scoreB = self.simAGame(probA, probB)
    103             if scoreA > scoreB:
    104                 winA += 1
    105             else:
    106                 winB += 1
    107             if winA >=WINS or winB >= WINS:
    108                 break
    109         return winA, winB
    110 
    111     def simAGame(self, probA, probB):
    112         '''
    113         function: 模拟一局比赛
    114         probA, probB: 分别为队伍A和B的能力值
    115         return: 返回队伍A和B在本局比赛中获得的分数
    116         '''
    117         scoreA, scoreB = 0, 0
    118         serving = 'A'              # 发球方
    119         servingNum = 2             # 每方的发球次数
    120         while not self.GameOver(scoreA, scoreB):
    121             if scoreA >= 10 and scoreB >= 10:
    122                 servingNum = 1
    123             for _ in range(servingNum):
    124                 if random() > probA:
    125                     scoreB += 1
    126                 else:
    127                     scoreA += 1
    128             serving = 'B'
    129             for _ in range(servingNum):
    130                 if random() > probB:
    131                     scoreA += 1
    132                 else:
    133                     scoreB += 1
    134             serving = 'A'
    135         return scoreA, scoreB
    136 
    137     def GameOver(self, scoreA, scoreB):
    138         '''
    139         function: 定义赢得一局的条件: 先得11分为胜,10平后,多得2分为胜
    140         '''
    141         if scoreA >= 11 or scoreB >= 11:
    142             return (abs(scoreA-scoreB)>=2)
    143         elif (scoreA == 10 and scoreB > 11) or (scoreB == 10 and scoreA > 11):
    144             return (abs(scoreA-scoreB)>=2)
    145         else:
    146             return 0
    147     
    148 def print_MENU():
    149     print("程序简介:模拟乒乓球竞技")
    150     print("程序功能:
    	1. 模拟多队员进行单打比赛
    	2. 模拟多队伍多队员进行双打比赛")
    151     while 1:
    152         choose = input("功能选择:NO.")
    153         if choose in ['1', '2']:
    154             return eval(choose)
    155         else:
    156             print("输入有误, 请重新输入!")
    157     
    158 def simGameMenu():
    159     choose = print_MENU()
    160     if choose == 1:
    161         pingpong = SportCompetitionAnalyze()
    162         pingpong.PrintInfo()
    163         pingpong.GetInputs_for_Singal()
    164         Time = time()
    165         pingpong.simNGames(7, 4)
    166         print("模拟用时: {:.1f}s".format(time()-Time))
    167         pingpong.PrintResult()
    168     else:
    169         pingpong = SportCompetitionAnalyze()
    170         pingpong.PrintInfo()
    171         pingpong.GetInputs_for_Double()
    172         Time = time()
    173         pingpong.simNGames(5, 3)
    174         print("模拟用时: {:.1f}s".format(time()-Time))
    175         pingpong.PrintResult()
    176 
    177 if __name__ == "__main__":
    178     simGameMenu()
    复制代码
  • 相关阅读:
    SWT 重启案例分析(二)
    SWT 重启案例分析(一)
    手机重启问题 Log 抓取方法
    手机重启问题快速分析定位指南
    SWT 手机重启问题分析指南
    属性动画 使用详解
    补间动画 使用详解
    帧动画 使用详解
    Android动画 使用详解
    Linux grep 命令大全
  • 原文地址:https://www.cnblogs.com/shinawear/p/10872258.html
Copyright © 2020-2023  润新知