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: bpf 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\n") 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("产品作者: 步平凡 - 04\n") 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: bpf 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\n") 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文件即可 ↓↓↓
好了,今天就分享到这里,学习去咯~~~