python初体验 ——>>> 模拟体育竞技
一、排球训练营
1. 简介: 模拟不同的两个队伍进行排球的模拟比赛。
2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。
P 简介:通过产生随机数得到每局比赛的难度,若小于能力值则表示赢得本局比赛,反之输掉本局比赛。
3. 规则简介:
① 每场比赛采用 5局3胜制。
② 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局。
③ 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜。
4. 准备就绪,就差代码来实现了
插入代码之前,先对代码做个简单的介绍:
函数名称 | 函数说明 |
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. 采用5局3胜制 8 # 2. 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局 9 # 3. 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜 10 11 from random import random 12 from time import time 13 def printInfo(): 14 ''' 15 function: 打印程序的介绍信息 16 ''' 17 print("{:*^70}".format("产品简介")) 18 print("产品名称: 排球竞技模拟分析器") 19 print("产品概述: 通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!") 20 print("产品作者: 步平凡 - 04") 21 print("{:*^70}".format("模拟开始")) 22 23 def getInputs(): 24 ''' 25 function: 获得用户输入的参数 26 ''' 27 probA = eval(input("请输入队伍A的能力值(0~1):")) 28 probB = eval(input("请输入队伍B的能力值(0~1):")) 29 n = eval(input("请输入需要模拟比赛的场次数:")) 30 return probA, probB, n 31 32 def printResult(n, winsA, winsB): 33 ''' 34 function: 输出模拟比赛的结果 35 ''' 36 print("{:*^70}".format("模拟结束")) 37 print("竞技分析开始,共模拟{}场比赛。".format(n)) 38 print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n)) 39 print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n)) 40 41 def simNGames(n, probA, probB): 42 ''' 43 function: 模拟n场比赛 44 n: 模拟n场比赛 45 probA, probB: 分别为队伍A和B的能力值 46 winA, winB: 队伍A和B在一场比赛中获胜的局数 47 winsA, winsB: 队伍A和B赢得比赛的场数,总共n场 48 ''' 49 winsA, winsB = 0, 0 50 for _ in range(n): 51 winA, winB = simOneGame(probA, probB) 52 if winA > winB: 53 winsA += 1 54 else: 55 winsB += 1 56 return winsA, winsB 57 58 def simOneGame(probA, probB): 59 ''' 60 function: 模拟一场比赛,包括五局,采取五局三胜制 61 probA, probB: 分别为队伍A和B的能力值 62 return: 返回队伍A和B在本场比赛中获胜的局数 63 scoreA, scoreB: 分别为队伍A和B一局比赛获得的分数 64 winA, winB: 分别为队伍A和B一场比赛获胜的局数 65 N: 代表本次比赛的局次 66 ''' 67 winA, winB = 0, 0 68 for N in range(5): 69 scoreA, scoreB = simAGame(N, probA, probB) 70 if scoreA > scoreB: 71 winA += 1 72 else: 73 winB += 1 74 if winA == 3 or winB == 3: 75 break 76 return winA, winB 77 78 def simAGame(N, probA, probB): 79 ''' 80 function: 模拟一局比赛 81 N: 代表本次比赛的局次 82 probA, probB: 分别为队伍A和B的能力值 83 return: 返回队伍A和B在本局比赛中获得的分数 84 ''' 85 scoreA, scoreB = 0, 0 # 分别为队伍A和B一局比赛获得的分数 86 serving = 'A' # 发球方 87 while not GameOver(N, scoreA, scoreB): 88 if serving == 'A': 89 if random() > probA: 90 scoreB += 1 91 serving = 'B' 92 else: 93 scoreA += 1 94 else: 95 if random() > probB: 96 scoreA += 1 97 serving = 'A' 98 else: 99 scoreB += 1 100 return scoreA, scoreB 101 102 def GameOver(N, scoreA, scoreB): 103 ''' 104 function: 定义一局比赛的结束条件 105 N: 代表当前局次(第五局为决胜局) 106 return: 若比赛结束的条件成立返回真,否则为假 107 ''' 108 if N <= 4: 109 return (scoreA>=25 and abs(scoreA-scoreB)>=2) or (scoreB>=25 and abs(scoreA-scoreB)>=2) 110 else: 111 return (scoreA>=15 and abs(scoreA-scoreB)>=2) or (scoreB>=15 and abs(scoreA-scoreB)>=2) 112 113 if __name__ == "__main__": 114 printInfo() 115 probA, probB, n = getInputs() 116 Time = time() 117 winsA, winsB = simNGames(n, probA, probB) 118 print("模拟用时: {:.1f}s".format(time()-Time)) 119 printResult(n, winsA, winsB)
5. 运行结果展示,为了查看方便,我在cmd中运行代码
二、足球训练基地
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;以此类推。)\n\ 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;以此类推。)\n\ 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("程序功能:\n\t1. 模拟多队员进行单打比赛\n\t2. 模拟多队伍多队员进行双打比赛") 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()
5. 代码写好了,看一下运行效果怎么样呗 ^v^
Tips:为了使用方便,可以使用python的第三方库pyinstaller进行打包,生成exe文件,可以方便运行。
接下来,我们试一下吧~~~
① 首先要安装pyinstaller库
在cmd中输入下面一句代码,详情就不介绍了。
pip install pyinstaller
② 使用方法: pyinstaller <文件名> 》具体使用方法《
注: 使用pyinstaller时,路径不能出现中文,否则出现编码出错;最好在上述代码的main函数的最后加上 input() 语句,防止程序一运行完就自动退出。
之后双击运行exe文件即可 ↓↓↓
好了,今天就分享到这里,学习去咯~~~