本文目录导读:

我来设计一个有趣的Python综合案例:模拟篮球联赛季后赛,看看哪支球队能笑到最后!
🏀 篮球联赛季后赛模拟系统
import random
import time
from dataclasses import dataclass
from typing import List, Dict
import math
from collections import defaultdict
# ========== 数据类定义 ==========
@dataclass
class Player:
"""球员类"""
name: str
position: str # PG, SG, SF, PF, C
overall: int # 综合能力值 70-99
three_point: int # 三分能力
stamina: int = 100 # 体力
def __str__(self):
return f"{self.name}({self.position}) {self.overall}"
@dataclass
class Team:
"""球队类"""
name: str
city: str
players: List[Player]
wins: int = 0
losses: int = 0
chemistry: float = 0.7 # 团队默契度
def get_team_rating(self):
"""计算球队整体实力"""
if not self.players:
return 0
return sum(p.overall for p in self.players) / len(self.players)
# ========== 比赛模拟类 ==========
class MatchSimulator:
"""比赛模拟器"""
def __init__(self, home_team: Team, away_team: Team):
self.home = home_team
self.away = away_team
self.home_score = 0
self.away_score = 0
self.quarter_scores = [] # 记录每节比分
self.game_events = [] # 比赛事件
def simulate_quarter(self, quarter_num: int):
"""模拟一节比赛"""
# 根据球队实力计算得分概率
home_rating = self.home.get_team_rating()
away_rating = self.away.get_team_rating()
# 加入主场优势(3%)
home_rating *= 1.03
# 计算得分能力(加入随机因素)
home_ability = home_rating * (0.85 + random.random() * 0.3)
away_ability = away_rating * (0.85 + random.random() * 0.3)
# 计算本节得分(每节大约20-35分)
home_quarter_score = int(home_ability / 10) + random.randint(15, 25)
away_quarter_score = int(away_ability / 10) + random.randint(15, 25)
# 记录事件
self.game_events.append(
f"第{quarter_num}节: {self.home.name} {home_quarter_score} - "
f"{away_quarter_score} {self.away.name}"
)
# 更新总分和记录
self.home_score += home_quarter_score
self.away_score += away_quarter_score
self.quarter_scores.append((home_quarter_score, away_quarter_score))
# 消耗体力
for player in self.home.players + self.away.players:
player.stamina -= random.randint(5, 15)
def simulate_game(self) -> Team:
"""模拟整场比赛,返回获胜球队"""
print(f"\n🏀 {self.home.name} vs {self.away.name} 比赛开始!")
# 模拟4节比赛
for quarter in range(1, 5):
self.simulate_quarter(quarter)
time.sleep(0.5)
# 加时赛处理
overtime_count = 0
while self.home_score == self.away_score and overtime_count < 3:
print("🕐 进入加时赛!")
self.simulate_quarter(5 + overtime_count)
overtime_count += 1
# 输出比赛结果
winner = self.home if self.home_score > self.away_score else self.away
print("\n📊 比赛详细数据:")
for i, (home_s, away_s) in enumerate(self.quarter_scores, 1):
print(f" 第{i}节: {self.home.name} {home_s} - {away_s} {self.away.name}")
print(f"\n🏆 最终比分: {self.home.name} {self.home_score} - "
f"{self.away_score} {self.away.name}")
print(f"🎉 获胜球队: {winner.name}!")
# 更新球队战绩
self.home.wins += 1 if winner == self.home else 0
self.home.losses += 1 if winner == self.away else 0
self.away.wins += 1 if winner == self.away else 0
self.away.losses += 1 if winner == self.home else 0
return winner
# ========== 赛季模拟类 ==========
class SeasonSimulator:
"""赛季模拟器"""
def __init__(self, teams: List[Team]):
self.teams = teams
self.playoff_results = []
def simulate_playoff(self):
"""模拟季后赛"""
print("\n" + "="*50)
print("🏆 NBA季后赛开始!")
print("="*50)
# 随机分组进行比赛
teams_copy = self.teams.copy()
round_num = 1
while len(teams_copy) > 1:
print(f"\n📢 第{round_num}轮比赛,剩余球队:{len(teams_copy)}支")
next_round = []
# 相邻球队配对
for i in range(0, len(teams_copy), 2):
if i + 1 < len(teams_copy):
team1 = teams_copy[i]
team2 = teams_copy[i+1]
# 开始3局2胜系列赛
series_winner = self.simulate_series(team1, team2)
next_round.append(series_winner)
else:
next_round.append(teams_copy[i])
teams_copy = next_round
round_num += 1
champion = teams_copy[0]
print(f"\n🌟 冠军球队:{champion.name}!")
return champion
def simulate_series(self, team1: Team, team2: Team, best_of: int = 3):
"""模拟系列赛"""
print(f"\n🎯 系列赛:{team1.name} vs {team2.name} (三局两胜)")
team1_wins = 0
team2_wins = 0
games_played = 0
# 恢复体力
for team in [team1, team2]:
for player in team.players:
player.stamina = 100
while games_played < best_of and max(team1_wins, team2_wins) < 2:
games_played += 1
# 交替主客场
if games_played % 2 == 1:
simulator = MatchSimulator(team1, team2)
else:
simulator = MatchSimulator(team2, team1)
winner = simulator.simulate_game()
if winner == team1:
team1_wins += 1
else:
team2_wins += 1
print(f"系列赛比分: {team1.name} {team1_wins} - {team2_wins} {team2.name}")
series_winner = team1 if team1_wins > team2_wins else team2
print(f"🏁 系列赛获胜: {series_winner.name}!")
return series_winner
# ========== 统计分析类 ==========
class StatsAnalyzer:
"""统计分析类"""
@staticmethod
def analyze_team_performance(teams: List[Team]):
"""分析球队表现"""
print("\n📊 球队战绩统计:")
print("-"*40)
# 按胜率排序
sorted_teams = sorted(teams, key=lambda t: t.wins / max(t.wins + t.losses, 1), reverse=True)
for i, team in enumerate(sorted_teams, 1):
win_rate = team.wins / max(team.wins + team.losses, 1)
rating = team.get_team_rating()
print(f"第{i}名: {team.name}")
print(f" 战绩: {team.wins}胜{team.losses}负 (胜率{win_rate:.1%})")
print(f" 球队实力: {rating:.1f}")
print(f" 最佳球员: {max(team.players, key=lambda p: p.overall)}")
print()
@staticmethod
def analyze_player_stats(teams: List[Team]):
"""分析球员数据"""
print("\n🌟 球员排行榜:")
print("-"*40)
all_players = []
for team in teams:
for player in team.players:
all_players.append((player, team))
# 按能力值排序
sorted_players = sorted(all_players, key=lambda x: x[0].overall, reverse=True)
print("MVP候选人 TOP 5:")
for i, (player, team) in enumerate(sorted_players[:5], 1):
print(f" {i}. {player} - {team.name} 能力值:{player.overall}")
# ========== 数据生成器 ==========
def generate_players() -> List[Player]:
"""生成球员数据"""
positions = ['PG', 'SG', 'SF', 'PF', 'C']
first_names = ['库里', '詹姆斯', '杜兰特', '字母哥', '东契奇', '约基奇',
'塔图姆', '布克', '恩比德', '莫兰特', '保罗', '利拉德']
last_names = ['亚历山大', '汤普森', '格林', '戴维斯', '欧文', '威廉姆斯']
players = []
for i in range(10): # 每队10人
name = f"{random.choice(first_names)}{random.choice(last_names)}"
position = random.choice(positions)
# 生成不同水平的球员
if i < 3: # 明星球员
overall = random.randint(88, 96)
three_point = random.randint(85, 98)
elif i < 6: # 主力球员
overall = random.randint(80, 88)
three_point = random.randint(70, 90)
else: # 角色球员
overall = random.randint(72, 80)
three_point = random.randint(50, 75)
players.append(Player(name, position, overall, three_point))
return players
def create_teams() -> List[Team]:
"""创建球队"""
team_names = [
("湖人", "洛杉矶"),
("勇士", "旧金山"),
("凯尔特人", "波士顿"),
("雄鹿", "密尔沃基"),
("太阳", "菲尼克斯"),
("掘金", "丹佛"),
]
teams = []
for city, name in team_names:
players = generate_players()
team = Team(name, city, players)
teams.append(team)
return teams
# ========== 主程序 ==========
def main():
"""主函数"""
print("🎮 NBA季后赛模拟系统")
print("="*50)
# 创建球队
print("\n📋 创建球队中...")
teams = create_teams()
# 显示球队信息
print("\n🏟️ 参赛球队:")
for team in teams:
print(f" {team.name} (实力评级: {team.get_team_rating():.1f})")
# 创建分析器
analyzer = StatsAnalyzer()
# 运行模拟(可以多次运行)
num_simulations = 3
champions = defaultdict(int)
for sim in range(num_simulations):
print(f"\n{'='*50}")
print(f"🎲 模拟第{sim+1}次季后赛")
print(f"{'='*50}")
# 重置战绩
for team in teams:
team.wins = 0
team.losses = 0
# 创建赛季模拟器
season = SeasonSimulator(teams)
# 模拟季后赛
champion = season.simulate_playoff()
champions[champion.name] += 1
# 休息一会
time.sleep(1)
# 统计结果
print("\n" + "="*50)
print("📊 最终统计结果")
print("="*50)
# 显示冠军统计
print("\n🏆 冠军次数统计:")
for team_name, count in sorted(champions.items(), key=lambda x: x[1], reverse=True):
print(f" {team_name}: {count}次")
# 分析球队表现
analyzer.analyze_team_performance(teams)
# 查看球员数据
analyzer.analyze_player_stats(teams)
# 得出最终结论
final_champion = max(champions, key=champions.get)
print(f"\n🎉 最终结论:{final_champion}队笑到了最后!他们获得了{champions[final_champion]}次冠军!")
print("\n感谢观看!")
# 程序入口
if __name__ == "__main__":
main()
🎯 程序特色
这个综合案例包含了:
- 面向对象编程:使用
@dataclass定义球员和球队类 - 继承与组合:各类之间互相协作
- 算法设计:比赛模拟算法、统计数据计算
- 数据可视化:清晰的比赛数据输出
- 交互体验:模拟比赛过程,显示详细数据
📊 运行效果
程序会:
- 生成6支随机球队
- 模拟3次完整的季后赛
- 统计哪支球队赢得最多冠军
- 显示详细的比赛数据
- 分析球员和球队表现
运行这个程序,你就能看到哪队能笑到最后!由于有随机因素,每次运行结果都可能不同,增加了趣味性。