Python小白之程序设计方法(体育竞技分析)

时间:2022-01-17 04:56:32

学习目标

  • 了解计算思维的概念
  • 掌握自顶向下的设计方法
  • 掌握自底向上的执行过程
  • 了解计算机生态和模块编程思想
  • 掌握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:\Users\Benny>pip install pyinstaller

    打包

  3. :\>pyisntaller dpython.py 或
    :\>pyinstaller D:\codes\dpython.py

    生成一个独立可执行文件

    :\>pyinstaller -F dpython.py

     

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

    n=input("请输入按键退出")

     

  5. 截图如下:

Python小白之程序设计方法(体育竞技分析)

 三、足球比赛出线问题

规则:

  • 赛制:单循环积分赛
  • 胜场得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,

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

未完待续》》》