zoukankan      html  css  js  c++  java
  • 排球比赛

    一、排球训练营

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

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

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

    3. 规则简介:

    ① 每场比赛采用 5局3胜制。

    ② 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局。

    ③ 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜。

    4. 准备就绪,就差代码来实现了

    插入代码之前,先对代码做个简单的介绍:

    函数名称 函数说明
    printInfo() 打印程序的介绍信息
    getInputs() 获得用户输入的参数
    simNGames(n, probA, probB) 模拟n场比赛
    simOneGame(probA, probB) 模拟一场比赛,包括五局,采取五局三胜制
    simAGame(N, probA, probB) 模拟一局比赛
    GameOver(N, scoreA, scoreB) 定义一局比赛的结束条件
    printResult(n, winsA, winsB) 输出模拟比赛的结果

    好了,看看代码吧,虽然有点长,但应该可以看懂 ^_^

    复制代码
    复制代码
      1 # -*- encoding:utf-8 -*-
      2 '''
      3 模拟排球竞技
      4 @author: kmzs
      5 '''
      6 # 比赛规则:
      7 # 1. 采用5局3胜制
      8 # 2. 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局
      9 # 3. 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜
     10 
     11 from random import random
     12 def printInfo():
     13     '''
     14     function: 打印程序的介绍信息
     15     '''
     16     print("产品名称: 排球竞技模拟分析器")
     17     print("产品概述: 通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!")
     18     print("产品作者: 孔明最帅 - 34
    ")
     19 
     20 def getInputs():
     21     '''
     22     function: 获得用户输入的参数
     23     '''
     24     probA = eval(input("请输入队伍A的能力值(0~1):"))
     25     probB = eval(input("请输入队伍B的能力值(0~1):"))
     26     n = eval(input("请输入需要模拟比赛的场次数:"))
     27     return probA, probB, n
     28 
     29 def simNGames(n, probA, probB):
     30     '''
     31     function: 模拟n场比赛
     32     n: 模拟n场比赛
     33     probA, probB: 分别为队伍A和B的能力值
     34     winA, winB: 队伍A和B在一场比赛中获胜的局数
     35     winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
     36     '''
     37     winsA, winsB = 0, 0
     38     for _ in range(n):
     39         winA, winB = simOneGame(probA, probB)
     40         if winA > winB:
     41             winsA += 1
     42         else:
     43             winsB += 1
     44     return winsA, winsB
     45 
     46 def simOneGame(probA, probB):
     47     '''
     48     function: 模拟一场比赛,包括五局,采取五局三胜制
     49     probA, probB: 分别为队伍A和B的能力值
     50     return: 返回队伍A和B在本场比赛中获胜的局数
     51     scoreA, scoreB: 分别为队伍A和B一局比赛获得的分数
     52     winA, winB: 分别为队伍A和B一场比赛获胜的局数
     53     '''
     54     N = 1 # 代表本次比赛的局次
     55     winA, winB = 0, 0
     56     for _ in range(5):
     57         scoreA, scoreB = simAGame(N, probA, probB)
     58         if scoreA > scoreB:
     59             winA += 1
     60         else:
     61             winB += 1
     62         N += 1
     63         if winA == 3 or winB == 3:
     64             break
     65     return winA, winB
     66 
     67 def simAGame(N, probA, probB):
     68     '''
     69     function: 模拟一局比赛
     70     N: 代表本次比赛的局次
     71     probA, probB: 分别为队伍A和B的能力值
     72     return: 返回队伍A和B在本局比赛中获得的分数
     73     '''
     74     scoreA, scoreB = 0, 0    # 分别为队伍A和B一局比赛获得的分数
     75     serving = 'A'            # 发球方
     76     while not GameOver(N, scoreA, scoreB):
     77         if serving == 'A':
     78             if random() > probA:
     79                 scoreB += 1
     80                 serving = 'B'
     81             else:
     82                 scoreA += 1
     83         if serving == 'B':
     84             if random() > probB:
     85                 scoreA += 1
     86                 serving = 'A'
     87             else:
     88                 scoreB += 1
     89     return scoreA, scoreB
     90 
     91 def GameOver(N, scoreA, scoreB):
     92     '''
     93     function: 定义一局比赛的结束条件
     94     N: 代表当前局次(第五局为决胜局)
     95     return: 若比赛结束的条件成立返回真,否则为假
     96     '''
     97     if N <= 4:
     98         return (scoreA>=25 and scoreB>=25 and abs(scoreA-scoreB)>=2)
     99     else:
    100         return (scoreA>=15 and abs(scoreA-scoreB)>=2) or (scoreB>=15 and abs(scoreA-scoreB)>=2)
    101 
    102 def printResult(n, winsA, winsB):
    103     '''
    104     function: 输出模拟比赛的结果
    105     '''
    106     print("竞技分析开始,共模拟{}场比赛。".format(n))
    107     print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
    108     print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
    109 
    110 if __name__ == "__main__":
    111     printInfo()
    112     probA, probB, n = getInputs()
    113     winsA, winsB = simNGames(n, probA, probB)
    114     printResult(n, winsA, winsB)
    复制代码
    复制代码

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

    二、足球训练基地

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

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

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

    3. 规则简介:

    ① 每场比赛采用回合制。

    ② 一名球员在一个回合中未能合法击打时,回合结束。本回合胜方得一分、得球权。

    ③ 先得15分赢得一场比赛。

    4. 代码实现

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

    函数名称 函数说明
    printInfo() 打印程序的介绍信息
    getInputs() 获得用户输入的参数
    simNGames(n, probA, probB) 模拟n场比赛
    simOneGame(probA, probB) 模拟一场比赛(此处只有一局)
    GameOver(N, scoreA, scoreB) 定义一场比赛的结束条件
    printResult(n, winsA, winsB) 输出模拟比赛的结果
    复制代码
    复制代码
     1 # -*- encoding:utf-8 -*-
     2 '''
     3 模拟足球竞技
     4 @author: bpf
     5 '''
     6 # 比赛规则:
     7 # 1. 采用回合制
     8 # 2. 一名球员在一个回合中未能合法击打时,回合结束。本回合胜方得一分、得球权。
     9 # 3. 先得15分赢得一场比赛。
    10 
    11 from random import random
    12 def printInfo():
    13     '''
    14     function: 打印程序的介绍信息
    15     '''
    16     print("产品名称: 足球竞技模拟分析器")
    17     print("产品概述: 通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!")
    18     print("产品作者: 孔明最帅 - 34
    ")
    19 
    20 def getInputs():
    21     '''
    22     function: 获得用户输入的参数
    23     '''
    24     probA = eval(input("请输入队伍A的能力值(0~1):"))
    25     probB = eval(input("请输入队伍B的能力值(0~1):"))
    26     n = eval(input("请输入需要模拟比赛的场次数:"))
    27     return probA, probB, n
    28 
    29 def simNGames(n, probA, probB):
    30     '''
    31     function: 模拟n场比赛
    32     n: 模拟n场比赛
    33     probA, probB: 分别为队伍A和B的能力值
    34     winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
    35     '''
    36     winsA, winsB = 0, 0
    37     for _ in range(n):
    38         scoreA, scoreB = simOneGame(probA, probB)
    39         if scoreA > scoreB:
    40             winsA += 1
    41         else:
    42             winsB += 1
    43     return winsA, winsB
    44 
    45 def simOneGame(probA, probB):
    46     '''
    47     function: 模拟一场比赛
    48     probA, probB: 分别为队伍A和B的能力值
    49     scoreA, scoreB: 分别为队伍A和B一场比赛的分数
    50     return: 返回队伍A和B在本场比赛中获得的分数
    51     '''
    52     scoreA, scoreB = 0, 0
    53     serving = 'A'            # 发球方
    54     while not gameOver(scoreA, scoreB):
    55         if serving == 'A':
    56             if random() > probA:
    57                 scoreB += 1
    58                 serving = 'B'
    59             else:
    60                 scoreA += 1
    61         if serving == 'B':
    62             if random() > probB:
    63                 scoreA += 1
    64                 serving = 'A'
    65             else:
    66                 scoreB += 1
    67     return scoreA, scoreB
    68 
    69 def gameOver(scoreA, scoreB):
    70     '''
    71     function: 定义一场比赛的结束条件
    72     return: 若比赛结束的条件成立返回真,否则为假
    73     '''
    74     return scoreA==15 or scoreB==15
    75 
    76 def printResult(n, winsA, winsB):
    77     '''
    78     function: 输出模拟比赛的结果
    79     '''
    80     print("竞技分析开始,共模拟{}场比赛。".format(n))
    81     print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
    82     print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
    83 
    84 if __name__ == "__main__":
    85     printInfo()
    86     probA, probB, n = getInputs()
    87     winsA, winsB = simNGames(n, probA, probB)
    88     printResult(n, winsA, winsB)
    复制代码
    复制代码

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

    三、晋级模拟

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

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

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

    3. 规则简介:

    ① 每场比赛采用回合制。

    ② 一名球员在一个回合中未能合法击打时,回合结束。本回合胜方得一分、得球权。

    ③ 先得15分赢得一场比赛。

    4. 代码实现

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

    复制代码
    复制代码
      1 # -*- encoding:utf-8 -*-
      2 '''
      3 模拟排球竞技
      4 @author: kmzs
      5 '''
      6 # 比赛规则:
      7 # 1. 一场比赛: 单打:采用七局四胜制
      8 #              双打淘汰赛、团体赛:采用五局三胜制
      9 # 2. 一局比赛: 先得11分为胜,10平后,多得2分为胜
     10 
     11 from random import random
     12 from pandas import DataFrame
     13 class SportCompetitionAnalyze:
     14 
     15     def PrintInfo(self):
     16         '''
     17         function: 打印程序的介绍信息
     18         '''
     19         print("产品名称: 乒乓球竞技模拟分析器(采取单打淘汰赛制)")
     20         print("产品概述: 通过输入多个队伍的能力值(0到1之间的小数表示),能够模拟多次多个队伍的乒乓球竞技比赛,从而得出各自的胜率!")
     21         print("产品作者: 孔明最帅 - 04
    ")
     22     
     23     def GetInputs(self):
     24         '''
     25         function: 获得用户输入的参数
     26         '''
     27         self.n = eval(input("请输入需要模拟比赛的场次数:"))
     28         self.probAbilityList = list(map(eval, input("请输入各队伍/球员的能力值(0~1), 请用英文逗号隔开:").split(',')))
     29         self.probNum = len(self.probAbilityList)
     30         self.simNGames()
     31 
     32     def simNGames(self):
     33         '''
     34         function: 模拟n场比赛
     35         probwinsList: 存储每支队伍赢得比赛的场数 的列表
     36         winA, winB: 队伍A和B在一场比赛中获胜的局数
     37         winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
     38         '''
     39         self.probwinsList = []
     40         for i in range(0, self.probNum, 2):
     41             print("队伍:", i+1, '&' ,i+2, "比赛中...")
     42             winsA, winsB = 0, 0
     43             for _ in range(self.n):
     44                 winA, winB = self.simOneGame(self.probAbilityList[i], self.probAbilityList[i+1])
     45                 if winA > winB:
     46                     winsA += 1
     47                 else:
     48                     winsB += 1
     49             self.probwinsList.append(winsA)
     50             self.probwinsList.append(winsB)
     51 
     52     def simOneGame(self, probA, probB):
     53         '''
     54         function: 模拟一场比赛,包括七局,采取七局四胜制
     55         scoreA, scoreB: 分别为队伍A和B一局比赛的分数
     56         winA, winB: 分别为队伍A和B一场比赛赢的局数
     57         return: 返回双方赢的局数
     58         '''
     59         winA, winB = 0, 0
     60         for _ in range(7):
     61             scoreA, scoreB = self.simAGame(probA, probB)
     62             if scoreA > scoreB:
     63                 winA += 1
     64             else:
     65                 winB += 1
     66             if winA >=4 or winB >= 4:
     67                 break
     68         return winA, winB
     69 
     70     def simAGame(self, probA, probB):
     71         '''
     72         function: 模拟一局比赛
     73         N: 代表本次比赛的局次
     74         probA, probB: 分别为队伍A和B的能力值
     75         return: 返回队伍A和B在本局比赛中获得的分数
     76         '''
     77         scoreA, scoreB = 0, 0
     78         serving = 'A'              # 发球方
     79         while not self.GameOver(scoreA, scoreB):
     80             if serving == 'A':
     81                 if random() > probA:
     82                     scoreB += 1
     83                     serving = 'B'
     84                 else:
     85                     scoreA += 1
     86             else:
     87                 if random() > probB:
     88                     scoreA += 1
     89                     serving = 'A'
     90                 else:
     91                     scoreB += 1
     92         return scoreA, scoreB
     93 
     94     def GameOver(self, scoreA, scoreB):
     95         '''
     96         function: 定义赢得一局的条件: 一方先得11分且超过对方2分
     97         '''
     98         return (scoreA >= 11 and abs(scoreA-scoreB)>=2) or (scoreB >= 11 and abs(scoreA-scoreB)>=2)
     99 
    100     def PrintResult(self):
    101         '''
    102         function: 输出模拟比赛的结果
    103         data: 存储每支的比赛信息
    104         '''
    105         print("竞技分析结束,每组共模拟{}场比赛。".format(self.n))
    106         data = []
    107         for i in range(self.probNum):
    108             tmplist = []
    109             tmplist.append(self.probAbilityList[i])      # 存储能力值
    110             tmplist.append(self.probwinsList[i])         # 存储获胜的场数
    111             tmplist.append(self.probwinsList[i]/self.n)  # 存储胜率
    112             data.append(tmplist)
    113         dataSheet = DataFrame(data , index=list(range(1, self.probNum+1)), columns=list(["Ability", "wins", "rate"]))
    114         #dataSheet.sort_values(by="wins", inplace=True)  # 对比赛胜率rate进行排序
    115         print(dataSheet)
    116     
    117 if __name__ == "__main__":
    118     pingpong = SportCompetitionAnalyze()
    119     pingpong.PrintInfo()
    120     pingpong.GetInputs()
    121     pingpong.PrintResult()
    复制代码
    复制代码

    5. 代码写好了,看一下运行效果怎么样呗 ^v^

    Tips:为了使用方便,可以使用python的第三方库pyinstaller进行打包,生成exe文件,可以方便运行。

    接下来,我们试一下吧~~~

    ① 首先要安装pyinstaller库

    在cmd中输入下面一句代码,详情就不介绍了。

    pip install pyinstaller

    ② 使用方法: pyinstaller  <文件名>    》具体使用方法

    注: 使用pyinstaller时,路径不能出现中文,否则出现编码出错;最好在上述代码的main函数的最后加上 input() 语句,防止程序一运行完就自动退出。

    之后双击运行exe文件即可 ↓↓↓

     

  • 相关阅读:
    Response.Redirect 产生的“正在中止线程”错误,不再执行下面语句解决办法
    c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
    https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
    [bzoj2427][HAOI2010]软件安装——强连通分量+树形DP
    [bzoj3931][CQOI2015]网络吞吐量——最短路+网络流
    [bzoj1823][JSOI2010]满汉全席——2-SAT
    [bzoj1486][HNOI2009]最小圈——分数规划+spfa+负环
    [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流
    [bzoj3876][AHOI2014]支线剧情——上下界费用流
    [bzoj2127]happiness——最小割
  • 原文地址:https://www.cnblogs.com/abing123/p/10855246.html
Copyright © 2011-2022 走看看