羽毛球比赛规则(大一下期末)

import random

==========================================

第一部分:打印介绍信息

==========================================

def print_intro():
print("=" * 50)
print(" 体育竞技分析程序 - 羽毛球模拟")
print("=" * 50)
# TODO: 请将下面的 "07" 替换为你真实的学号后两位
print(f" 班级:XX班 学号后两位:07")
print("-" * 50)
print("【比赛规则说明】")
print("1. 采用三局两胜制 (Best of 3)")
print("2. 每球得分制 (Rally Point System)")
print("3. 先得 21 分的一方赢得该局")
print("4. 特殊情况处理:")
print(" - 当双方均为 20 分时,需领先对方 2 分的一方获胜")
print(" - 当双方均为 29 分时,先取得 30 分的一方获胜")
print("5. 一局比赛的获胜方在下一局率先发球")
print("=" * 50)

==========================================

第二部分:输入模块

==========================================

def get_inputs():
"""获取用户输入的能力值和模拟次数"""
try:
prob_a = float(input("请输入选手 A 的能力值 (0-1之间的小数): "))
prob_b = float(input("请输入选手 B 的能力值 (0-1之间的小数): "))
n = int(input("请输入模拟比赛的场次数量: "))
return prob_a, prob_b, n
except ValueError:
print("输入错误,请重新运行并输入数字。")
return None, None, None

==========================================

第三部分:核心逻辑模块

==========================================

def sim_one_game(prob_a, prob_b, first_serve):
"""
模拟一局羽毛球比赛
:param prob_a: A 的胜率
:param prob_b: B 的胜率
:param first_serve: 'A' 或 'B',表示谁先发球
:return: score_a, score_b (本局比分)
"""
score_a, score_b = 0, 0
serving = first_serve # 当前发球方

while True:
# 模拟一次击球
if serving == 'A':
if random.random() < prob_a:
score_a += 1 # A 赢球,得分
# 规则6:赢球方下一球继续发球(羽毛球规则)
else:
serving = 'B' # A 输球,换发球权
else: # serving == 'B'
if random.random() < prob_b:
score_b += 1 # B 赢球,得分
else:
serving = 'A' # B 输球,换发球权

--- 判断是否结束本局 ---

规则5:当双方均为 29 分时,先取得 30 分的一方获胜

if score_a >= 29 and score_b >= 29:
if score_a == 30 or score_b == 30:
break

规则4:当双方均为 20 分时,领先对方 2 分的一方赢得该局

elif score_a >= 20 and score_b >= 20:
if abs(score_a - score_b) >= 2:
break

规则3:一般情况,先得 21 分者胜

elif score_a >= 21 or score_b >= 21:
break

return score_a, score_b

def sim_n_games(n, prob_a, prob_b):
"""
模拟 N 场完整的羽毛球比赛 (3局2胜制)
"""
wins_a, wins_b = 0, 0

for _ in range(n):
games_won_a = 0 # A 赢得的局数
games_won_b = 0 # B 赢得的局数
current_server = 'A' # 每场比赛默认 A 先发球(也可改为随机)

循环进行每一局,直到有人赢下 2 局

while games_won_a < 2 and games_won_b < 2:
score_a, score_b = sim_one_game(prob_a, prob_b, current_server)

if score_a > score_b:
games_won_a += 1
else:
games_won_b += 1

规则6:上一局的获胜方在下一局率先发球

如果 A 赢了这一局,下一局 A 先发;反之 B 先发

if score_a > score_b:
current_server = 'A'
else:
current_server = 'B'

判定整场比赛胜负

if games_won_a == 2:
wins_a += 1
else:
wins_b += 1

return wins_a, wins_b

==========================================

第四部分:输出结果

==========================================

def print_summary(wins_a, wins_b, n):
print("\n" + "=" * 50)
print(f" 共模拟了 {n} 场羽毛球比赛")
print(f" 选手 A 获胜 {wins_a} 场,占比 {wins_a/n:.1%}")
print(f" 选手 B 获胜 {wins_b} 场,占比 {wins_b/n:.1%}")
print("=" * 50)

==========================================

主程序入口

==========================================

if name == 'main':
# 1. 打印介绍
print_intro()

2. 获取输入

prob_a, prob_b, n = get_inputs()

if prob_a is not None:
# 3. 处理过程 (模拟)
wins_a, wins_b = sim_n_games(n, prob_a, prob_b)

4. 输出结果

print_summary(wins_a, wins_b, n)

posted @ 2026-06-17 16:41  陈可芊  阅读(8)  评论(0)    收藏  举报