python123最后一次大作业第3题
import random
import sys
from collections import defaultdict
class TableTennisGame:
"""乒乓球比赛模拟类"""
def init(self):
self.player1 = None
self.player2 = None
self.simulations = 0
self.results = defaultdict(int)
def print_intro(self):
"""打印程序介绍信息"""
print("""
****************************************************
* 乒乓球比赛模拟程序 (学号后两位:12) *
* *
* 功能: *
* 1. 模拟七局四胜制的乒乓球单打比赛 *
* 2. 根据球员能力值计算获胜概率 *
* 3. 支持多次模拟统计胜率 *
****************************************************
""")
def get_input(self):
"""获取用户输入"""
print("\n请输入球员信息(能力值范围0-100)")
try:
self.player1 = {
'name': input("球员1名字: "),
'ability': int(input("球员1能力值: "))
}
self.player2 = {
'name': input("球员2名字: "),
'ability': int(input("球员2能力值: "))
}
self.simulations = int(input("模拟比赛次数: "))
if not (0 <= self.player1['ability'] <= 100 and 0 <= self.player2['ability'] <= 100):
raise ValueError("能力值必须在0-100之间")
if self.simulations <= 0:
raise ValueError("模拟次数必须大于0")
except ValueError as e:
print(f"输入错误: {e}")
sys.exit(1)
def play_game(self):
"""模拟一场七局四胜制的比赛"""
p1_wins = 0
p2_wins = 0
while p1_wins < 4 and p2_wins < 4:
winner = self.play_set()
if winner == 1:
p1_wins += 1
else:
p2_wins += 1
return 1 if p1_wins == 4 else 2
def play_set(self):
"""模拟一局比赛(先得11分者胜,10平后需领先2分)"""
p1_score = 0
p2_score = 0
while not self.is_set_over(p1_score, p2_score):
if random.random() < self.get_win_probability():
p1_score += 1
else:
p2_score += 1
return 1 if p1_score > p2_score else 2
def is_set_over(self, score1, score2):
"""判断一局比赛是否结束"""
if max(score1, score2) >= 11 and abs(score1 - score2) >= 2:
return True
return False
def get_win_probability(self):
"""计算当前球员得分概率"""
total = self.player1['ability'] + self.player2['ability']
return self.player1['ability'] / total
def simulate(self):
"""运行模拟"""
for _ in range(self.simulations):
winner = self.play_game()
self.results[winner] += 1
def show_results(self):
"""显示模拟结果"""
p1_percent = (self.results[1] / self.simulations) * 100
p2_percent = (self.results[2] / self.simulations) * 100
print("\n模拟结果:")
print(f"{self.player1['name']} 胜率: {p1_percent:.2f}%")
print(f"{self.player2['name']} 胜率: {p2_percent:.2f}%")
# 输出示例结果截图
print("\n示例比赛结果:")
print(f"{self.player1['name']} vs {self.player2['name']}")
print(f"总局数: 7局4胜")
print(f"模拟次数: {self.simulations}")
print(f"胜负统计: {self.results[1]}:{self.results[2]}")
def main():
game = TableTennisGame()
game.print_intro()
game.get_input()
game.simulate()
game.show_results()
if name == "main":
main()

浙公网安备 33010602011771号