一、排球训练营
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\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("产品作者: 孔明最帅 - 34\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: 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\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文件即可 ↓↓↓


浙公网安备 33010602011771号