python初體驗 ——>>> 模擬體育競技
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 11from 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初體驗 ——>>> 模擬體育競技