• Python 作业( 模拟体育竞技比赛 )


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

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

    1. 前4局比赛采用25分制,每个队只有赢得至少25分,并同时超过对方2分时 ,才胜1局。
    2. 正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按原位置顺序继续比赛到结束。
    3. 在决胜局(第五局)之比赛,先获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文件。

      

    最后就是程序效果:

  • 相关阅读:
    JavaWeb与JSP初识
    doT.js灵活运用之嵌入使用
    避免数据二次提交的处理方式
    Intellij Idea创建的第一个JavaWeb程序
    JavaWeb简单介绍
    Java网络编程初探
    windows下如何安装和启动MySQL
    PhpStorm配置svn时提示需要证书:authentication required的解决方法,总是弹出
    正则神器,RegexBuddy
    2-3 tree使用
  • 原文地址:https://www.cnblogs.com/Lincoln-Wong/p/12935890.html
Copyright © 2020-2023  润新知