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()

posted @ 2025-06-17 16:37  kk/  阅读(7)  评论(0)    收藏  举报