体育竞技分析
【基础介绍】
体育竞技分析:模拟N场比赛
计算思维:抽象 + 自动化
模拟:抽象比赛过程,自动模拟N场比赛,当N越大时,比赛结果分析越科学。
思维方式:自顶向下(以一个总问题开始,试图把它表示为很多个小问题的组成的解决方案)
步骤:
1.打印程序的介绍性信息式
2获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次)
3利用球员AB的能力值,模拟n场比赛
4输出球员AB获胜的场次及概率

——实现过程——
1 from random import random 2 def printIntro(): 3 print("这个程序模拟两个选手A和B的某种竞技比赛") 4 print("程序运行需要A和B的能力值(以0到1之间的小数表示)") 5 def getInputs(): 6 a = eval(input("请输入选手A的能力值(0-1): ")) 7 b = eval(input("请输入选手B的能力值(0-1): ")) 8 n = eval(input("模拟比赛的场次: ")) 9 return a, b, n 10 def simNGames(n, probA, probB): 11 winsA, winsB = 0, 0 12 for i in range(n): 13 scoreA, scoreB = simOneGame(probA, probB) 14 if scoreA > scoreB: 15 winsA += 1 16 else: 17 winsB += 1 18 return winsA, winsB 19 def gameOver(a,b): 20 return a==15 or b==15 21 def simOneGame(probA, probB): 22 scoreA, scoreB = 0, 0 23 serving = "A" 24 while not gameOver(scoreA, scoreB): 25 if serving == "A": 26 if random() < probA: 27 scoreA += 1 28 else: 29 serving="B" 30 else: 31 if random() < probB: 32 scoreB += 1 33 else: 34 serving="A" 35 return scoreA, scoreB 36 def printSummary(winsA, winsB): 37 n = winsA + winsB 38 print("竞技分析开始,共模拟{}场比赛".format(n)) 39 print("选手A获胜{}场比赛,占比{:.2f}%".format(winsA, winsA/n*100)) 40 print("选手B获胜{}场比赛,占比{:.2f}%".format(winsB, winsB/n*100)) 41 def main(): 42 printIntro() 43 probA, probB, n = getInputs() 44 winsA, winsB = simNGames(n, probA, probB) 45 printSummary(winsA, winsB) 46 main()


——结果——

实际问题:
(1)模拟体育竞技分析:(不同学号选座不同题目)
采用乒乓球比赛规则(学号尾号为0,1,2,3必做)
赛制:在一局比赛中,先得11分的一方为胜方;10平后,先多的2分的一份为胜方。
一场比赛:单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜制。
——实现过程——
1 from random import random 2 def printIntro(): #打印程序介绍信息 3 print("学号最后两位数为:12") 4 print("这个程序模拟两个选手A和B的某种竞技比赛") 5 print("程序运行需要A和B的能力值(以0到1之间的小数表示)") 6 print("模拟乒乓球竞技分析") 7 print("单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜制") 8 9 def getInputs1(): #获取单打球员能力值 10 print() 11 print("您选择的比赛类型是:单打淘汰赛") 12 a = eval(input("请输入球员(球队)A的能力值(0-1):")) 13 b = eval(input("请输入球员(球队)B的能力值(0-1):")) 14 N = eval(input("请输入模拟比赛的场次:")) 15 return a,b,N 16 17 def getInputs2(): #获取双打球员能力值 18 print() 19 print("您选择的比赛类型是:双打淘汰赛") 20 print("请输入A队的参赛队员的能力值(0-1):") 21 a1 = eval(input("请输入第一位运动员的能力值:")) 22 a2 = eval(input("请输入第二位运动员的能力值:")) 23 print("请输入B队的参赛队员的能力值(0-1)") 24 b1 = eval(input("请输入第一位运动员的能力值:")) 25 b2 = eval(input("请输入第二位运动员的能力值:")) 26 N = eval(input("请输入模拟比赛的场次:")) 27 averproA = (a1+a2)/2 28 averproB = (b1+b2)/2 29 return averproA,averproB,N 30 31 def getInputs3(): #获取团体赛球员能力值 32 print() 33 print("您选择的比赛类型是:团体赛") 34 print("请输入A队的参赛队员的能力值(0-1)") 35 proA1 = eval(input("请输入第一位运动员的能力值:")) 36 proA2 = eval(input("请输入第二位运动员的能力值:")) 37 proA3 = eval(input("请输入第三位运动员的能力值:")) 38 proA4 = eval(input("请输入第四位运动员的能力值:")) 39 proA5 = eval(input("请输入第五位运动员的能力值:")) 40 print("请输入B队的参赛队员的能力值(0-1)") 41 proB1 = eval(input("请输入第一位运动员的能力值:")) 42 proB2 = eval(input("请输入第二位运动员的能力值:")) 43 proB3 = eval(input("请输入第三位运动员的能力值:")) 44 proB4 = eval(input("请输入第四位运动员的能力值:")) 45 proB5 = eval(input("请输入第五位运动员的能力值:")) 46 N = eval(input("请输入模拟比赛场次:")) 47 return proA1,proA2,proA3,proA4,proA5,proB1,proB2,proB3,proB4,proB5,N 48 49 def GameOver(scoreA,scoreB): #比赛结束 50 if scoreA >= 11 and scoreA - scoreB >= 2: 51 return scoreA 52 if scoreB >= 11 and scoreB - scoreA >= 2: 53 return scoreB 54 55 def simOneGame(proA,proB): #进行一场比赛 56 scoreA,scoreB = 0,0 57 serving = "A" 58 while not GameOver(scoreA,scoreB): 59 if serving == "A": 60 if random() < proA: 61 scoreA += 1 62 else: 63 scoreB += 1 64 serving == "B" 65 else: 66 if random() < proB: 67 scoreB += 1 68 else: 69 scoreA += 1 70 serving == "A" 71 return scoreA,scoreB 72 73 def simAllGame(proA,proB): #进行一场比赛 74 winA,winB = 0,0 75 for i in range(7): 76 scoreA,scoreB = simOneGame(proA,proB) 77 if scoreA > scoreB: 78 winA += 1 79 else: 80 winB += 1 81 if winA == 4 or winB == 4: 82 break 83 return winA,winB 84 85 def simNGame(N,proA,proB): #进行N场比赛 86 winsA,winsB = 0,0 87 for i in range(N): 88 scoreA,scoreB = simAllGame(proA,proB) 89 if scoreA > scoreB: 90 winsA += 1 91 else: 92 winsB += 1 93 return winsA,winsB 94 95 def simTeamGame(N,proA1,proA2,proA3,proA4,proA5,proB1,proB2,proB3,proB4,proB5): 96 teamA,teamB = 0,0 97 A,B = 0,0 98 for i in range(N): 99 A1,B1 = simNGame(1000,proA1,proB1) 100 if A1 > B1: 101 A += 1 102 else: 103 B += 1 104 A2,B2 = simNGame(1000,proA2,proB2) 105 if A2 > B2: 106 A += 1 107 else: 108 B += 1 109 A3,B3 = simNGame(1000,proA3,proB3) 110 if A3 > B3: 111 A += 1 112 else: 113 B += 1 114 if A >= 3: 115 teamA += 1 116 A,B = 0,0 117 elif B >= 3: 118 teamB += 1 119 A,B = 0,0 120 else: 121 A4,B4 = simNGame(1000,proA4,proB4) 122 if A4 > B4: 123 A += 1 124 else: 125 B += 1 126 if A >= 3: 127 teamA += 1 128 A,B = 0,0 129 elif B >= 3: 130 teamB += 1 131 A,B = 0,0 132 else: 133 A5,B5 = simNGame(1000,proA5,proB5) 134 if A5 > B5: 135 A += 1 136 else: 137 B += 1 138 if A >= 3: 139 teamA += 1 140 A,B = 0,0 141 elif B >= 3: 142 teamB += 1 143 A,B = 0,0 144 return teamA,teamB 145 146 147 def getOutputs1(): 148 proA,proB,N = getInputs1() 149 winsA,winsB = simNGame(N,proA,proB) 150 print("模拟单打") 151 print("竞技分析开始,共模拟{}场比赛".format(N)) 152 print("球员A共赢得{}场比赛,获胜概率是{:.2f}%".format(winsA,winsA/N*100)) 153 print("球员B共赢得{}场比赛,获胜概率是{:.2f}%".format(winsB,winsB/N*100)) 154 print("模拟分析结束") 155 156 def getOutputs2(): 157 averproA,averproB,N = getInputs2() 158 winsA,winsB = simNGame(N,averproA,averproB) 159 print("模拟双打") 160 print("竞技分析开始,共模拟{}场比赛".format(N)) 161 print("球队A共赢得{}场比赛,获胜概率是{:.2f}%".format(winsA,winsA/N*100)) 162 print("球队B共赢得{}场比赛,获胜概率是{:.2f}%".format(winsB,winsB/N*100)) 163 print("模拟分析结束") 164 165 def getOutputs3(): 166 proA1,proA2,proA3,proA4,proA5,proB1,proB2,proB3,proB4,proB5,N = getInputs3() 167 teamA,teamB = simTeamGame(N,proA1,proA2,proA3,proA4,proA5, 168 proB1,proB2,proB3,proB4,proB5) 169 print("模拟团体赛") 170 print("竞技分析开始,共模拟{}场比赛".format(N)) 171 print("球队A共赢得{}场比赛,获胜概率是{:.2f}%".format(teamA,teamA/N*100)) 172 print("球队B共赢得{}场比赛,获胜概率是{:.2f}%".format(teamB,teamB/N*100)) 173 print("模拟分析结束") 174 175 def main(): 176 printIntro() 177 x = 1 178 while x == 1: 179 print("请选择模拟比赛类型") 180 print("一、单打淘汰赛") 181 print("二、双打淘汰赛") 182 print("三、团体赛") 183 print("四、模拟分析结束") 184 choice = eval(input("请输入比赛类型的序号:")) 185 if choice == 1: 186 getOutputs1() 187 elif choice == 2: 188 getOutputs2() 189 elif choice == 3: 190 getOutputs3() 191 elif choice == 4: 192 print("模拟分析结束") 193 break 194 else: 195 print("请输入比赛类型对应序号(1-4)") 196 print() 197 main() 198 199 from random import random 200 def printIntro(): #打印程序介绍信息 201 print("学号最后两位数为:12") 202 print("这个程序模拟两个选手A和B的某种竞技比赛") 203 print("程序运行需要A和B的能力值(以0到1之间的小数表示)") 204 print("模拟乒乓球竞技分析") 205 print("单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜制") 206 207 def getInputs1(): #获取单打球员能力值 208 print() 209 print("您选择的比赛类型是:单打淘汰赛") 210 a = eval(input("请输入球员(球队)A的能力值(0-1):")) 211 b = eval(input("请输入球员(球队)B的能力值(0-1):")) 212 N = eval(input("请输入模拟比赛的场次:")) 213 return a,b,N 214 215 def getInputs2(): #获取双打球员能力值 216 print() 217 print("您选择的比赛类型是:双打淘汰赛") 218 print("请输入A队的参赛队员的能力值(0-1):") 219 a1 = eval(input("请输入第一位运动员的能力值:")) 220 a2 = eval(input("请输入第二位运动员的能力值:")) 221 print("请输入B队的参赛队员的能力值(0-1)") 222 b1 = eval(input("请输入第一位运动员的能力值:")) 223 b2 = eval(input("请输入第二位运动员的能力值:")) 224 N = eval(input("请输入模拟比赛的场次:")) 225 averproA = (a1+a2)/2 226 averproB = (b1+b2)/2 227 return averproA,averproB,N 228 229 def getInputs3(): #获取团体赛球员能力值 230 print() 231 print("您选择的比赛类型是:团体赛") 232 print("请输入A队的参赛队员的能力值(0-1)") 233 proA1 = eval(input("请输入第一位运动员的能力值:")) 234 proA2 = eval(input("请输入第二位运动员的能力值:")) 235 proA3 = eval(input("请输入第三位运动员的能力值:")) 236 proA4 = eval(input("请输入第四位运动员的能力值:")) 237 proA5 = eval(input("请输入第五位运动员的能力值:")) 238 print("请输入B队的参赛队员的能力值(0-1)") 239 proB1 = eval(input("请输入第一位运动员的能力值:")) 240 proB2 = eval(input("请输入第二位运动员的能力值:")) 241 proB3 = eval(input("请输入第三位运动员的能力值:")) 242 proB4 = eval(input("请输入第四位运动员的能力值:")) 243 proB5 = eval(input("请输入第五位运动员的能力值:")) 244 N = eval(input("请输入模拟比赛场次:")) 245 return proA1,proA2,proA3,proA4,proA5,proB1,proB2,proB3,proB4,proB5,N 246 247 def GameOver(scoreA,scoreB): #比赛结束 248 if scoreA >= 11 and scoreA - scoreB >= 2: 249 return scoreA 250 if scoreB >= 11 and scoreB - scoreA >= 2: 251 return scoreB 252 253 def simOneGame(proA,proB): #进行一场比赛 254 scoreA,scoreB = 0,0 255 serving = "A" 256 while not GameOver(scoreA,scoreB): 257 if serving == "A": 258 if random() < proA: 259 scoreA += 1 260 else: 261 scoreB += 1 262 serving == "B" 263 else: 264 if random() < proB: 265 scoreB += 1 266 else: 267 scoreA += 1 268 serving == "A" 269 return scoreA,scoreB 270 271 def simAllGame(proA,proB): #进行一场比赛 272 winA,winB = 0,0 273 for i in range(7): 274 scoreA,scoreB = simOneGame(proA,proB) 275 if scoreA > scoreB: 276 winA += 1 277 else: 278 winB += 1 279 if winA == 4 or winB == 4: 280 break 281 return winA,winB 282 283 def simNGame(N,proA,proB): #进行N场比赛 284 winsA,winsB = 0,0 285 for i in range(N): 286 scoreA,scoreB = simAllGame(proA,proB) 287 if scoreA > scoreB: 288 winsA += 1 289 else: 290 winsB += 1 291 return winsA,winsB 292 293 def simTeamGame(N,proA1,proA2,proA3,proA4,proA5,proB1,proB2,proB3,proB4,proB5): 294 teamA,teamB = 0,0 295 A,B = 0,0 296 for i in range(N): 297 A1,B1 = simNGame(1000,proA1,proB1) 298 if A1 > B1: 299 A += 1 300 else: 301 B += 1 302 A2,B2 = simNGame(1000,proA2,proB2) 303 if A2 > B2: 304 A += 1 305 else: 306 B += 1 307 A3,B3 = simNGame(1000,proA3,proB3) 308 if A3 > B3: 309 A += 1 310 else: 311 B += 1 312 if A >= 3: 313 teamA += 1 314 A,B = 0,0 315 elif B >= 3: 316 teamB += 1 317 A,B = 0,0 318 else: 319 A4,B4 = simNGame(1000,proA4,proB4) 320 if A4 > B4: 321 A += 1 322 else: 323 B += 1 324 if A >= 3: 325 teamA += 1 326 A,B = 0,0 327 elif B >= 3: 328 teamB += 1 329 A,B = 0,0 330 else: 331 A5,B5 = simNGame(1000,proA5,proB5) 332 if A5 > B5: 333 A += 1 334 else: 335 B += 1 336 if A >= 3: 337 teamA += 1 338 A,B = 0,0 339 elif B >= 3: 340 teamB += 1 341 A,B = 0,0 342 return teamA,teamB 343 344 345 def getOutputs1(): 346 proA,proB,N = getInputs1() 347 winsA,winsB = simNGame(N,proA,proB) 348 print("模拟单打") 349 print("竞技分析开始,共模拟{}场比赛".format(N)) 350 print("球员A共赢得{}场比赛,获胜概率是{:.2f}%".format(winsA,winsA/N*100)) 351 print("球员B共赢得{}场比赛,获胜概率是{:.2f}%".format(winsB,winsB/N*100)) 352 print("模拟分析结束") 353 354 def getOutputs2(): 355 averproA,averproB,N = getInputs2() 356 winsA,winsB = simNGame(N,averproA,averproB) 357 print("模拟双打") 358 print("竞技分析开始,共模拟{}场比赛".format(N)) 359 print("球队A共赢得{}场比赛,获胜概率是{:.2f}%".format(winsA,winsA/N*100)) 360 print("球队B共赢得{}场比赛,获胜概率是{:.2f}%".format(winsB,winsB/N*100)) 361 print("模拟分析结束") 362 363 def getOutputs3(): 364 proA1,proA2,proA3,proA4,proA5,proB1,proB2,proB3,proB4,proB5,N = getInputs3() 365 teamA,teamB = simTeamGame(N,proA1,proA2,proA3,proA4,proA5, 366 proB1,proB2,proB3,proB4,proB5) 367 print("模拟团体赛") 368 print("竞技分析开始,共模拟{}场比赛".format(N)) 369 print("球队A共赢得{}场比赛,获胜概率是{:.2f}%".format(teamA,teamA/N*100)) 370 print("球队B共赢得{}场比赛,获胜概率是{:.2f}%".format(teamB,teamB/N*100)) 371 print("模拟分析结束") 372 373 def main(): 374 printIntro() 375 x = 1 376 while x == 1: 377 print("请选择模拟比赛类型") 378 print("一、单打淘汰赛") 379 print("二、双打淘汰赛") 380 print("三、团体赛") 381 print("四、模拟分析结束") 382 choice = eval(input("请输入比赛类型的序号:")) 383 if choice == 1: 384 getOutputs1() 385 elif choice == 2: 386 getOutputs2() 387 elif choice == 3: 388 getOutputs3() 389 elif choice == 4: 390 print("模拟分析结束") 391 break 392 else: 393 print("请输入比赛类型对应序号(1-4)") 394 print() 395 main()





——结果——

最后 利用pyinstaller库将该文件打包
在cmd中运行命令pyinstaller -F MatchAnalysisII.py

接着根据cmd中倒数第二行提示找到dist文件

即可发现打包文件

快试试吧

浙公网安备 33010602011771号