You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将游戏关卡数据存储到文件中的最优实现方案是什么?

关卡数据存储方案建议

完全不需要存储代码,仅存储生成敌人需要的参数即可,这种方案无论是安全性、可维护性还是扩展性都远好于硬编码或者存可执行代码。

  • 为什么不存代码:如果你后续有开放玩家自定义关卡的需求,存储可执行代码会带来恶意代码注入的风险;即使仅自己使用,每次修改关卡还要校验代码语法,维护成本比纯参数配置高很多。
  • 推荐的配置文件结构:你可以用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:54:05