
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;以此类推。)
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;以此类推。)
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("{:*^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: 队伍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("程序功能:
1. 模拟多队员进行单打比赛
2. 模拟多队伍多队员进行双打比赛")
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()
相关资讯 - | 天津津门虎VS大连英博直播_天津津门虎VS大连英博免费直播在线直播
- | 巴黎VS阿森纳直播_巴黎VS阿森纳直播观看免费_巴黎VS阿森纳
- | 重庆铜梁龙VS北京国安直播_重庆铜梁龙VS北京国安直播免费观看_重庆铜梁龙VS北京国安直播无插件观看
- | 重庆铜梁龙VS北京国安直播_重庆铜梁龙VS北京国安直播免费观看_重庆铜梁龙VS北京国安直播无插件观看
- | 深圳新鹏城VS青岛海牛直播_深圳新鹏城VS青岛海牛免费高清在线直播_深圳新鹏城VS青岛海牛免费直播视频直播
- | CBA联赛中两支未能进入决赛的球队,其至少五名外援面临合同到期后无法获得续约的严峻局面
- | CBA重磅引援震撼揭晓!北京首钢正式续约核心球员陈盈骏,冠军教头杨鸣确认签约新东家,多方传闻下家终于浮出水面引发热议
- | 刘铮发文力挺球队冲击总冠军,林秉圣盛赞其表现并亲自现身总决赛现场,球迷热议不断,赛事氛围持续升温
- | CBA季后赛正式落幕!多位表现不佳的外援或将面临离队危机,昔日水货或难逃被裁命运,全面洗牌即将开启(第二期深度解读)
- | 上海男篮三外援出战,广厦四外援强势出击,CBA总决赛G1阵容公布,怀特塞德因伤缺席引发关注
最新资讯 - | 武汉三镇VS云南玉昆直播_武汉三镇VS云南玉昆直播免费观看_武汉三镇VS云南玉昆直播无插件观看
- | 天津津门虎VS大连英博直播_天津津门虎VS大连英博免费直播在线直播
- | 巴黎VS阿森纳直播_巴黎VS阿森纳直播观看免费_巴黎VS阿森纳
- | 深圳新鹏城VS青岛海牛直播_深圳新鹏城VS青岛海牛免费高清在线直播_深圳新鹏城VS青岛海牛免费直播视频直播
- | 重庆铜梁龙VS北京国安直播_重庆铜梁龙VS北京国安直播免费观看_重庆铜梁龙VS北京国安直播无插件观看
- | 成都蓉城VS山东泰山直播_成都蓉城VS山东泰山免费直播在线直播
- | 河南VS浙江直播_河南VS浙江直播观看免费_河南VS浙江
- | 青岛西海岸VS上海申花直播_青岛西海岸VS上海申花免费高清在线直播_青岛西海岸VS上海申花免费直播视频直播
- | 辽宁铁人VS上海海港直播_辽宁铁人VS上海海港直播免费观看_辽宁铁人VS上海海港直播无插件观看
- | 阿森纳VS巴黎圣日耳曼直播_阿森纳VS巴黎圣日耳曼免费直播在线直播
