羽毛球赛事模拟
import random
def print_info():
"""打印程序介绍,学号后两位改为自己的"""
print("=" * 50)
print("羽毛球赛事模拟程序 | 学号后两位:08")
print("规则:3局2胜,21分制,29分封顶30决胜,单局胜者下局先发")
print("=" * 50)
def play_single_game(p1_power: float, p2_power: float, first_server: int) -> tuple[int, int, int]:
"""
模拟单局羽毛球
:param p1_power: 选手1能力值(0~1)
:param p2_power: 选手2能力值(0~1)
:param first_server: 本局首发选手 1/2
:return: (本局胜者1/2, p1本局得分, p2本局得分)
"""
s1, s2 = 0, 0
server = first_server
while True:
# 根据能力值判定回合胜负
rand_val = random.random()
if server == 1:
win_round = 1 if rand_val < p1_power else 2
else:
win_round = 2 if rand_val < p2_power else 1
# 得分
if win_round == 1:
s1 += 1
server = 1
else:
s2 += 1
server = 2
diff = abs(s1 - s2)
max_score = max(s1, s2)
# 29分封顶规则
if s1 == 29 and s2 == 29:
winner = 1 if win_round == 1 else 2
return (winner, s1, s2)
# 常规胜利判定
if max_score >= 21 and diff >= 2:
winner = 1 if s1 > s2 else 2
return (winner, s1, s2)
def play_one_match(p1_power: float, p2_power: float) -> int:
"""模拟一整场3局2胜比赛,返回整场胜者1/2"""
win1, win2 = 0, 0
# 第一局默认选手1先发
curr_server = 1
while win1 < 2 and win2 < 2:
game_winner, _, _ = play_single_game(p1_power, p2_power, curr_server)
if game_winner == 1:
win1 += 1
else:
win2 += 1
# 本局胜者下一局先发
curr_server = game_winner
return 1 if win1 == 2 else 2
def main():
print_info()
# 输入模块
while True:
try:
p1 = float(input("请输入选手1能力值(0~1之间小数)😊)
p2 = float(input("请输入选手2能力值(0~1之间小数)😊)
sim_times = int(input("请输入需要模拟的比赛总次数:"))
if 0 <= p1 <= 1 and 0 <= p2 <= 1 and sim_times > 0:
break
else:
print("输入非法!能力值0~1,模拟次数为正整数")
except ValueError:
print("输入格式错误,请输入数字!")
# 模拟过程
p1_win = 0
p2_win = 0
for i in range(sim_times):
match_win = play_one_match(p1, p2)
if match_win == 1:
p1_win += 1
else:
p2_win += 1
# 输出概率
print("\n===== 模拟结果输出 =====")
prob1 = p1_win / sim_times * 100
prob2 = p2_win / sim_times * 100
print(f"选手1获胜场次:{p1_win},获胜概率:{prob1:.2f}%")
print(f"选手2获胜场次:{p2_win},获胜概率:{prob2:.2f}%")
if name == "main":
main()
浙公网安备 33010602011771号