zoukankan      html  css  js  c++  java
  • Python小白之程序设计方法(体育竞技分析)

    学习目标

    • 了解计算思维的概念
    • 掌握自顶向下的设计方法
    • 掌握自底向上的执行过程
    • 了解计算机生态和模块编程思想
    • 掌握Python第三方库的安装方法
    • 掌握Python源文件的打包方法

    一、体育竞技分析实例:

    1.设规则如下:

    • 21分制,三局两胜为佳
    • 每球得分制
    • 每回合中取胜的一方的一分
    • 双方均为20分时,领先对方2分一方获胜
    • 双方均为29分时,先到达30分一方获胜
    • 一局比赛中获胜方在下一局率先开球

    2.Python 3.x 代码(自顶向下的设计方法)如下:

     1 from random import random
     2 
     3 print("学号尾数09")
     4 
     5 def printIntro():
     6     
     7     print("这个程序模拟两个选手A和B的羽毛球竞技比赛")
     8     print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
     9 def getInputs():
    10     a = eval(input("请输入选手A的能力值(0-1): "))
    11     b = eval(input("请输入选手B的能力值(0-1): "))
    12     n = eval(input("模拟比赛的场次: "))
    13     m = eval(input("模拟次数:"))
    14     return a, b, n, m
    15 def simNGames(n, probA, probB):
    16     winsA, winsB = 0, 0
    17     scoreA_ls=[]
    18     scoreB_ls=[]
    19     for i in range(n):
    20         scoreA, scoreB = simOneGame(probA, probB)
    21         scoreA_ls.append(scoreA)
    22         scoreB_ls.append(scoreB)
    23         if scoreA > scoreB:
    24             winsA += 1
    25         else:
    26             winsB += 1
    27     return winsA, winsB,scoreA_ls,scoreB_ls
    28 def gameOver(a,b):
    29     if(a>=20 or b>=20):
    30         if(abs(a-b)==2 and a<=29 and b<=29):
    31             return True
    32         else:
    33             return a==30 or b==30
    34     else:
    35         return False
    36 def simOneGame(probA, probB):
    37     scoreA, scoreB = 0, 0
    38     serving = "A"
    39     while not gameOver(scoreA, scoreB):
    40         if serving == "A":
    41             if random() < probA:
    42                 scoreA += 1
    43             else:
    44                 serving="B"
    45         else:
    46             if random() < probB:
    47                 scoreB += 1
    48             else:
    49                 serving="A"
    50     return scoreA, scoreB
    51 def printSummary(winsA, winsB,m,scoreA_ls,scoreB_ls):
    52     n = winsA + winsB
    53     print("模型模拟次数{}".format(m))
    54     print("竞技分析开始,共模拟{}场比赛".format(n))
    55     print("A选手各场次得分比分:")
    56     print(scoreA_ls)
    57     print("B选手各场次得分比分:")
    58     print(scoreB_ls)
    59     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    60     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
    61 def main():
    62     printIntro()
    63     probA, probB, n, m= getInputs()
    64     for i in range(m):
    65         winsA, winsB,scoreA_ls,scoreB_ls = simNGames(n, probA, probB)
    66         printSummary(winsA, winsB,m,scoreA_ls,scoreB_ls)
    67     
    68 main()

    3.运行输入及结果:

    学号尾数09
    这个程序模拟两个选手A和B的羽毛球竞技比赛
    程序运行需要A和B的能力值(以0到1之间的小数表示)
    
    请输入选手A的能力值(0-1): 0.5
    
    请输入选手B的能力值(0-1): 0.5
    
    模拟比赛的场次: 5
    
    模拟次数:5
    模型模拟次数5
    竞技分析开始,共模拟5场比赛
    A选手各场次得分比分:
    [30, 24, 19, 30, 21]
    B选手各场次得分比分:
    [17, 30, 21, 16, 19]
    选手A获胜3场比赛,占比60.0%
    选手B获胜2场比赛,占比40.0%
    模型模拟次数5
    竞技分析开始,共模拟5场比赛
    A选手各场次得分比分:
    [27, 26, 21, 30, 20]
    B选手各场次得分比分:
    [25, 28, 19, 20, 22]
    选手A获胜3场比赛,占比60.0%
    选手B获胜2场比赛,占比40.0%
    模型模拟次数5
    竞技分析开始,共模拟5场比赛
    A选手各场次得分比分:
    [18, 20, 21, 30, 20]
    B选手各场次得分比分:
    [20, 18, 19, 19, 18]
    选手A获胜4场比赛,占比80.0%
    选手B获胜1场比赛,占比20.0%
    模型模拟次数5
    竞技分析开始,共模拟5场比赛
    A选手各场次得分比分:
    [30, 23, 20, 20, 18]
    B选手各场次得分比分:
    [16, 21, 18, 30, 20]
    选手A获胜3场比赛,占比60.0%
    选手B获胜2场比赛,占比40.0%
    模型模拟次数5
    竞技分析开始,共模拟5场比赛
    A选手各场次得分比分:
    [18, 18, 30, 19, 30]
    B选手各场次得分比分:
    [30, 20, 21, 21, 17]
    选手A获胜2场比赛,占比40.0%
    选手B获胜3场比赛,占比60.0%

    二、使用pyinstaller对上述代码文件打包成可执行文件(可在没有安装Python的环境中运行)

    方法如下:

    1. 安装pyinstaller:在命令行(控制台)下用pip安装,如
    2. C:UsersBenny>pip install pyinstaller

      打包

    3. :>pyisntaller dpython.py 或
      :>pyinstaller D:codesdpython.py

      生成一个独立可执行文件

      :>pyinstaller -F dpython.py
    4.  如果遇到生成文件运行后闪退的问题:可以在程序最后加上

      n=input("请输入按键退出")
    5. 截图如下:

     三、足球比赛出线问题

    规则:

    • 赛制:单循环积分赛
    • 胜场得4分,平局得1分,负场不得分
    • 分数前四名出线

    假设:现有甲乙丙丁戊五支足球队伍进行比赛,历史战况统计如下:

    胜/平/负

    (概率)

        甲   
      0.5/0.3/0.2 0.5/0.2/0.3 0.4/0.4/0.2 0.3/0.4/0.3
        0.7/0.2/0.1 0.6/0.2/0.3 0.3/0.5/0.2
          0.3/0.5/0.2 0.3/0.4/0.3
            0.6/0.1/0.3
             

    即甲对乙:打胜概率为0.5,打平概率为0.3,打输概率为0.2;那么乙对甲:打胜概率为0.2,打平概率为0.3,打输概率为0.5,

    现在对这五支球队进行单循环赛模拟:

    未完待续》》》

  • 相关阅读:
    win32_弹弹球游戏
    蓝桥杯评测_前n项和
    算法_fibonacci_递归求值
    PTA 分类
    _tmain() 和 main()
    VS2010 C++ 插件 VissualAssistX 安装
    vs2010 > LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    int、long、long long 的取值范围
    B树 B-树 B+树 B*树
    PTA 5-10 公路村村通 (30)
  • 原文地址:https://www.cnblogs.com/shuxincheng/p/10856136.html
Copyright © 2011-2022 走看看