python简单体育竞技模拟_Python 作业( 模拟体育竞技比赛 )

本文尝试采用面向对象的设计方法来进行排球比赛分析

排球比赛的基本规则如下:

前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 (文件的绝对路径)再按回车即可。

ea7e43214a51aeea45bf8bc08b814a4a.png

成功打包后会出现XXX completed successfully,而且会有打包结束后产生的exe文件的路径显示,如:

d432565a1c2bef8d758c1da0fb461cd8.png

(2)、在需要打包的文件的当前文件夹中,按Shift+鼠标右键会出现打开power shell的选项,如:

134ae07a34f7d051a12907e0c506862c.png

在Powershell窗口中输入 pyinstaller -F 文件名 即可打包,同样,打包成功后会出现conpleted successfully,并且直接在当前文件夹产生exe文件。

8bfd4151f8af71a1f9a9dddc34e4c6c7.png

最后就是程序效果:

c9c1cd6171c078bf7f590414ce0f08b0.png

来源:https://www.cnblogs.com/Lincoln-Wong/p/12935890.html

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值