羽毛球比赛规则(大一下期末)
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)

浙公网安备 33010602011771号