学习目标
- 了解计算思维的概念
- 掌握自顶向下的设计方法
- 掌握自底向上的执行过程
- 了解计算机生态和模块编程思想
- 掌握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,
现在对这五支球队进行单循环赛模拟:
未完待续》》》