技术准备
在开始编码之前,我们需要准备开发环境和相关工具。以下是开发 EsportsManagerGame 所需的技术栈和资源。
1. 技术栈
- 编程语言:Python 3.x(推荐 3.8 或更高版本)。
- 核心库:
numpy
:处理选手数据和比赛模拟的矩阵运算。random
:生成随机选手属性、比赛结果和事件。pygame
:实现游戏图形界面和数据可视化。json
:保存和加载战队状态、选手数据和比赛记录。
- 数据存储:
- 列表存储选手、比赛和任务。
- 字典存储战队信息、赞助商和设施。
- JSON 文件存储游戏进度。
- 用户界面:基于 Pygame 的图形界面,显示战队状态、比赛场景和数据图表。
- 依赖安装:
numpy
:pip install numpy
pygame
:pip install pygame
random
和json
是 Python 标准库,无需额外安装。
2. 开发环境
确保已安装 Python(可从 python.org 下载)。推荐使用 Visual Studio Code 或 PyCharm 作为开发工具,提供代码补全和调试支持。项目结构如下:
esportsmanagergame/
├── main.py # 主程序入口
├── game.py # 游戏逻辑模块
├── team_manager.py # 战队管理和比赛模拟模块
└── data/ # 存储选手和联赛数据├── player_bank.json # 选手库├── leagues.json # 联赛数据
3. 游戏目标
玩家将扮演一名电竞战队经理,目标是在 12 周内(游戏中的时间单位)带领战队达成以下目标:
- 联赛排名:进入顶级联赛前 3 名。
- 任务完成:完成至少 8 个管理任务。
- 选手表现:平均选手评分 > 85 分。 游戏采用回合制,每回合代表一周,玩家需要:
- 招募选手:从选手库中选择合适队员。
- 训练选手:提升技能(反应、策略、团队协作)。
- 参加比赛:制定阵容和策略,赢得积分。
- 管理资源:平衡预算、赞助和设施升级。
- 分析数据:优化选手训练和比赛策略。
- 完成任务:达成排名、胜利或选手表现目标。
- 可视化状态:观察战队表现和数据分析。
- 学习科普知识:了解电竞管理和数据分析原理。
- 保存/加载:保存战队进度。
游戏设计与核心功能
1. 游戏结构
我们将游戏分解为多个模块,使用类和函数封装功能,确保代码清晰且易于维护。以下是核心设计:
Player
类:表示选手,存储属性(反应、策略、协作)和状态。Team
类:管理战队,包含选手、预算和设施。Match
类:模拟比赛,计算结果。League
类:管理联赛排名和赛程。Task
类:定义管理任务和奖励。EsportsManagerGame
类:管理游戏状态、战队和主循环。- 算法:
- 选手表现:基于属性和训练计算评分。
- 比赛模拟:结合选手评分、策略和随机因素决定胜负。
- 资源管理:预算分配影响训练和设施。
- 数据分析:简单统计分析选手和对手表现。
- 数据结构:
- 选手:列表存储属性和状态。
- 战队:字典存储选手、预算和设施。
- 比赛:列表存储对阵和结果。
- 联赛:字典存储排名和赛程。
- 任务:字典存储目标和奖励。
- 游戏状态:周数、战队、积分和任务状态。
2. 核心代码实现
以下是游戏的完整代码框架,我们将逐一讲解每个模块的实现细节。
2.1 数据准备
首先生成选手库和联赛数据,保存为 JSON 文件。
# data/generate_data.py
import json
import randomdef generate_player_bank():"""生成选手库"""positions = ["top", "jungle", "mid", "adc", "support"]player_bank = []for i in range(100):player = {"id": i + 1,"name": f"Player_{i + 1}","position": random.choice(positions),"reaction": random.randint(60, 90),"strategy": random.randint(60, 90),"teamwork": random.randint(60, 90),"salary": random.randint(5000, 20000)}player_bank.append(player)with open("data/player_bank.json", "w") as f:json.dump(player_bank, f, indent=2)print("选手库已生成!")def generate_leagues():"""生成联赛数据"""leagues = {"bronze": {"level": 1, "base_prize": 10000, "teams": [f"Team_{i}" for i in range(1, 9)]},"silver": {"level": 2, "base_prize": 20000, "teams": [f"Team_{i}" for i in range(9, 17)]},"gold": {"level": 3, "base_prize": 50000, "teams": [f"Team_{i}" for i in range(17, 25)]}}with open("data/leagues.json", "w") as f:json.dump(leagues, f, indent=2)print("联赛数据已生成!")if __name__ == "__main__":generate_player_bank()generate_leagues()
说明:
player_bank.json
:生成 100 名选手,包含 ID、名字、位置和属性。leagues.json
:定义青铜、白银和黄金联赛,包含级别、奖金和队伍。
2.2 选手管理类:Player
Player
类表示选手。
# team_manager.py
import randomclass Player:def __init__(self, id, name, position, reaction, strategy, teamwork, salary):"""初始化选手"""self.id = idself.name = nameself.position = positionself.reaction = reactionself.strategy = strategyself.teamwork = teamworkself.salary = salaryself.fatigue = 0self.rating = self.calculate_rating()def calculate_rating(self):"""计算选手评分"""return (self.reaction + self.strategy + self.teamwork) / 3def train(self, facility_level):"""训练提升属性"""if self.fatigue < 80:self.reaction += random.randint(0, 2) * facility_levelself.strategy += random.randint(0, 2) * facility_levelself.teamwork += random.randint(0, 2) * facility_levelself.reaction = min(100, self.reaction)self.strategy = min(100, self.strategy)self.teamwork = min(100, self.teamwork)self.fatigue += random.randint(10, 20)self.rating = self.calculate_rating()def rest(self):"""休息降低疲劳"""self.fatigue = max(0, self.fatigue - random.randint(20, 30))
说明:
__init__
:初始化选手属性、薪资和疲劳值。calculate_rating
:平均反应、策略和协作得分。train
:根据设施等级提升属性,增加疲劳。rest
:降低疲劳值。
2.3 战队类:Team
Team
类管理战队。
# team_manager.py (续)
class Team:def __init__(self, name, budget=100000):"""初始化战队"""self.name = nameself.players = []self.budget = budgetself.training_facility = 1 # 训练设施等级self.analyst_level = 1 # 数据分析师等级self.points = 0self.league = "bronze"def recruit_player(self, player):"""招募选手"""if len(self.players) < 5 and self.budget >= player.salary:self.players.append(player)self.budget -= player.salaryreturn Truereturn Falsedef release_player(self, player):"""释放选手"""if player in self.players:self.players.remove(player)def upgrade_facility(self):"""升级训练设施"""cost = self.training_facility * 20000if self.budget >= cost:self.budget -= costself.training_facility += 1return Truereturn Falsedef hire_analyst(self):"""提升分析师等级"""cost = self.analyst_level * 15000if self.budget >= cost:self.budget -= costself.analyst_level += 1return Truereturn False
说明:
__init__
:初始化战队名称、预算、选手和设施。recruit_player
和release_player
:管理选手。upgrade_facility
和hire_analyst
:升级设施和分析师。
2.4 比赛类:Match
Match
类模拟比赛。
# team_manager.py (续)
import numpy as npclass Match:def __init__(self, team1, team2, analyst_level):"""初始化比赛"""self.team1 = team1self.team2 = team2self.analyst_level = analyst_leveldef simulate(self):"""模拟比赛"""team1_score = sum(p.rating for p in self.team1.players) / len(self.team1.players) if self.team1.players else 0team2_score = random.randint(60, 90) # 模拟对手team1_score += self.analyst_level * 2 # 分析师加成team1_score -= sum(p.fatigue for p in self.team1.players) / len(self.team1.players) * 0.1 if self.team1.players else 0win_prob = 1 / (1 + np.exp(-(team1_score - team2_score) / 10))result = "win" if random.random() < win_prob else "lose"points = 3 if result == "win" else 0return result, points
说明:
__init__
:初始化对阵双方和分析师等级。simulate
:基于选手评分、疲劳和分析师等级计算胜负。
2.5 联赛类:League
League
类管理联赛。
# team_manager.py (续)
class League:def __init__(self, name, level, base_prize, teams):"""初始化联赛"""self.name = nameself.level = levelself.base_prize = base_prizeself.teams = teamsself.rankings = {team: 0 for team in teams}def update_rankings(self, team, points):"""更新排名"""self.rankings[team] += points
说明:
__init__
:初始化联赛名称、级别、奖金和队伍。update_rankings
:更新队伍积分。
2.6 任务类:Task
Task
类定义管理任务。
# game.py
class Task:def __init__(self, id, target, target_value, reward):"""初始化任务"""self.id = idself.target = target # 目标(胜利、排名、选手评分)self.target_value = target_valueself.reward = reward # 奖励(预算或设施升级)self.created_week = 0
说明:
__init__
:初始化任务 ID、目标、目标值和奖励。
2.7 游戏类:EsportsManagerGame
EsportsManagerGame
类管理游戏状态和逻辑。
# game.py
import pygame
import json
import random
from team_manager import Player, Team, Match, Leagueclass EsportsManagerGame:def __init__(self):"""初始化游戏"""pygame.init()self.screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("EsportsManagerGame")self.font = pygame.font.Font(None, 24)self.clock = pygame.time.Clock()self.team = Team("YourTeam")self.week = 0self.max_weeks = 12self.tasks = []self.leagues = {}self.load_leagues()self.player_bank = []self.load_players()self.current_league = self.leagues["bronze"]self.game_over = Falseself.match_result = Noneself.selected_player = Nonedef load_leagues(self):"""加载联赛数据"""with open("data/leagues.json", "r") as f:leagues = json.load(f)for name, data in leagues.items():self.leagues[name] = League(name, data["level"], data["base_prize"], data["teams"])def load_players(self):"""加载选手库"""with open("data/player_bank.json", "r") as f:players = json.load(f)self.player_bank = [Player(**p) for p in players]def run(self):"""游戏主循环"""print("欢迎来到《EsportsManagerGame》!目标:在 12 周内进入顶级联赛前 3,完成 8 个任务,选手评分 > 85。")running = Truewhile running and not self.game_over:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_r and self.team.budget >= 5000:self.recruit_player()elif event.key == pygame.K_t:self.train_team()elif event.key == pygame.K_m:self.play_match()elif event.key == pygame.K_f:self.team.upgrade_facility()elif event.key == pygame.K_a:self.team.hire_analyst()elif event.key == pygame.K_s:self.save_game()elif event.key == pygame.K_l:self.load_game()self.step()self.display_state()self.clock.tick(30)if self.check_win():print("恭喜!你带领战队夺冠!")self.game_over = Trueif self.check_lose():print("游戏结束。未能达成目标。")self.game_over = Truepygame.quit()def recruit_player(self):"""招募选手"""available_players = [p for p in self.player_bank if p not in self.team.players]if available_players:player = random.choice(available_players)if self.team.recruit_player(player):print(f"招募选手:{player.name} ({player.position}),薪资:{player.salary}")def train_team(self):"""训练战队"""for player in self.team.players:player.train(self.team.training_facility)print("战队训练完成!")def play_match(self):"""进行比赛"""opponent = random.choice([t for t in self.current_league.teams if t != self.team.name])match = Match(self.team, opponent, self.team.analyst_level)result, points = match.simulate()self.team.points += pointsself.current_league.update_rankings(self.team.name, points)self.match_result = f"对阵 {opponent}: {'胜利' if result == 'win' else '失败'},积分 +{points}"print(self.match_result)def step(self):"""单步更新"""self.week += 1self.team.budget += self.current_league.base_prize / 12 # 每周收入for player in self.team.players:player.rest()self.generate_task()self.complete_tasks()self.update_league()def update_league(self):"""更新联赛"""if self.week % 4 == 0:rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)if self.current_league.name != "gold" and rankings[0][0] == self.team.name:new_league = "silver" if self.current_league.name == "bronze" else "gold"self.current_league = self.leagues[new_league]self.team.league = new_leagueprint(f"晋级到 {new_league} 联赛!")def generate_task(self):"""生成任务"""if random.random() < 0.3:task_id = len(self.tasks) + 1target = random.choice(["Win", "Ranking", "Rating"])target_value = random.randint(2, 5) if target == "Win" else 3 if target == "Ranking" else 85reward = {"budget": 20000} if target != "Rating" else {"budget": 15000}task = Task(task_id, target, target_value, reward)task.created_week = self.weekself.tasks.append(task)print(f"任务 ID {task_id}: {target} 达到 {target_value},奖励 {reward}")def complete_tasks(self):"""完成任务"""for task in self.tasks[:]:if task.target == "Win" and self.team.points >= task.target_value * 3:self.team.budget += task.reward.get("budget", 0)self.tasks.remove(task)print(f"任务 ID {task.id} 完成!预算增加 {task.reward.get('budget', 0)}")elif task.target == "Ranking":rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)rank = [t[0] for t in rankings].index(self.team.name) + 1 if self.team.name in self.current_league.rankings else 999if rank <= task.target_value:self.team.budget += task.reward.get("budget", 0)self.tasks.remove(task)print(f"任务 ID {task.id} 完成!预算增加 {task.reward.get('budget', 0)}")elif task.target == "Rating" and self.team.players and sum(p.rating for p in self.team.players) / len(self.team.players) >= task.target_value:self.team.budget += task.reward.get("budget", 0)self.tasks.remove(task)print(f"任务 ID {task.id} 完成!预算增加 {task.reward.get('budget', 0)}")elif self.week - task.created_week >= 4:print(f"任务 ID {task.id} 过期!")self.tasks.remove(task)def display_state(self):"""显示游戏状态"""self.screen.fill((255, 255, 255))# 显示战队texts = [f"Week: {self.week}/{self.max_weeks}",f"Team: {self.team.name} ({self.team.league})",f"Budget: {self.team.budget:.0f}",f"Points: {self.team.points}",f"Training Facility: Level {self.team.training_facility}",f"Analyst Level: {self.team.analyst_level}",f"Press R to recruit, T to train, M to match, F to upgrade facility, A to hire analyst",f"Press S to save, L to load"]for i, text in enumerate(texts):rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (10, 10 + i * 30))# 显示选手if self.team.players:for i, player in enumerate(self.team.players):text = f"{player.name} ({player.position}): Rating {player.rating:.1f}, Fatigue {player.fatigue:.1f}"rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (10, 200 + i * 30))# 显示比赛结果if self.match_result:rendered = self.font.render(self.match_result, True, (0, 0, 255))self.screen.blit(rendered, (10, 350))# 显示任务if self.tasks:for i, task in enumerate(self.tasks):text = f"Task {task.id}: {task.target} {task.target_value}"rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (10, 400 + i * 30))# 显示排名rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)for i, (team, points) in enumerate(rankings[:3]):text = f"Rank {i+1}: {team} ({points} points)"rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (400, 10 + i * 30))pygame.display.flip()# CLI 输出print(f"\nWeek {self.week}")print(f"预算: {self.team.budget:.0f}")print(f"联赛: {self.team.league}, 积分: {self.team.points}")if self.team.players:print("选手:")for p in self.team.players:print(f"{p.name} ({p.position}): 评分 {p.rating:.1f}, 疲劳 {p.fatigue:.1f}")if self.match_result:print(self.match_result)def save_game(self):"""保存游戏状态"""state = {"week": self.week,"team": {"name": self.team.name,"budget": self.team.budget,"points": self.team.points,"league": self.team.league,"training_facility": self.team.training_facility,"analyst_level": self.team.analyst_level,"players": [{"id": p.id, "name": p.name, "position": p.position, "reaction": p.reaction, "strategy": p.strategy, "teamwork": p.teamwork, "salary": p.salary, "fatigue": p.fatigue} for p in self.team.players]},"tasks": [{"id": t.id, "target": t.target, "target_value": t.target_value, "reward": t.reward, "created_week": t.created_week} for t in self.tasks],"league_rankings": {name: league.rankings for name, league in self.leagues.items()}}with open("savegame.json", "w") as f:json.dump(state, f)print("游戏已保存!")def load_game(self):"""加载游戏状态"""try:with open("savegame.json", "r") as f:state = json.load(f)self.week = state["week"]self.team = Team(state["team"]["name"], state["team"]["budget"])self.team.points = state["team"]["points"]self.team.league = state["team"]["league"]self.team.training_facility = state["team"]["training_facility"]self.team.analyst_level = state["team"]["analyst_level"]self.team.players = [Player(**p) for p in state["team"]["players"]]self.tasks = [Task(t["id"], t["target"], t["target_value"], t["reward"]) for t in state["tasks"]]for t in self.tasks:t.created_week = state["tasks"][self.tasks.index(t)]["created_week"]for name, rankings in state["league_rankings"].items():self.leagues[name].rankings = rankingsself.current_league = self.leagues[self.team.league]print("游戏已加载!")except FileNotFoundError:print("没有找到存档文件!")def check_win(self):"""检查胜利条件"""rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)rank = [t[0] for t in rankings].index(self.team.name) + 1 if self.team.name in self.current_league.rankings else 999tasks_completed = len([t for t in self.tasks if not t.created_week])avg_rating = sum(p.rating for p in self.team.players) / len(self.team.players) if self.team.players else 0return self.week >= self.max_weeks and self.team.league == "gold" and rank <= 3 and tasks_completed >= 8 and avg_rating > 85def check_lose(self):"""检查失败条件"""return self.week >= self.max_weeks and not self.check_win()
说明:
__init__
:初始化 Pygame、战队、联赛和选手库。load_leagues
和load_players
:加载联赛和选手数据。run
:游戏主循环,处理输入、更新状态和渲染界面。recruit_player
、train_team
和play_match
:执行核心操作。step
:更新周数、预算和任务。update_league
:每 4 周检查晋级。generate_task
和complete_tasks
:生成和完成任务。display_state
:绘制战队、选手、比赛结果和排名。save_game
和load_game
:保存和加载游戏状态。check_win
和check_lose
:检查胜利和失败条件。
2.8 主程序:main.py
启动游戏的入口文件。
# main.py
from game import EsportsManagerGameif __name__ == "__main__":game = EsportsManagerGame()game.run()
运行游戏
1. 准备数据
首先生成选手库和联赛数据:
mkdir data
python data/generate_data.py
2. 启动游戏
确保安装了依赖,在项目目录下运行:
pip install numpy pygame
python main.py
3. 游戏流程
- 初始化:
- 创建战队,初始预算 100000,青铜联赛。
- 加载 100 名选手和 3 个联赛。
- 每周循环:
- 招募:按 R 招募选手(消耗薪资)。
- 训练:按 T 提升选手属性(增加疲劳)。
- 比赛:按 M 参加比赛,赚取积分。
- 升级:按 F 升级设施,A 提升分析师。
- 任务:完成胜利、排名或评分任务。
- 可视化:显示战队状态、选手数据和排名。
- 游戏结束:
- 12 周后进入黄金联赛前 3,完成 8 个任务,选手评分 > 85 胜利。
- 未达标失败。
4. 示例运行
欢迎来到《EsportsManagerGame》!目标:在 12 周内进入顶级联赛前 3,完成 8 个任务,选手评分 > 85。Week 1
预算: 100000
联赛: bronze, 积分: 0
任务 ID 1: Win 达到 3,奖励 {'budget': 20000}Week 2
预算: 83333
联赛: bronze, 积分: 3
选手:
Player_5 (mid): 评分 75.0, 疲劳 15.0
Player_12 (adc): 评分 80.0, 疲劳 10.0
对阵 Team_3: 胜利,积分 +3Week 3
预算: 91666
联赛: bronze, 积分: 6
选手:
Player_5 (mid): 评分 77.0, 疲劳 0.0
Player_12 (adc): 评分 82.0, 疲劳 0.0
对阵 Team_7: 胜利,积分 +3
任务 ID 1 完成!预算增加 20000
分析:
- 第一周:生成胜利任务。
- 第二周:招募选手,赢得比赛,积分增加。
- 第三周:完成任务,预算增加,选手休息。
游戏机制详解
1. 选手管理
- 属性:反应、策略、协作(60-100),影响评分。
- 训练:提升属性,增加疲劳。
- 疲劳:高疲劳降低比赛表现,休息恢复。
- 薪资:影响预算,需平衡。
2. 比赛模拟
- 评分:平均选手评分,分析师加成,疲劳减益。
- 胜负:基于评分差和随机性计算胜率。
- 积分:胜利得 3 分,失败 0 分。
3. 资源管理
- 预算:用于招募、升级设施和分析师。
- 收入:每周从联赛奖金获得。
- 设施:提升训练效果。
- 分析师:提升比赛胜率。
4. 联赛系统
- 级别:青铜、白银、黄金,难度递增。
- 晋级:每 4 周排名第一晋级。
- 排名:基于积分,显示前 3。
5. 任务系统
- 胜利任务:赢得指定场次,奖励预算。
- 排名任务:达到前 3,奖励预算。
- 评分任务:选手平均评分达标,奖励预算。
- 过期:4 周未完成移除。
6. 可视化
- 战队:显示预算、积分、设施和分析师等级。
- 选手:显示名字、位置、评分和疲劳。
- 比赛:显示最新比赛结果。
- 排名:显示联赛前 3 名。
7. 胜利与失败
- 胜利:12 周后在黄金联赛排名前 3,完成 8 个任务,选手评分 > 85。
- 失败:12 周未达标。
游戏扩展与优化
当前版本是一个功能完整的电竞战队管理游戏原型,我们可以通过以下方式增强游戏性、技术实现和教育价值。
1. 游戏性增强
- 新角色:添加教练、心理师角色,影响选手状态。
- 动态对手:模拟对手选手属性和策略。
- 比赛模式:增加 BO3、BO5 赛制。
- 玩家互动:允许手动调整阵容和策略。
示例代码:动态对手
class Match:def __init__(self, team1, team2, analyst_level, opponent_players):self.team1 = team1self.team2 = team2self.analyst_level = analyst_levelself.opponent_players = opponent_playersdef simulate(self):team1_score = sum(p.rating for p in self.team1.players) / len(self.team1.players) if self.team1.players else 0team2_score = sum(p.rating for p in self.opponent_players) / len(self.opponent_players) if self.opponent_players else 0team1_score += self.analyst_level * 2team1_score -= sum(p.fatigue for p in self.team1.players) / len(self.team1.players) * 0.1 if self.team1.players else 0win_prob = 1 / (1 + np.exp(-(team1_score - team2_score) / 10))result = "win" if random.random() < win_prob else "lose"points = 3 if result == "win" else 0return result, points
实现效果:
- 模拟对手选手属性,增加比赛真实性。
2. 技术优化
- 数据分析:添加选手表现统计图表。
- AI策略:使用简单机器学习模型优化阵容。
- 存档加密:防止修改存档文件。
- 外部配置:从 JSON 文件加载联赛和选手参数。
示例代码:数据分析图表
class EsportsManagerGame:def display_state(self):self.screen.fill((255, 255, 255))# 现有显示代码if self.team.players:ratings = [p.rating for p in self.team.players]```chartjs{"type": "bar","data": {"labels": [p.name for p in self.team.players],"datasets": [{"label": "Player Rating","data": ratings,"backgroundColor": ["rgba(0, 123, 255, 0.5)"],"borderColor": ["rgba(0, 123, 255, 1)"],"borderWidth": 1}]},"options": {"scales": {"y": {"beginAtZero": true,"max": 100}}}}```pygame.display.flip()
实现效果:
- 显示选手评分柱状图,增强数据可视化。
3. 教育模块
- 电竞管理:介绍选手管理、预算分配和联赛机制。
- 数据分析:解释如何用数据优化策略。
- 团队协作:分享电竞团队的协作原理。
示例代码:科普提示
class EsportsManagerGame:def display_state(self):self.screen.fill((255, 255, 255))# 现有显示代码if self.week % 3 == 0:tips = ["高疲劳会降低选手表现,注意安排休息。","分析师等级提升比赛胜率,优先考虑。","合理分配预算,确保招募与设施平衡。"]tip = random.choice(tips)rendered = self.font.render(tip, True, (255, 165, 0))self.screen.blit(rendered, (10, 550))pygame.display.flip()
实现效果:
- 每 3 周显示一个随机科普提示。
游戏策略与玩法分析
1. 玩家策略
- 选手选择:优先招募高评分、低薪资选手。
- 训练计划:平衡训练和休息,控制疲劳。
- 资源分配:优先升级设施,次选分析师。
- 任务优先:完成高奖励任务增加预算。
2. 平衡性
- 初始预算:100000 足够早期招募。
- 任务概率:30% 提供适度挑战。
- 联赛难度:青铜到黄金递增,需策略提升。
- 时间限制:12 周需高效管理。
3. 重玩价值
- 尝试不同选手组合。
- 优化训练和资源策略。
- 学习电竞管理和数据分析知识。
附录:完整代码
以下是整合后的完整代码,分为 generate_data.py
、team_manager.py
、game.py
和 main.py
,可直接运行。
data/generate_data.py
import json
import randomdef generate_player_bank():positions = ["top", "jungle", "mid", "adc", "support"]player_bank = []for i in range(100):player = {"id": i + 1,"name": f"Player_{i + 1}","position": random.choice(positions),"reaction": random.randint(60, 90),"strategy": random.randint(60, 90),"teamwork": random.randint(60, 90),"salary": random.randint(5000, 20000)}player_bank.append(player)with open("data/player_bank.json", "w") as f:json.dump(player_bank, f, indent=2)print("选手库已生成!")def generate_leagues():leagues = {"bronze": {"level": 1, "base_prize": 10000, "teams": [f"Team_{i}" for i in range(1, 9)]},"silver": {"level": 2, "base_prize": 20000, "teams": [f"Team_{i}" for i in range(9, 17)]},"gold": {"level": 3, "base_prize": 50000, "teams": [f"Team_{i}" for i in range(17, 25)]}}with open("data/leagues.json", "w") as f:json.dump(leagues, f, indent=2)print("联赛数据已生成!")if __name__ == "__main__":generate_player_bank()generate_leagues()
team_manager.py
import random
import numpy as npclass Player:def __init__(self, id, name, position, reaction, strategy, teamwork, salary):self.id = idself.name = nameself.position = positionself.reaction = reactionself.strategy = strategyself.teamwork = teamworkself.salary = salaryself.fatigue = 0self.rating = self.calculate_rating()def calculate_rating(self):return (self.reaction + self.strategy + self.teamwork) / 3def train(self, facility_level):if self.fatigue < 80:self.reaction += random.randint(0, 2) * facility_levelself.strategy += random.randint(0, 2) * facility_levelself.teamwork += random.randint(0, 2) * facility_levelself.reaction = min(100, self.reaction)self.strategy = min(100, self.strategy)self.teamwork = min(100, self.teamwork)self.fatigue += random.randint(10, 20)self.rating = self.calculate_rating()def rest(self):self.fatigue = max(0, self.fatigue - random.randint(20, 30))class Team:def __init__(self, name, budget=100000):self.name = nameself.players = []self.budget = budgetself.training_facility = 1self.analyst_level = 1self.points = 0self.league = "bronze"def recruit_player(self, player):if len(self.players) < 5 and self.budget >= player.salary:self.players.append(player)self.budget -= player.salaryreturn Truereturn Falsedef release_player(self, player):if player in self.players:self.players.remove(player)def upgrade_facility(self):cost = self.training_facility * 20000if self.budget >= cost:self.budget -= costself.training_facility += 1return Truereturn Falsedef hire_analyst(self):cost = self.analyst_level * 15000if self.budget >= cost:self.budget -= costself.analyst_level += 1return Truereturn Falseclass Match:def __init__(self, team1, team2, analyst_level):self.team1 = team1self.team2 = team2self.analyst_level = analyst_leveldef simulate(self):team1_score = sum(p.rating for p in self.team1.players) / len(self.team1.players) if self.team1.players else 0team2_score = random.randint(60, 90)team1_score += self.analyst_level * 2team1_score -= sum(p.fatigue for p in self.team1.players) / len(self.team1.players) * 0.1 if self.team1.players else 0win_prob = 1 / (1 + np.exp(-(team1_score - team2_score) / 10))result = "win" if random.random() < win_prob else "lose"points = 3 if result == "win" else 0return result, pointsclass League:def __init__(self, name, level, base_prize, teams):self.name = nameself.level = levelself.base_prize = base_prizeself.teams = teamsself.rankings = {team: 0 for team in teams}def update_rankings(self, team, points):self.rankings[team] += points
game.py
import pygame
import json
import random
from team_manager import Player, Team, Match, Leagueclass Task:def __init__(self, id, target, target_value, reward):self.id = idself.target = targetself.target_value = target_valueself.reward = rewardself.created_week = 0class EsportsManagerGame:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("EsportsManagerGame")self.font = pygame.font.Font(None, 24)self.clock = pygame.time.Clock()self.team = Team("YourTeam")self.week = 0self.max_weeks = 12self.tasks = []self.leagues = {}self.load_leagues()self.player_bank = []self.load_players()self.current_league = self.leagues["bronze"]self.game_over = Falseself.match_result = Noneself.selected_player = Nonedef load_leagues(self):with open("data/leagues.json", "r") as f:leagues = json.load(f)for name, data in leagues.items():self.leagues[name] = League(name, data["level"], data["base_prize"], data["teams"])def load_players(self):with open("data/player_bank.json", "r") as f:players = json.load(f)self.player_bank = [Player(**p) for p in players]def run(self):print("欢迎来到《EsportsManagerGame》!目标:在 12 周内进入顶级联赛前 3,完成 8 个任务,选手评分 > 85。")running = Truewhile running and not self.game_over:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_r and self.team.budget >= 5000:self.recruit_player()elif event.key == pygame.K_t:self.train_team()elif event.key == pygame.K_m:self.play_match()elif event.key == pygame.K_f:self.team.upgrade_facility()elif event.key == pygame.K_a:self.team.hire_analyst()elif event.key == pygame.K_s:self.save_game()elif event.key == pygame.K_l:self.load_game()self.step()self.display_state()self.clock.tick(30)if self.check_win():print("恭喜!你带领战队夺冠!")self.game_over = Trueif self.check_lose():print("游戏结束。未能达成目标。")self.game_over = Truepygame.quit()def recruit_player(self):available_players = [p for p in self.player_bank if p not in self.team.players]if available_players:player = random.choice(available_players)if self.team.recruit_player(player):print(f"招募选手:{player.name} ({player.position}),薪资:{player.salary}")def train_team(self):for player in self.team.players:player.train(self.team.training_facility)print("战队训练完成!")def play_match(self):opponent = random.choice([t for t in self.current_league.teams if t != self.team.name])match = Match(self.team, opponent, self.team.analyst_level)result, points = match.simulate()self.team.points += pointsself.current_league.update_rankings(self.team.name, points)self.match_result = f"对阵 {opponent}: {'胜利' if result == 'win' else '失败'},积分 +{points}"print(self.match_result)def step(self):self.week += 1self.team.budget += self.current_league.base_prize / 12for player in self.team.players:player.rest()self.generate_task()self.complete_tasks()self.update_league()def update_league(self):if self.week % 4 == 0:rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)if self.current_league.name != "gold" and rankings[0][0] == self.team.name:new_league = "silver" if self.current_league.name == "bronze" else "gold"self.current_league = self.leagues[new_league]self.team.league = new_leagueprint(f"晋级到 {new_league} 联赛!")def generate_task(self):if random.random() < 0.3:task_id = len(self.tasks) + 1target = random.choice(["Win", "Ranking", "Rating"])target_value = random.randint(2, 5) if target == "Win" else 3 if target == "Ranking" else 85reward = {"budget": 20000} if target != "Rating" else {"budget": 15000}task = Task(task_id, target, target_value, reward)task.created_week = self.weekself.tasks.append(task)print(f"任务 ID {task_id}: {target} 达到 {target_value},奖励 {reward}")def complete_tasks(self):for task in self.tasks[:]:if task.target == "Win" and self.team.points >= task.target_value * 3:self.team.budget += task.reward.get("budget", 0)self.tasks.remove(task)print(f"任务 ID {task.id} 完成!预算增加 {task.reward.get('budget', 0)}")elif task.target == "Ranking":rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)rank = [t[0] for t in rankings].index(self.team.name) + 1 if self.team.name in self.current_league.rankings else 999if rank <= task.target_value:self.team.budget += task.reward.get("budget", 0)self.tasks.remove(task)print(f"任务 ID {task.id} 完成!预算增加 {task.reward.get('budget', 0)}")elif task.target == "Rating" and self.team.players and sum(p.rating for p in self.team.players) / len(self.team.players) >= task.target_value:self.team.budget += task.reward.get("budget", 0)self.tasks.remove(task)print(f"任务 ID {task.id} 完成!预算增加 {task.reward.get('budget', 0)}")elif self.week - task.created_week >= 4:print(f"任务 ID {task.id} 过期!")self.tasks.remove(task)def display_state(self):self.screen.fill((255, 255, 255))texts = [f"Week: {self.week}/{self.max_weeks}",f"Team: {self.team.name} ({self.team.league})",f"Budget: {self.team.budget:.0f}",f"Points: {self.team.points}",f"Training Facility: Level {self.team.training_facility}",f"Analyst Level: {self.team.analyst_level}",f"Press R to recruit, T to train, M to match, F to upgrade facility, A to hire analyst",f"Press S to save, L to load"]for i, text in enumerate(texts):rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (10, 10 + i * 30))if self.team.players:for i, player in enumerate(self.team.players):text = f"{player.name} ({player.position}): Rating {player.rating:.1f}, Fatigue {player.fatigue:.1f}"rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (10, 200 + i * 30))if self.match_result:rendered = self.font.render(self.match_result, True, (0, 0, 255))self.screen.blit(rendered, (10, 350))if self.tasks:for i, task in enumerate(self.tasks):text = f"Task {task.id}: {task.target} {task.target_value}"rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (10, 400 + i * 30))rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)for i, (team, points) in enumerate(rankings[:3]):text = f"Rank {i+1}: {team} ({points} points)"rendered = self.font.render(text, True, (0, 0, 0))self.screen.blit(rendered, (400, 10 + i * 30))pygame.display.flip()print(f"\nWeek {self.week}")print(f"预算: {self.team.budget:.0f}")print(f"联赛: {self.team.league}, 积分: {self.team.points}")if self.team.players:print("选手:")for p in self.team.players:print(f"{p.name} ({p.position}): 评分 {p.rating:.1f}, 疲劳 {p.fatigue:.1f}")if self.match_result:print(self.match_result)def save_game(self):state = {"week": self.week,"team": {"name": self.team.name,"budget": self.team.budget,"points": self.team.points,"league": self.team.league,"training_facility": self.team.training_facility,"analyst_level": self.team.analyst_level,"players": [{"id": p.id, "name": p.name, "position": p.position, "reaction": p.reaction, "strategy": p.strategy, "teamwork": p.teamwork, "salary": p.salary, "fatigue": p.fatigue} for p in self.team.players]},"tasks": [{"id": t.id, "target": t.target, "target_value": t.target_value, "reward": t.reward, "created_week": t.created_week} for t in self.tasks],"league_rankings": {name: league.rankings for name, league in self.leagues.items()}}with open("savegame.json", "w") as f:json.dump(state, f)print("游戏已保存!")def load_game(self):try:with open("savegame.json", "r") as f:state = json.load(f)self.week = state["week"]self.team = Team(state["team"]["name"], state["team"]["budget"])self.team.points = state["team"]["points"]self.team.league = state["team"]["league"]self.team.training_facility = state["team"]["training_facility"]self.team.analyst_level = state["team"]["analyst_level"]self.team.players = [Player(**p) for p in state["team"]["players"]]self.tasks = [Task(t["id"], t["target"], t["target_value"], t["reward"]) for t in state["tasks"]]for t in self.tasks:t.created_week = state["tasks"][self.tasks.index(t)]["created_week"]for name, rankings in state["league_rankings"].items():self.leagues[name].rankings = rankingsself.current_league = self.leagues[self.team.league]print("游戏已加载!")except FileNotFoundError:print("没有找到存档文件!")def check_win(self):rankings = sorted(self.current_league.rankings.items(), key=lambda x: x[1], reverse=True)rank = [t[0] for t in rankings].index(self.team.name) + 1 if self.team.name in self.current_league.rankings else 999tasks_completed = len([t for t in self.tasks if not t.created_week])avg_rating = sum(p.rating for p in self.team.players) / len(self.team.players) if self.team.players else 0return self.week >= self.max_weeks and self.team.league == "gold" and rank <= 3 and tasks_completed >= 8 and avg_rating > 85def check_lose(self):return self.week >= self.max_weeks and not self.check_win()
main.py
from game import EsportsManagerGameif __name__ == "__main__":game = EsportsManagerGame()game.run()