羽毛球

import random

class BadmintonMatch:
def init(self, player1_ability, player2_ability):
self.player1_ability = player1_ability
self.player2_ability = player2_ability

def play_point(self):
    """模拟一个回合,根据球员能力值决定胜负"""
    total_ability = self.player1_ability + self.player2_ability
    rand_num = random.randint(1, total_ability)
    return 1 if rand_num <= self.player1_ability else 2

def play_game(self):
    """模拟一局比赛"""
    player1_score = 0
    player2_score = 0
    while True:
        winner = self.play_point()
        if winner == 1:
            player1_score += 1
        else:
            player2_score += 1

        if player1_score >= 21 and player1_score - player2_score >= 2:
            return 1
        elif player2_score >= 21 and player2_score - player1_score >= 2:
            return 2
        elif player1_score == 29 and player2_score == 29:
            next_winner = self.play_point()
            return next_winner

def play_match(self):
    """模拟一场比赛(3局2胜)"""
    player1_wins = 0
    player2_wins = 0
    serving_player = 1
    while player1_wins < 2 and player2_wins < 2:
        self.serving_player = serving_player
        winner = self.play_game()
        if winner == 1:
            player1_wins += 1
            serving_player = 1
        else:
            player2_wins += 1
            serving_player = 2
    return 1 if player1_wins == 2 else 2

class Tournament:
def init(self, teams):
self.teams = teams
self.results = {team: 0 for team in range(len(teams))}

def round_robin(self):
    """循环赛制"""
    num_teams = len(self.teams)
    for i in range(num_teams):
        for j in range(i + 1, num_teams):
            match = BadmintonMatch(self.teams[i], self.teams[j])
            winner = match.play_match()
            if winner == 1:
                self.results[i] += 1
            else:
                self.results[j] += 1

def get_ranking(self):
    """获取排名"""
    sorted_results = sorted(self.results.items(), key=lambda x: x[1], reverse=True)
    ranking = []
    for team, wins in sorted_results:
        ranking.append(team)
    return ranking

def main():
print("欢迎使用羽毛球比赛模拟程序!本程序将模拟 21 分制、3 局 2 胜的羽毛球比赛,参考了 19 世纪以来逐渐形成的现代羽毛球规则。")
try:
player1_ability = int(input("请输入第一个球员(球队)的能力值 (1 - 100): "))
player2_ability = int(input("请输入第二个球员(球队)的能力值 (1 - 100): "))
num_simulations = int(input("请输入模拟比赛的次数: "))

    player1_wins = 0
    for _ in range(num_simulations):
        match = BadmintonMatch(player1_ability, player2_ability)
        winner = match.play_match()
        if winner == 1:
            player1_wins += 1

    player1_prob = player1_wins / num_simulations * 100
    player2_prob = 100 - player1_prob

    print(f"球员(球队) 1 获胜的概率: {player1_prob:.2f}%")
    print(f"球员(球队) 2 获胜的概率: {player2_prob:.2f}%")

    # 模拟 4 支队伍的循环赛
    teams = [random.randint(1, 100) for _ in range(4)]
    tournament = Tournament(teams)
    tournament.round_robin()
    ranking = tournament.get_ranking()
    print("\n4 支队伍循环赛排名:")
    for i, team in enumerate(ranking, 1):
        print(f"第 {i} 名: 队伍 {team + 1} (能力值: {teams[team]})")

except ValueError:
    print("输入无效,请输入有效的整数。")

if name == "main":
main()

学号:19
这个Python程序模拟了羽毛球比赛和锦标赛,主要包含两个核心类:BadmintonMatch(单场比赛)和Tournament(锦标赛),以及一个主程序入口。

主要功能
单场比赛模拟:
采用21分制,3局2胜规则
每球得分制
20平后需领先2分获胜
29平后先得30分者胜
锦标赛模拟:
支持多支球队的循环赛
自动计算排名

核心类说明
BadmintonMatch类
play_point(): 模拟单个回合,根据球员能力值随机决定胜负
play_game(): 模拟一局比赛,遵循21分制规则
play_match(): 模拟整场比赛(3局2胜)
Tournament类
round_robin(): 执行循环赛制比赛
get_ranking(): 根据比赛结果生成排名

使用方法
输入两个球员/球队的能力值(1-100)
输入模拟比赛次数
程序会输出:
双方获胜概率
4支模拟球队的循环赛结果

C:\Users\minmin\PycharmProjects\PythonProject.venv\Scripts\python.exe C:\Users\minmin\PycharmProjects\PythonProject\test\ball.py
欢迎使用羽毛球比赛模拟程序!本程序将模拟 21 分制、3 局 2 胜的羽毛球比赛,参考了 19 世纪以来逐渐形成的现代羽毛球规则。
请输入第一个球员(球队)的能力值 (1 - 100): 60
请输入第二个球员(球队)的能力值 (1 - 100): 70
请输入模拟比赛的次数: 3
球员(球队) 1 获胜的概率: 0.00%
球员(球队) 2 获胜的概率: 100.00%

4 支队伍循环赛排名:
第 1 名: 队伍 1 (能力值: 64)
第 2 名: 队伍 3 (能力值: 62)
第 3 名: 队伍 4 (能力值: 68)
第 4 名: 队伍 2 (能力值: 40)

posted @ 2025-06-23 02:16  城阳  阅读(13)  评论(0)    收藏  举报