学习目标
- 了解计算思维的概念
- 掌握自顶向下的设计方法
- 掌握自底向上的执行过程
- 了解计算机生态和模块编程思想
- 掌握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的环境中运行)
方法如下:
- 安装pyinstaller:在命令行(控制台)下用pip安装,如
- C:\Users\Benny>pip install pyinstaller
打包 - :\>pyisntaller dpython.py 或
:\>pyinstaller D:\codes\dpython.py
生成一个独立可执行文件
:\>pyinstaller -F dpython.py
- 如果遇到生成文件运行后闪退的问题:可以在程序最后加上
n=input("请输入按键退出")
- 截图如下:
三、足球比赛出线问题
规则:
- 赛制:单循环积分赛
- 胜场得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,
现在对这五支球队进行单循环赛模拟