模拟体育竞技分析

时间:2021-10-24 23:35:48

一、下面是一个体育竞技模拟,就是输入比赛队伍的平均能力值,就可以判断出比赛的输赢。

下面先来说一下比赛规则:(以兵乓球比赛规则为例)

1、在一局比赛中,先得11分的一方为胜方,10平后,先多得2分的一方为胜方。
2、强调:一定要有一人达到十分后,领先2分,才算胜方。如14:15不行,8:5也不行,但11:13是13分的为胜方
并且输入n为多少,就可以模拟多少场比赛,并输出各个队伍的胜利场次。

下面来看一段代码

 1 # -*- coding: utf-8 -*-
 2 from random import random
 3 def printIntro():
 4     print("这个程序模拟两个选手A和B的兵乓球比赛")
 5     print("程序运行需要A和B选手的能力值(以0到1之间的小数表示)")
 6 def getInput():
 7     probA=eval(input("请输入选手A的能力值(0-1):"))
 8     probB=eval(input("请输入选手B的能力值(0-1):"))
 9     n=eval(input("模拟比赛场次:"))
10     return probA,probB,n
11 def simGames(n,probA,probB):     #比赛双方各自胜利的场次数
12     winsA,winsB=0,0
13     for i in range (n):
14         c=simGame(probA,probB)
15         if c=='A':
16             winsA+=1
17         else:
18             winsB+=1
19     return winsA,winsB
20 def simGame(probA,probB):         #判断一场比赛的胜方
21     winsA1,winsB1=0,0
22     for i in range(7):
23         scoreA,scoreB=simoneGame(probA,probB)
24         if scoreA>scoreB:
25             winsA1+=1
26         else:
27             winsB1+=1      
28     if winsA1>=4:
29         return 'A'
30     return 'B'
31 def simoneGame(probA,probB):     #统计一场比赛下来的各自得分数
32     scoreA,scoreB=0,0
33     serving="A"
34     while not gameOver(scoreA,scoreB):
35         x=random()
36         if serving=="A":
37             if x < probA:
38                 scoreA+=1
39             else:
40                 serving="B"
41         else:
42             if x < probB:
43                 scoreB+=1
44             else:
45                 serving="A"
46     return scoreA,scoreB
47 def gameOver(a,b):            
48     if (a>=11 and b<11) or (b>=11 and a<11) or (a>9 and b>9 and ((a-b)>=2 or (b-a)>=2)):
49         return True
50     return False
51 def printsummary(winsA,winsB):
52     n=winsA+winsB
53     print("竞技开始分析,共模拟了{}场比赛".format(n))
54     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
55     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
56     print("分析人:Yong No.10")
57 def main():
58     printIntro()
59     probA,probB,n=getInput()
60     winsA,winsB=simGames(n,probA,probB)
61     printsummary(winsA,winsB)
62 main()    

上面代码要注意的是变量名要自己清楚,不能写错或者搞混,不然就很难找出bug。

可以观看其效果:

模拟体育竞技分析

3、还有一个很有趣的实验就是利用pyinstaller库来打包程序,让程序可以独立执行,就像自己写了一个有趣的游戏要分享给同学玩,但是没有一定的软件是支持不了游戏的,这时就需要对程序进行打包,让其可独立执行。

下面来介绍一下pyinstaller库

安装:pyinstaller库需要在命令台(cmd)下用pip工具安装。

pip install pyinstaller

或者pip3 install pyinstaller。

或者官方网站:http://www.pyinstaller.org/

然后再输入文件路径。例如:pyinstaller game.py

执行完毕后,源文件所在目录将生成dist和build两个文件夹。其中,build目录是pyinstaller存储临时文件的目录,可以安全删除。最终的打包程序在dist内部的game目录里。

 注意事项:

文件路径中不能出现空格和英文句号;

源程序必须是UTF-8编码。

 pyinstaller 命令的常用参数:

模拟体育竞技分析

来看看实现效果:

模拟体育竞技分析

这样就完成了文件的独立运行!

二、下面以篮球的比赛规则

 1 # -*- coding: utf-8 -*-
 2 from random import random
 3 def printIntro():
 4     print("这个程序模拟两个队伍A和B的篮球比赛")
 5     print("程序运行需要A和B队伍的平均能力值(以0到1之间的小数表示)")
 6 def getInput():
 7     probA=eval(input("请输入队伍A的平均能力值(0-1):"))
 8     probB=eval(input("请输入队伍B的平均能力值(0-1):"))
 9     n=eval(input("模拟比赛场次:"))
10     return probA,probB,n
11 def Games(n,probA,probB):            #全部比赛场次的各胜方总数分析
12     A,B=0,0
13     for i in range(n):
14         a=fourGames(probA,probB)
15         if a=="A":
16             A+=1
17         else:
18             B+=1
19     return A,B
20 def fourGames(probA,probB):          #一场比赛的胜利方判断
21     scoreA,scoreB=0,0
22     for i in range(4):
23         scoreA,scoreB=onejieGame(probA,probB)
24     if scoreA>scoreB:
25         return 'A'
26     return 'B'
27 def onejieGame(probA,probB):         #一小节比赛的比分总结
28     scoreA,scoreB=0,0
29     serving="A"
30     while not gameOver(scoreA,scoreB):
31         a=random()
32         if serving=="A":
33             if a<probA:
34                 scoreA+=2
35             else:
36                 serving="B"
37         else:
38             if a<probB:
39                 scoreB+=2
40             else:
41                 serving="A"
42     return scoreA,scoreB
43 def gameOver(a,b):
44   return a==16 or b==16
45 def printsummary(A,B):
46     n=A+B
47     print("竞技开始分析,共模拟了{}场比赛".format(n))
48     print("选手A获胜{}场比赛,占比{:0.1%}".format(A,A/n))
49     print("选手B获胜{}场比赛,占比{:0.1%}".format(B,B/n))
50     print("分析人:Yong No.10")
51 def main():
52     printIntro()
53     probA,probB,n=getInput()
54     A,B=Games(n,probA,probB)
55     printsummary(A,B)
56 main()
57 input()

再来观看其效果:

模拟体育竞技分析

打包的效果,也和上面一样,就是在打包时改一下文件名就可以了。

三、下面更高级的是晋级比赛(以四支队伍为例进行篮球比赛)

以下代码展示

 1 # -*- coding:utf-8 -*-
 2 from random import random
 3 def printIntro():
 4     print("这个程序模拟四支队伍A,B,C,D的篮球比赛,赛制采取晋级制")
 5     print("程序运行需要A,B,C,D队伍的平均能力值(以0到1之间的小数表示)")
 6 def getInput():
 7     probA=eval(input("请输入队伍A的平均能力值(0-1):"))
 8     probB=eval(input("请输入另一支队伍B的平均能力值(0-1):"))
 9     print("\n")
10     return probA,probB
11 def fourGames(x,y):          #一场比赛的胜利方判断
12     scoreA,scoreB=0,0
13     for i in range(4):
14         scoreA,scoreB=onejieGame(x,y)
15     if scoreA>scoreB:
16         return 'A'
17     return 'B'
18 def onejieGame(x,y):         #一小节比赛的比分总结
19     scoreA,scoreB=0,0
20     serving="A"
21     while not gameOver(scoreA,scoreB):
22         a=random()
23         if serving=="A":
24             if a<x:
25                 scoreA+=2
26             else:
27                 serving="B"
28         else:
29             if a<y:
30                 scoreB+=2
31             else:
32                 serving="A"
33     return scoreA,scoreB
34 
35 def gameOver(a,b):
36     return a==16 or b==16
37 def printmean(c):
38     print("竞技开始:")
39     print("经过激烈的比赛,最终队伍{}获得了比赛".format(c))
40     print("恭喜{}队伍晋级!".format(c))
41     print("\n")
42 printIntro()
43 x,y=getInput()
44 c=fourGames(x,y)
45 printmean(c)
46 print("请再次输入其余两支队伍的平均能力值")
47 x,y=getInput()
48 d=fourGames(x,y)
49 printmean(d)
50 print("晋级双方是{}和{}".format(c,d))
51 print("\n")
52 print("请输入两支晋级队伍平均能力值")
53 x,y=getInput()
54 e=fourGames(x,y)
55 print("恭喜{}获得本次比赛的总冠军!".format(e))

观看效果:

模拟体育竞技分析

再看看独立执行的效果:

模拟体育竞技分析

 好了,以上就是体育竞技的一些例子,有兴趣的童鞋可以去看看其他比赛的效果哈。

另外,以上的程序要想知道其结果是否合理或者条件是否正确,可以采用测试函数的方式对程序进行调试。例如:

以上面的gameOver函数为例,代码如下:

1 def gameOver(a,b):
2     if (a>=11 and b<11) or (b>=11 and a<11) or (a>9 and b>9 and ((a-b)>=2 or (b-a)>=2)):
3         return True
4     return False
5 try:
6     print(gameOver(11,10))
7 except:
8     print('Error')

再来看看测试的结果

模拟体育竞技分析

返回是一个判断值,可以再更改其中的参数进行调试。