本文尝试采用面向对象的设计方法来进行排球比赛分析
排球比赛的基本规则如下:
- 前4局比赛采用25分制,每个队只有赢得至少25分,并同时超过对方2分时 ,才胜1局。
- 正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按原位置顺序继续比赛到结束。
- 在决胜局(第五局)之比赛,先获15分并领先对方2分为胜。
下面就放出代码:
1 from random import * 2 3 #定义一个Info类,功能是打印介绍性信息,并且获得用户输入的两队伍能力值,模拟场次 4 class Info: 5 def __init__(self): 6 print('19信计2班15号模拟体育竞技程序') 7 print('这个程序是模拟两支队伍A和B的排球比赛') 8 print('程序运行需要A和B的能力值(以0到1之间的小数表示)') 9 def GetInput(self): 10 A = eval(input('请输入队伍A的能力值(0-1):')) 11 B = eval(input('请输入队伍B的能力值(0-1):')) 12 N = eval(input('模拟比赛场次:')) 13 return A, B, N 14 15 #定义了一个OneGame类,功能是用来完成一场5局3胜制的比赛 16 class OneGame: 17 def simOneGame(self, probA, probB): 18 A_win, B_win, count = 0, 0, 1 19 while not (A_win == 3 or B_win == 3): 20 serving = choice(['A', 'B']) #这里我选择的是随机开球方 21 scoreA, scoreB = 0, 0 22 while not OneGame.Gameover(count, scoreA, scoreB): 23 if serving == 'A': 24 if random() < probA: 25 scoreA += 1 26 else: 27 serving = 'B' 28 else: 29 if random() < probB: 30 scoreB += 1 31 else: 32 serving = 'A' 33 if scoreA > scoreB : 34 A_win += 1 35 else: 36 B_win += 1 37 if count == 5: 38 count = 1 39 count += 1 40 return A_win, B_win 41 42 @classmethod 43 def Gameover(self, count, scoreA, scoreB): #这个函数是用来判断比赛是否结束 44 if count < 5: 45 return (scoreA >= 25 or scoreB >= 25) and abs(scoreA - scoreB) >= 2 46 else: 47 return (scoreA >= 15 or scoreB >= 15) and abs(scoreA - scoreB) >= 2 48 49 #定义了一个NGame类,继承了OneGame的属性和方法,功能是完成N场5局3胜制比赛 50 class NGame(OneGame): 51 def simNGames(self, n, A, B): 52 winsA, winsB = 0, 0 53 for i in range(n): 54 win_numA, win_numB = self.simOneGame(A, B) 55 if win_numA > win_numB: 56 winsA += 1 57 else: 58 winsB += 1 59 return winsA, winsB 60 61 #定义了一个PrintSummary类,功能是打印比赛结果 62 class PrintSummary: 63 def __init__(self, N, winA, winB): 64 print('竞技分析开始,共模拟{}场比赛'.format(N)) 65 print('队伍A获胜{}场比赛,占比{:.2f}%'.format(winA, winA/N * 100)) 66 print('队伍B获胜{}场比赛,占比{:.2f}%'.format(winB, winB/N * 100)) 67 68 def main(): 69 match_info = Info() #创建一个Info对象 70 A, B, N = match_info.GetInput() #使用Info类的GetInput方法获得能力值和场次 71 match = NGame() #创建一个NGame对象 72 A_win, B_win = match.simNGames(N, A, B) #获得A, B两队获胜的比赛场数 73 PrintSummary(N, A_win, B_win) #打印比赛结果 74 input("please input any key to exit!") 75 76 main()
接着,我使用pyinstaller库对该代码进行打包,有两种方法:
(1)、在cmd控制台输入 pyinstaller -F (文件的绝对路径)再按回车即可。
成功打包后会出现XXX completed successfully,而且会有打包结束后产生的exe文件的路径显示,如:
(2)、在需要打包的文件的当前文件夹中,按Shift+鼠标右键会出现打开power shell的选项,如:
在Powershell窗口中输入 pyinstaller -F 文件名 即可打包,同样,打包成功后会出现conpleted successfully,并且直接在当前文件夹产生exe文件。
最后就是程序效果: