欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-20 19:25:57
python初体验 ——>>> 模拟体育竞技 一、排球训练营 1. 简介: 模拟不同的两个队伍进行排球的模拟比赛。 2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。 P 简介:通过产生随机数得到每局比赛的难度,若小于能力值则表示赢得本局比赛,反之 ......

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中运行代码

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

二、足球训练基地

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中运行代码

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

三、晋级模拟

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文件即可 ↓↓↓

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

 

好了,今天就分享到这里,学习去咯~~~