将游戏关卡数据存储到文件中的最优实现方案是什么?
关卡数据存储方案建议
完全不需要存储代码,仅存储生成敌人需要的参数即可,这种方案无论是安全性、可维护性还是扩展性都远好于硬编码或者存可执行代码。
- 为什么不存代码:如果你后续有开放玩家自定义关卡的需求,存储可执行代码会带来恶意代码注入的风险;即使仅自己使用,每次修改关卡还要校验代码语法,维护成本比纯参数配置高很多。
- 推荐的配置文件结构:你可以用JSON、YAML这种人类易读的结构化格式存储,以下是对应你现有逻辑的JSON配置示例:
{ "levels": [ { "level_id": 1, "border": null, "spawn_rules": [ { "y_range": [1, 3], "x_range": [0, 6], "enemy_style": 1, "y_offset": 0 } ], "single_enemies": [] }, { "level_id": 2, "border": null, "spawn_rules": [ { "y_range": [0, 3], "x_range": [0, 8], "enemy_style": 1, "y_offset": 0 } ], "single_enemies": [] }, { "level_id": 8, "border": 10, "spawn_rules": [], "single_enemies": [ { "x": "screen_width/2", "y": 170, "enemy_style": 4, "extra_attrs": { "shoot_ratio": 50 } } ] } ] }
- 加载逻辑示例:你只需要写一套通用的解析逻辑,不用每个关卡单独写判断,示例代码如下:
import json class LevelLoader: def __init__(self, config_path="levels.json"): with open(config_path, "r", encoding="utf-8") as f: self.level_configs = json.load(f)["levels"] def load_level(self, level_num, enemy_list, border_default, screen_width): # 找到对应关卡的配置 config = next(c for c in self.level_configs if c["level_id"] == level_num) # 应用关卡自定义border current_border = config["border"] if config["border"] is not None else border_default # 生成规则内的敌人 for rule in config["spawn_rules"]: y_start, y_end = rule["y_range"] x_start, x_end = rule["x_range"] style = rule["enemy_style"] y_offset = rule.get("y_offset", 0) for y in range(y_start, y_end): for x in range(x_start, x_end): enemy = Enemy(x*100 + current_border, y*75 + y_offset, style) enemy_list.append(enemy) # 生成单独配置的特殊敌人 for enemy_cfg in config["single_enemies"]: # 处理特殊坐标,担心eval安全可以用固定标识+映射表替换 x = eval(enemy_cfg["x"]) if isinstance(enemy_cfg["x"], str) else enemy_cfg["x"] y = enemy_cfg["y"] style = enemy_cfg["enemy_style"] enemy = Enemy(x, y, style) # 应用额外属性 if "extra_attrs" in enemy_cfg: for k, v in enemy_cfg["extra_attrs"].items(): setattr(enemy, k, v) enemy_list.append(enemy) return current_border
- 后续扩展优势:后续新增关卡不需要修改业务代码,只需要在配置文件里加对应关卡的配置项即可,你甚至可以基于这个结构做可视化的关卡编辑工具,直接导出配置文件就能使用,开发效率会高很多。
内容的提问来源于stack exchange,提问作者Miłosz
相关产品推荐
相关产品推荐

