一、下面是一个体育竞技模拟,就是输入比赛队伍的平均能力值,就可以判断出比赛的输赢。
下面先来说一下比赛规则:(以兵乓球比赛规则为例)
下面来看一段代码
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')
再来看看测试的结果
返回是一个判断值,可以再更改其中的参数进行调试。