羽毛球

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

posted @ 2025-06-23 18:38  南萱  阅读(15)  评论(0)    收藏  举报