• 模拟体育竞技分析


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

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

    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("
    ")
    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("
    ")
    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("
    ")
    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')

    再来看看测试的结果

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

  • 相关阅读:
    【足迹C++primer】32、定制操作_2
    pom文件miss artifact com.sun:tools:jar:1.5.0:system问题
    cents上运行wget报错:unable to resolve host address
    怎样定义函数模板
    06006_redis数据存储类型——String
    雷林鹏分享:C# 类型转换
    雷林鹏分享:C# 运算符
    雷林鹏分享:C# 循环
    雷林鹏分享:C# 判断
    雷林鹏分享:C# 方法
  • 原文地址:https://www.cnblogs.com/liyanyinng/p/10852790.html
Copyright © 2020-2023  润新知