羽毛球
09fang
import random
class BadmintonGame:
def init(self, player1_ability, player2_ability):
"""初始化羽毛球比赛,设置球员能力值"""
self.player_abilities = [player1_ability, player2_ability]
self.scores = [0, 0] # 当前局比分
self.set_scores = [0, 0] # 总局数比分
self.current_server = 0 # 0: 球员1发球, 1: 球员2发球
self.current_set = 1 # 当前局数
def simulate_point(self):
"""模拟一个回合,根据能力值决定得分方"""
total_ability = sum(self.player_abilities)
p1_prob = self.player_abilities[0] / total_ability
return 0 if random.random() < p1_prob else 1 # 能力值高的更可能得分
def simulate_game(self):
"""模拟一局比赛(21分制,特殊比分规则)"""
while True:
winner = self.simulate_point()
self.scores[winner] += 1
# 检查比赛是否结束(21分制规则)
if self._is_game_over():
self.set_scores[winner] += 1 # 记录当局胜者
self.scores = [0, 0] # 重置当前局比分
self.current_server = winner # 下一局由胜者发球
return winner
def _is_game_over(self):
"""判断当局是否结束(21分制+特殊比分规则)"""
score_a, score_b = self.scores
# 常规胜利:先到21分且领先至少1分
if (score_a >= 21 or score_b >= 21) and abs(score_a - score_b) >= 1:
return True
# 特殊胜利:双方≥29分时,先到30分者胜
if score_a >= 29 and score_b >= 29:
return True
return False
def simulate_match(self):
"""模拟3局2胜制完整比赛"""
while True:
game_winner = self.simulate_game()
# 检查是否有球员赢得2局
if self.set_scores[0] >= 2 or self.set_scores[1] >= 2:
return 0 if self.set_scores[0] > self.set_scores[1] else 1
self.current_set += 1 # 进入下一局
def main():
try:
# 接收用户输入的能力值和模拟次数
p1_ability = float(input("请输入球员1的能力值(建议1-100的正数):"))
p2_ability = float(input("请输入球员2的能力值(建议1-100的正数):"))
sim_times = int(input("请输入模拟比赛的次数(建议≥1000):"))
# 验证输入有效性
if p1_ability <= 0 or p2_ability <= 0:
print("错误:能力值必须为正数!")
return
if sim_times <= 0:
print("错误:模拟次数必须为正整数!")
return
# 执行模拟
p1_wins = 0
for _ in range(sim_times):
game = BadmintonGame(p1_ability, p2_ability)
if game.simulate_match() == 0:
p1_wins += 1
# 计算胜率并输出
p1_rate = p1_wins / sim_times * 100
p2_rate = 100 - p1_rate
print(f"\n===== 模拟比赛结果 =====")
print(f"球员1能力值:{p1_ability} | 球员2能力值:{p2_ability}")
print(f"共模拟 {sim_times} 场3局2胜制比赛")
print(f"球员1胜率:{p1_rate:.2f}% | 球员2胜率:{p2_rate:.2f}%")
if p1_rate > p2_rate:
print(f"▶ 球员1(能力值{p1_ability})获胜概率更高")
elif p1_rate < p2_rate:
print(f"▶ 球员2(能力值{p2_ability})获胜概率更高")
else:
print("▶ 双方获胜概率相当")
except ValueError:
print("输入格式错误!请确保能力值为数字,模拟次数为整数。")
except Exception as e:
print(f"程序出错:{str(e)}")
if name == "main":
print("===== 羽毛球比赛胜率模拟程序 =====")
main()

浙公网安备 33010602011771号