python初体验 ——>>> 模拟体育竞技

python初体验 ——>>> 模拟体育竞技

一、排球训练营

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:傲博不太傲
  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("产品作者: 步平凡 - 04
")
 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: 傲博不太傲
 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("产品作者:傲博不太傲
- 04
") 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:傲博不太傲
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文件即可 ↓↓↓

 

原文地址:https://www.cnblogs.com/elbow/p/10865151.html