www.yabovip55.com

羽毛球竞技模拟

发布时间:2019-05-28 点击量:
1 # -*- encoding:utf-8 -*- 2 ''' 3 模拟乒乓球竞技 4 @author: bpf 5 ''' 6 # 比赛规则: 7 # 1. 一场比赛: 单打:采用七局四胜制 8 # 双打淘汰赛、团体赛:采用五局三胜制 9 # 2. 一局比赛: 先得11分为胜,10平后,多得2分为胜 10 # 3. 一局比赛: 每队发球2次后,接发球方即成为发球方,依此类推,直至该局比赛结束 11 # 或者到双方比分都达到10分时,发球和接发次序仍然不变,但每队只轮发一次球 12 13 from random import random 14 from pandas import DataFrame 15 from time import time 16 class SportCompetitionAnalyze: 17 18 def PrintInfo(self): 19 ''' 20 function: 打印程序的介绍信息 21 ''' 22 print("{:*^70}".format("产品简介")) 23 print("产品名称: 乒乓球竞技模拟分析器(采取单打淘汰赛制)") 24 print("产品概述: 通过输入多个队伍的能力值(0到1之间的小数表示),能够模拟多次多个队伍的乒乓球竞技比赛,从而得出各自的胜率!") 25 print("产品作者: 步平凡 - 04") 26 print("{:*^70}".format("模拟开始")) 27 28 def GetInputs_for_Singal(self): 29 ''' 30 function: 获得用户输入的参数 获得单打各队员的能力值 31 ''' 32 self.n=eval(input("请输入需要模拟比赛的场数:")) 33 self.probAbilityList_Original=list(map(eval, input("(注:通过输入的次序进行两两配对, 即前两个分别为队员A和B;以此类推。)\n\ 34 请输入各队员的能力值(0~1), 请用英文逗号隔开(输入个数为2的倍数): ").split(','))) 35 self.probAbilityList= self.probAbilityList_Original 36 self.probNum= len(self.probAbilityList) 37 38 def GetInputs_for_Double(self): 39 ''' 40 function: 获得用户输入的参数 获得双打各队伍各队员的能力值 41 probAbilityList: 使用各队伍中两队员的平均能力值作为该队伍的能力值 --- 双打 42 probAbilityList_Original: 存储原生的各队员能力值, 后续可用 43 ''' 44 self.probAbilityList, self.probAbilityList_Original= [], [] 45 self.n=eval(input("请输入需要模拟比赛的场数:")) 46 Original=list(map(eval, input("(注:通过输入的次序进行四四配对, 即前四个为队伍A和B;以此类推。)\n\ 47 请输入各队员的能力值(0~1), 请用英文逗号隔开(输入个数为4的倍数): ").split(','))) 48 for i in range(0, len(Original), 2): 49 self.probAbilityList.append((Original[i] + Original[i+1])/2) 50 self.probAbilityList_Original.append(list([Original[i], Original[i+1]])) 51 self.probNum= len(self.probAbilityList) 52 53 def PrintResult(self): 54 ''' 55 function: 输出模拟比赛的结果 56 data: 存储每支的比赛信息 57 ''' 58 print("{:*yabo体育官网^70}".format("模拟结束")) 59 print("竞技分析结束,每组共模拟{}场比赛。".format(self.n)) 60 data= [] 61 for i in range(self.probNum): 62 tmplist= [] 63 tmplist.append(self.probAbilityList_Original[i]) # 存储能力值 64 tmplist.append(self.probwinsList[i]) # 存储获胜的场数 65 tmplist.append(self.probwinsList[i]/self.n) # 存储胜率 66 data.append(tmplist) 67 dataSheet=DataFrame(data , index=list(range(1, self.probNum+1)), columns=list(["Ability", "wins", "rate"])) 68 #dataSheet.sort_values(by="wins", inplace=True) # 对比赛胜率rate进行排序, 会混乱比赛队伍的关系, 因此不采用 69 print(dataSheet) 70 71 def simNGames(self, GAMES, WINS): 72 ''' 73 function: 模拟n场比赛 74 probwinsList: 存储每支队伍赢得比赛的场数 的列表 75 winA, winB:yabo体育官网 队伍A和B在一场比赛中获胜的局数 76 winsA, winsB: 队伍A和B赢得比赛的场数,总共n场 77 ''' 78 self.probwinsList= [] 79 for i in range(0, self.probNum, 2): 80 print("队员:", i+1, 'VS' ,i+2, "比赛中...") 81 winsA, winsB= 0, 0 82 for _ in range(self.n): 83 winA, winB=self.simOneGame(self.probAbilityList[i], self.probAbilityList[i+1], GAMES, WINS) 84 if winA > winB: 85 winsA +=1 86 else: 87 winsB +=1 88 self.probwinsList.append(winsA) 89 self.probwinsList.append(winsB) 90 91 def simOneGame(self, probA, probB, GAMES, WINS): 92 ''' 93 function: 模拟一场比赛 》》》 GAMES局 WINS胜 94 单打比赛,包括七局,采取七局四胜制 95 双打比赛,包括五局,采取五局三胜制 96 scoreA, scoreB: 分别为队伍A和B一局比赛的分数 97 winA, winB: 分别为队伍A和B一场比赛赢的局数 98 return: 返回双方赢的局数 99 ''' 100 winA, winB= 0, 0 101 for _ in range(GAMES): 102 scoreA, scoreB= self.simAGame(probA, probB) 103 if scoreA > scoreB: 104 winA +=1 105 else: 106 winB +=1 107 if winA >=WINS or winB >= WINS: 108 break 109 return winA, winB 110 111 def simAGame(self, probA, probB): 112 ''' 113 function: 模拟一局比赛 114 probA, probB: 分别为队伍A和B的能力值 115 return: 返回队伍A和B在本局比赛中获得的分数 116 ''' 117 scoreA, scoreB= 0, 0 118 serving='A' # 发球方 119 servingNum=2 # 每方的发球次数 120 while not self.GameOver(scoreA, scoreB): 121 if scoreA >=10 and scoreB >=10: 122 servingNum=1 123 for _ in range(servingNum): 124 if random() > probA: 125 scoreB +=1 126 else: 127 scoreA +=1 128 serving='B' 129 for _ in range(servingNum): 130 if random() > probB: 131 scoreA +=1 132 else: 133 scoreB +=1 134 serving='A' 135 return scoreA, scoreB 136 137 def GameOver(self, scoreA, scoreB): 138 ''' 139 function: 定义赢得一局的条件: 先得11分为胜,10平后,多得2分为胜 140 ''' 141 if scoreA >=11 or scoreB >=11: 142 return (abs(scoreA-scoreB)>=2) 143 elif (scoreA==10 and scoreB > 11) or (scoreB==10 and scoreA > 11): 144 return (abs(scoreA-scoreB)>=2) 145 else: 146 return 0 147 148 def print_MENU(): 149 print("程序简介:模拟乒乓球竞技") 150 print("程序功能:\n\t1. 模拟多队员进行单打比赛\n\t2. 模拟多队伍多队员进行双打比赛") 151 while 1: 152 choose=input("功能选择:NO.") 153 if choose in ['1', '2']: 154 return eval(choose) 155 else: 156 print("输入有误, 请重新输入!") 157 158 def simGameMenu(): 159 choose= print_MENU() 160 if choose==1: 161 pingpong= SportCompetitionAnalyze() 162 pingpong.PrintInfo() 163 pingpong.GetInputs_for_Singal() 164 Time= time() 165 pingpong.simNGames(7, 4) 166 print("模拟用时: {:.1f}s".format(time()-Time)) 167 pingpong.PrintResult() 168 else: 169 pingpong= SportCompetitionAnalyze() 170 pingpong.PrintInfo() 171 pingpong.GetInputs_for_Double() 172 Time= time() 173 pingpong.simNGames(5, 3) 174 print("模拟用时: {:.1f}s".format(time()-Time)) 175 pingpong.PrintResult() 176 177 if __name__=="__main__": 178 simGameMenu()
yabovip.com www.yabovip55.com

上一篇:空中接力,大力扣篮!2019中国·西峡欧美国际篮球赛圆满落幕!

下一篇:日本乒乓球队遭重创!张本智和搭档首日出局 资格赛已有3人遭淘汰

Baidu
版权所有 技术支持:yabovip.com - www.yabovip55.com - yabo体育官网|网站地图