体育竞技分析

【基础介绍】

体育竞技分析:模拟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()
MatchAnalysisI

 

                                   ——结果——

 

 实际问题:

(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()    
MatchAnalysisII

 

 

 

                                          ——结果——

 

 

最后 利用pyinstaller库将该文件打包

在cmd中运行命令pyinstaller -F MatchAnalysisII.py

 

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

 

即可发现打包文件

 

快试试吧

 

posted @ 2020-04-18 21:33  Ni__23  阅读(314)  评论(0)    收藏  举报