• 乒乓球比赛分析


    用python进行对乒乓球比赛的分析

    在一场比赛中,先得11分的获胜;若俩队同时的10分,则先超过对方2分的获胜。

    单打采用7局4胜,双打采用5局3胜。

    (1)单打

    代码:

     1 #e15.1MatchAnalysis.py
     2 from random import random
     3 def printIntro():
     4     print("01号ghh进行单打比赛分析(七局四胜):")
     5     print("这个程序模拟两个选手A和B的某种竞技比赛")
     6     print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
     7 def getInputs():
     8     a = eval(input("请输入选手A的能力值(0-1): "))
     9     b = eval(input("请输入选手B的能力值(0-1): "))
    10     n = eval(input("模拟比赛的场次: "))
    11     return a, b, n
    12 def simNGames(n, probA, probB):
    13     #进行N场比赛
    14     winsA, winsB = 0, 0
    15     for i in range(n):
    16         for j in range(7):#进行7局4胜的比赛
    17             scoreA, scoreB = simOneGame(probA, probB)
    18             if scoreA > scoreB:
    19                 winsA += 1
    20             else:
    21                 winsB += 1
    22     return winsA, winsB
    23 def gameOver1(a,b):#先得11分的获胜
    24         return a==11 or b==11
    25 def gameOver2(a,b):#两人都得10分后的结束标志
    26     if abs(a-b)>=2:
    27         return a,b
    28 def simOneGame(probA, probB):
    29     scoreA, scoreB = 0, 0
    30     serving = "A"
    31     while not gameOver1(scoreA, scoreB):
    32         if scoreA==10 and scoreB==10:
    33             return simtwoGame(probA,probB)
    34         if serving == "A":
    35             if random() < probA:
    36                 scoreA += 1
    37             else:
    38                 serving="B"
    39         else:
    40             if random() < probB:
    41                 scoreB += 1
    42             else:
    43                 serving="A"
    44     return scoreA, scoreB
    45 def simtwoGame(probA,probB):#双方都得10分后的一场比赛
    46     scoreA,scoreB=10,10
    47     serving = "A"
    48     while not gameOver2(scoreA, scoreB):
    49         if serving == "A":
    50             if random() < probA:
    51                 scoreA += 1
    52             else:
    53                 serving="B"
    54         else:
    55             if random() < probB:
    56                 scoreB += 1
    57             else:
    58                 serving="A"
    59     return scoreA, scoreB
    60 def printSummary(winsA, winsB):
    61     n = winsA + winsB
    62     print("竞技分析开始,共模拟{}场比赛".format(n))
    63     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    64     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
    65 def main():
    66     printIntro()
    67     probA, probB, n = getInputs()
    68     winsA, winsB = simNGames(n, probA, probB)
    69     printSummary(winsA, winsB)
    70 main()

    结果:

     (2)双打

    代码:

     1 from random import random
     2 def printIntro():
     3     print("01号ghh进行双打比赛团体赛分析(5局3胜):")
     4     print("这个程序模拟两支队伍A和B的某种竞技比赛")
     5     print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
     6 def getInputs():
     7     a = eval(input("请输入队伍A的能力值(0-1): "))
     8     b = eval(input("请输入队伍B的能力值(0-1): "))
     9     n = eval(input("模拟比赛的场次: "))
    10     return a, b, n
    11 def simNGames(n, probA, probB):
    12     #进行N场比赛
    13     winsA, winsB = 0, 0
    14     for i in range(n):
    15         for j in range(5):#进行5局3胜的比赛
    16             scoreA, scoreB = simOneGame(probA, probB)
    17             if scoreA > scoreB:
    18                 winsA += 1
    19             else:
    20                 winsB += 1
    21     return winsA, winsB
    22 def gameOver1(a,b):#先得11分的获胜
    23         return a==11 or b==11
    24 def gameOver2(a,b):#两队都得10分后的结束标志
    25     if abs(a-b)>=2:
    26         return a,b
    27 def simOneGame(probA, probB):
    28     scoreA, scoreB = 0, 0
    29     serving = "A"
    30     while not gameOver1(scoreA, scoreB):
    31         if scoreA==10 and scoreB==10:
    32             return simtwoGame(probA,probB)
    33         if serving == "A":
    34             if random() < probA:
    35                 scoreA += 1
    36             else:
    37                 serving="B"
    38         else:
    39             if random() < probB:
    40                 scoreB += 1
    41             else:
    42                 serving="A"
    43     return scoreA, scoreB
    44 def simtwoGame(probA,probB):#双方都得10分后的一场比赛
    45     scoreA,scoreB=10,10
    46     serving = "A"
    47     while not gameOver2(scoreA, scoreB):
    48         if serving == "A":
    49             if random() < probA:
    50                 scoreA += 1
    51             else:
    52                 serving="B"
    53         else:
    54             if random() < probB:
    55                 scoreB += 1
    56             else:
    57                 serving="A"
    58     return scoreA, scoreB
    59 def printSummary(winsA, winsB):
    60     n = winsA + winsB
    61     print("竞技分析开始,共模拟{}场比赛".format(n))
    62     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    63     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
    64 def main():
    65     printIntro()
    66     probA, probB, n = getInputs()
    67     winsA, winsB = simNGames(n, probA, probB)
    68     printSummary(winsA, winsB)
    69 main()

    结果:

     (3)用pyinstall库打包

    在命令行中输入Pyinstaller -F 再加上你写的文件的路径

    具体如下:

     执行结果:

  • 相关阅读:
    BZOJ 4716 假摔
    【UER #4】量子态的棋盘
    [Lydsy2017省队十连测]最长路径
    [Lydsy2017省队十连测]航海舰队
    [Lydsy2017省队十连测]公路建设
    [Lydsy2017省队十连测]商店购物
    湖南省队集训题【2018】(我也不知道是第几场)
    CXMS 胡策2
    [TJOI2018]异或
    TJOI 2018 数学计算
  • 原文地址:https://www.cnblogs.com/ghh0/p/12724898.html
Copyright © 2020-2023  润新知