1. 程式人生 > >python初體驗 ——>>> 模擬體育競技

python初體驗 ——>>> 模擬體育競技

-s imp taf pandas 中文 div 圖片 shee while

python初體驗 ——>>> 模擬體育競技

一、排球訓練營

1. 簡介: 模擬不同的兩個隊伍進行排球的模擬比賽。

2. 模擬原理: 通過輸入各自的能力值(Ⅰ),模擬比賽的進行( P ),最後輸出模擬的結果( O )。

P 簡介:通過產生隨機數得到每局比賽的難度,若小於能力值則表示贏得本局比賽,反之輸掉本局比賽。

3. 規則簡介:

① 每場比賽采用 5局3勝制

前四局采用25分制,每個隊只有在贏得至少25分,且同時超過對方2分時才勝一局。

決勝局(第五局)采用15分制,先獲得15分,且同時超過對方2分為勝。

4. 準備就緒,就差代碼來實現了

插入代碼之前,先對代碼做個簡單的介紹:

函數名稱 函數說明
printInfo() 打印程序的介紹信息
getInputs() 獲得用戶輸入的參數
simNGames(n, probA, probB) 模擬n場比賽
simOneGame(probA, probB) 模擬一場比賽,包括五局,采取五局三勝制
simAGame(N, probA, probB) 模擬一局比賽
GameOver(N, scoreA, scoreB) 定義一局比賽的結束條件
printResult(n, winsA, winsB) 輸出模擬比賽的結果

好了,看看代碼吧,雖然有點長,但應該可以看懂 ^_^

  1 # -*- encoding:utf-8 -*-
  2 ‘‘‘
  3 模擬排球競技
  4 @author: bpf
  5 ‘‘‘
  6 # 比賽規則:
  7 # 1. 采用5局3勝制
  8 # 2. 前四局采用25分制,每個隊只有在贏得至少25分,且同時超過對方2分時才勝一局
  9 # 3. 決勝局(第五局)采用15分制,先獲得15分,且同時超過對方2分為勝
 10 
 11
from random import random 12 def printInfo(): 13 ‘‘‘ 14 function: 打印程序的介紹信息 15 ‘‘‘ 16 print("產品名稱: 排球競技模擬分析器") 17 print("產品概述: 通過輸入2個隊伍A和B的能力值(0到1之間的小數表示),能夠模擬多次2個隊伍A和B的排球競技比賽,從而得出各自的勝率!") 18 print("產品作者: 步平凡 - 04\n") 19 20 def getInputs(): 21 ‘‘‘ 22 function: 獲得用戶輸入的參數 23 ‘‘‘ 24 probA = eval(input("請輸入隊伍A的能力值(0~1):")) 25 probB = eval(input("請輸入隊伍B的能力值(0~1):")) 26 n = eval(input("請輸入需要模擬比賽的場次數:")) 27 return probA, probB, n 28 29 def simNGames(n, probA, probB): 30 ‘‘‘ 31 function: 模擬n場比賽 32 n: 模擬n場比賽 33 probA, probB: 分別為隊伍A和B的能力值 34 winA, winB: 隊伍A和B在一場比賽中獲勝的局數 35 winsA, winsB: 隊伍A和B贏得比賽的場數,總共n場 36 ‘‘‘ 37 winsA, winsB = 0, 0 38 for _ in range(n): 39 winA, winB = simOneGame(probA, probB) 40 if winA > winB: 41 winsA += 1 42 else: 43 winsB += 1 44 return winsA, winsB 45 46 def simOneGame(probA, probB): 47 ‘‘‘ 48 function: 模擬一場比賽,包括五局,采取五局三勝制 49 probA, probB: 分別為隊伍A和B的能力值 50 return: 返回隊伍A和B在本場比賽中獲勝的局數 51 scoreA, scoreB: 分別為隊伍A和B一局比賽獲得的分數 52 winA, winB: 分別為隊伍A和B一場比賽獲勝的局數 53 ‘‘‘ 54 N = 1 # 代表本次比賽的局次 55 winA, winB = 0, 0 56 for _ in range(5): 57 scoreA, scoreB = simAGame(N, probA, probB) 58 if scoreA > scoreB: 59 winA += 1 60 else: 61 winB += 1 62 N += 1 63 if winA == 3 or winB == 3: 64 break 65 return winA, winB 66 67 def simAGame(N, probA, probB): 68 ‘‘‘ 69 function: 模擬一局比賽 70 N: 代表本次比賽的局次 71 probA, probB: 分別為隊伍A和B的能力值 72 return: 返回隊伍A和B在本局比賽中獲得的分數 73 ‘‘‘ 74 scoreA, scoreB = 0, 0 # 分別為隊伍A和B一局比賽獲得的分數 75 serving = A # 發球方 76 while not GameOver(N, scoreA, scoreB): 77 if serving == A: 78 if random() > probA: 79 scoreB += 1 80 serving = B 81 else: 82 scoreA += 1 83 if serving == B: 84 if random() > probB: 85 scoreA += 1 86 serving = A 87 else: 88 scoreB += 1 89 return scoreA, scoreB 90 91 def GameOver(N, scoreA, scoreB): 92 ‘‘‘ 93 function: 定義一局比賽的結束條件 94 N: 代表當前局次(第五局為決勝局) 95 return: 若比賽結束的條件成立返回真,否則為假 96 ‘‘‘ 97 if N <= 4: 98 return (scoreA>=25 and scoreB>=25 and abs(scoreA-scoreB)>=2) 99 else: 100 return (scoreA>=15 and abs(scoreA-scoreB)>=2) or (scoreB>=15 and abs(scoreA-scoreB)>=2) 101 102 def printResult(n, winsA, winsB): 103 ‘‘‘ 104 function: 輸出模擬比賽的結果 105 ‘‘‘ 106 print("競技分析開始,共模擬{}場比賽。".format(n)) 107 print(">>>隊伍A獲勝{}場比賽,占比{:0.1%}".format(winsA,winsA/n)) 108 print(">>>隊伍B獲勝{}場比賽,占比{:0.1%}".format(winsB,winsB/n)) 109 110 if __name__ == "__main__": 111 printInfo() 112 probA, probB, n = getInputs() 113 winsA, winsB = simNGames(n, probA, probB) 114 printResult(n, winsA, winsB)

5. 運行結果展示,為了查看方便,我在cmd中運行代碼

技術分享圖片

二、足球訓練基地

1. 簡介: 模擬不同的兩個隊伍進行足球的模擬比賽。

2. 模擬原理: 通過輸入各自的能力值(Ⅰ),模擬比賽的進行( P ),最後輸出模擬的結果( O )。

P 簡介:通過產生隨機數得到每局比賽的難度,若小於能力值則表示贏得本局比賽,反之輸掉本場比賽。

3. 規則簡介:

① 每場比賽采用回合制。

② 一名球員在一個回合中未能合法擊打時,回合結束。本回合勝方得一分、得球權。

③ 先得15分贏得一場比賽。

4. 代碼實現

By the way, 此代碼與上述主要不同之處在於: GameOver(),其他函數都類似

函數名稱 函數說明
printInfo() 打印程序的介紹信息
getInputs() 獲得用戶輸入的參數
simNGames(n, probA, probB) 模擬n場比賽
simOneGame(probA, probB) 模擬一場比賽(此處只有一局)
GameOver(N, scoreA, scoreB) 定義一場比賽的結束條件
printResult(n, winsA, winsB) 輸出模擬比賽的結果

 1 # -*- encoding:utf-8 -*-
 2 ‘‘‘
 3 模擬足球競技
 4 @author: bpf
 5 ‘‘‘
 6 # 比賽規則:
 7 # 1. 采用回合制
 8 # 2. 一名球員在一個回合中未能合法擊打時,回合結束。本回合勝方得一分、得球權。
 9 # 3. 先得15分贏得一場比賽。
10 
11 from random import random
12 def printInfo():
13     ‘‘‘
14     function: 打印程序的介紹信息
15     ‘‘‘
16     print("產品名稱: 足球競技模擬分析器")
17     print("產品概述: 通過輸入2個隊伍A和B的能力值(0到1之間的小數表示),能夠模擬多次2個隊伍A和B的排球競技比賽,從而得出各自的勝率!")
18     print("產品作者: 步平凡 - 04\n")
19 
20 def getInputs():
21     ‘‘‘
22     function: 獲得用戶輸入的參數
23     ‘‘‘
24     probA = eval(input("請輸入隊伍A的能力值(0~1):"))
25     probB = eval(input("請輸入隊伍B的能力值(0~1):"))
26     n = eval(input("請輸入需要模擬比賽的場次數:"))
27     return probA, probB, n
28 
29 def simNGames(n, probA, probB):
30     ‘‘‘
31     function: 模擬n場比賽
32     n: 模擬n場比賽
33     probA, probB: 分別為隊伍A和B的能力值
34     winsA, winsB: 隊伍A和B贏得比賽的場數,總共n場
35     ‘‘‘
36     winsA, winsB = 0, 0
37     for _ in range(n):
38         scoreA, scoreB = simOneGame(probA, probB)
39         if scoreA > scoreB:
40             winsA += 1
41         else:
42             winsB += 1
43     return winsA, winsB
44 
45 def simOneGame(probA, probB):
46     ‘‘‘
47     function: 模擬一場比賽
48     probA, probB: 分別為隊伍A和B的能力值
49     scoreA, scoreB: 分別為隊伍A和B一場比賽的分數
50     return: 返回隊伍A和B在本場比賽中獲得的分數
51     ‘‘‘
52     scoreA, scoreB = 0, 0
53     serving = A            # 發球方
54     while not gameOver(scoreA, scoreB):
55         if serving == A:
56             if random() > probA:
57                 scoreB += 1
58                 serving = B
59             else:
60                 scoreA += 1
61         if serving == B:
62             if random() > probB:
63                 scoreA += 1
64                 serving = A
65             else:
66                 scoreB += 1
67     return scoreA, scoreB
68 
69 def gameOver(scoreA, scoreB):
70     ‘‘‘
71     function: 定義一場比賽的結束條件
72     return: 若比賽結束的條件成立返回真,否則為假
73     ‘‘‘
74     return scoreA==15 or scoreB==15
75 
76 def printResult(n, winsA, winsB):
77     ‘‘‘
78     function: 輸出模擬比賽的結果
79     ‘‘‘
80     print("競技分析開始,共模擬{}場比賽。".format(n))
81     print(">>>隊伍A獲勝{}場比賽,占比{:0.1%}".format(winsA,winsA/n))
82     print(">>>隊伍B獲勝{}場比賽,占比{:0.1%}".format(winsB,winsB/n))
83 
84 if __name__ == "__main__":
85     printInfo()
86     probA, probB, n = getInputs()
87     winsA, winsB = simNGames(n, probA, probB)
88     printResult(n, winsA, winsB)

5. 運行結果展示,為了查看方便,我仍在cmd中運行代碼

技術分享圖片

三、晉級模擬

1. 簡介: 前2次分別對於排球和足球的模擬比賽分析,比賽規則的差距 體現 在代碼上的不同,所以本次模擬分析多支隊伍進行乒乓球比賽。

2. 模擬原理: 通過輸入各自的能力值(Ⅰ),模擬比賽的進行( P ),最後輸出模擬的結果( O )。

P 簡介:通過產生隨機數得到每局比賽的難度,若小於能力值則表示贏得本局比賽,反之輸掉本局比賽。當有多個隊伍時,采取兩兩配對,但只遍歷一次,因此,本代碼功能不完善,僅供參考。

3. 規則簡介:

① 每場比賽采用回合制。

② 一名球員在一個回合中未能合法擊打時,回合結束。本回合勝方得一分、得球權。

③ 先得15分贏得一場比賽。

4. 代碼實現

  本次代碼與上述不同,本次采用類的方法來實現,不過基於本人對於乒乓球不熟悉及python用法有限,本次代碼的功能有所限制,只能模擬數量為偶數的隊伍進行比賽。待技術提升,會對代碼進行改善和加強。

  1 # -*- encoding:utf-8 -*-
  2 ‘‘‘
  3 模擬排球競技
  4 @author: bpf
  5 ‘‘‘
  6 # 比賽規則:
  7 # 1. 一場比賽: 單打:采用七局四勝制
  8 #              雙打淘汰賽、團體賽:采用五局三勝制
  9 # 2. 一局比賽: 先得11分為勝,10平後,多得2分為勝
 10 
 11 from random import random
 12 from pandas import DataFrame
 13 class SportCompetitionAnalyze:
 14 
 15     def PrintInfo(self):
 16         ‘‘‘
 17         function: 打印程序的介紹信息
 18         ‘‘‘
 19         print("產品名稱: 乒乓球競技模擬分析器(采取單打淘汰賽制)")
 20         print("產品概述: 通過輸入多個隊伍的能力值(0到1之間的小數表示),能夠模擬多次多個隊伍的乒乓球競技比賽,從而得出各自的勝率!")
 21         print("產品作者: 步平凡 - 04\n")
 22     
 23     def GetInputs(self):
 24         ‘‘‘
 25         function: 獲得用戶輸入的參數
 26         ‘‘‘
 27         self.n = eval(input("請輸入需要模擬比賽的場次數:"))
 28         self.probAbilityList = list(map(eval, input("請輸入各隊伍/球員的能力值(0~1), 請用英文逗號隔開:").split(,)))
 29         self.probNum = len(self.probAbilityList)
 30         self.simNGames()
 31 
 32     def simNGames(self):
 33         ‘‘‘
 34         function: 模擬n場比賽
 35         probwinsList: 存儲每支隊伍贏得比賽的場數 的列表
 36         winA, winB: 隊伍A和B在一場比賽中獲勝的局數
 37         winsA, winsB: 隊伍A和B贏得比賽的場數,總共n場
 38         ‘‘‘
 39         self.probwinsList = []
 40         for i in range(0, self.probNum, 2):
 41             print("隊伍:", i+1, & ,i+2, "比賽中...")
 42             winsA, winsB = 0, 0
 43             for _ in range(self.n):
 44                 winA, winB = self.simOneGame(self.probAbilityList[i], self.probAbilityList[i+1])
 45                 if winA > winB:
 46                     winsA += 1
 47                 else:
 48                     winsB += 1
 49             self.probwinsList.append(winsA)
 50             self.probwinsList.append(winsB)
 51 
 52     def simOneGame(self, probA, probB):
 53         ‘‘‘
 54         function: 模擬一場比賽,包括七局,采取七局四勝制
 55         scoreA, scoreB: 分別為隊伍A和B一局比賽的分數
 56         winA, winB: 分別為隊伍A和B一場比賽贏的局數
 57         return: 返回雙方贏的局數
 58         ‘‘‘
 59         winA, winB = 0, 0
 60         for _ in range(7):
 61             scoreA, scoreB = self.simAGame(probA, probB)
 62             if scoreA > scoreB:
 63                 winA += 1
 64             else:
 65                 winB += 1
 66             if winA >=4 or winB >= 4:
 67                 break
 68         return winA, winB
 69 
 70     def simAGame(self, probA, probB):
 71         ‘‘‘
 72         function: 模擬一局比賽
 73         N: 代表本次比賽的局次
 74         probA, probB: 分別為隊伍A和B的能力值
 75         return: 返回隊伍A和B在本局比賽中獲得的分數
 76         ‘‘‘
 77         scoreA, scoreB = 0, 0
 78         serving = A              # 發球方
 79         while not self.GameOver(scoreA, scoreB):
 80             if serving == A:
 81                 if random() > probA:
 82                     scoreB += 1
 83                     serving = B
 84                 else:
 85                     scoreA += 1
 86             else:
 87                 if random() > probB:
 88                     scoreA += 1
 89                     serving = A
 90                 else:
 91                     scoreB += 1
 92         return scoreA, scoreB
 93 
 94     def GameOver(self, scoreA, scoreB):
 95         ‘‘‘
 96         function: 定義贏得一局的條件: 一方先得11分且超過對方2分
 97         ‘‘‘
 98         return (scoreA >= 11 and abs(scoreA-scoreB)>=2) or (scoreB >= 11 and abs(scoreA-scoreB)>=2)
 99 
100     def PrintResult(self):
101         ‘‘‘
102         function: 輸出模擬比賽的結果
103         data: 存儲每支的比賽信息
104         ‘‘‘
105         print("競技分析結束,每組共模擬{}場比賽。".format(self.n))
106         data = []
107         for i in range(self.probNum):
108             tmplist = []
109             tmplist.append(self.probAbilityList[i])      # 存儲能力值
110             tmplist.append(self.probwinsList[i])         # 存儲獲勝的場數
111             tmplist.append(self.probwinsList[i]/self.n)  # 存儲勝率
112             data.append(tmplist)
113         dataSheet = DataFrame(data , index=list(range(1, self.probNum+1)), columns=list(["Ability", "wins", "rate"]))
114         #dataSheet.sort_values(by="wins", inplace=True)  # 對比賽勝率rate進行排序
115         print(dataSheet)
116     
117 if __name__ == "__main__":
118     pingpong = SportCompetitionAnalyze()
119     pingpong.PrintInfo()
120     pingpong.GetInputs()
121     pingpong.PrintResult()

5. 代碼寫好了,看一下運行效果怎麽樣唄 ^v^

Tips:為了使用方便,可以使用python的第三方庫pyinstaller進行打包,生成exe文件,可以方便運行。

接下來,我們試一下吧~~~

① 首先要安裝pyinstaller庫

在cmd中輸入下面一句代碼,詳情就不介紹了。

pip install pyinstaller

② 使用方法: pyinstaller <文件名> 》具體使用方法《

註: 使用pyinstaller時,路徑不能出現中文,否則出現編碼出錯;最好在上述代碼的main函數的最後加上 input() 語句,防止程序一運行完就自動退出。

之後雙擊運行exe文件即可 ↓↓↓

技術分享圖片

好了,今天就分享到這裏,學習去咯~~~

python初體驗 ——>>> 模擬體育競技