天津津门虎VS大连英博直播_天津津门虎VS大连英博免费直播在线直播

  • 发布于:2026-05-28 23:07:18
  • 来源:24直播网

天津津门虎VS大连英博直播_天津津门虎VS大连英博免费直播在线直播

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

相关阅读: