羽毛球
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)