一款基于 Godot 4.7+ 开发的经典 2048 游戏克隆,专为移动端竖屏(720×1280)设计。合并相同数字直到 2048——简单的规则、上瘾的体验,一份结构优雅、注释详尽的 Godot 学习范本。
整个项目纯代码构建:main.tscn 仅 6 行(根节点 + 脚本引用)。主题样式由 ThemeBuilder 纯代码生成(替代 9 个 .tres 文件),UI 节点由 ViewBuilder 在运行时构建,无 .tscn / .tres 资源黑盒。读 .gd 即可理解全貌。
ThemeBuilder 替代 .tres,ViewConfig 单一数据源GridView 直接监听键盘/触摸,发射 move_requested 信号,无需 Controller 中转GridView 通过 _dead/_live 数组复用 TileView,避免频繁创建/销毁节点与 Block Fall、Block Blast 一脉相承的 Logic-View 分层,替代常见的 MVC,main.gd 仅 96 行薄层协调器:
| 层 | 职责 | 关键文件 |
|---|---|---|
| logic/ | 纯游戏逻辑。Game / GameGrid / GameTile 均继承 RefCounted,无场景树依赖、可单元测试;SaveData 负责最高分 JSON 存档 |
game.gd game_grid.gd game_tile.gd save_data.gd |
| view/ | 纯渲染 + 输入处理。GridView 监听键盘/触摸 → 发射 move_requested;三种动画状态(生成/移动/合并)通过 Tween 实现 |
grid_view.gd tile_view.gd view_config.gd theme_builder.gd view_builder.gd |
| main.gd | 薄协调者。ViewBuilder.build() 构建 UI → 连接 Logic ↔ View 信号 → Game.start() 启动 |
— |
关键:Logic 层全部是 RefCounted,无需场景树即可直接实例化测试——Game.new() + 固定随机种子 = 可复现的测试棋盘。
项目自带轻量级测试框架(无插件依赖),测试目录比 Block Blast 还完整:
tests/test_*.gd)— 覆盖 Game(移动/合并/计分/胜负/死局)、GameGrid(网格存取)、GameTile(数据约束)、SaveData(分数格式化)tests/smoke_test.gd)— 实例化真实主场景,验证全流程over 信号等用例运行方式:
godot --headless --path . --script res://tests/test_runner.gd # 单元测试
godot --headless --path . --script res://tests/smoke_test.gd # 冒烟测试
999 / 1.0k / 1.0m),最高分 JSON 持久化godot-2048/
├── resources/ # 静态资源
│ └── fonts/ # JetBrainsMono 字体(常规 + 粗体)
├── logic/ # 游戏逻辑层 (Logic)
│ ├── game.gd # Game:移动/合并/计分/胜负(RefCounted 纯逻辑)
│ ├── game_grid.gd # 4×4 网格数据结构
│ ├── game_tile.gd # 单个方块数据(值、位置、合并来源)
│ └── save_data.gd # 最高分 JSON 持久化(format_score 格式化)
├── view/ # 渲染层 (View)
│ ├── grid_view.gd # UI 网格 + 对象池 + Tween 动画 + 输入处理
│ ├── tile_view.gd # 方块绘制(位运算颜色 + 字体自适应)
│ ├── view_config.gd # 视图配置常量(尺寸、颜色、字体)
│ ├── theme_builder.gd # 主题工厂(纯代码构建 Theme,替代 9 个 .tres)
│ └── view_builder.gd # 场景构建器(纯代码构建节点树)
├── tests/ # 测试(无插件依赖,覆盖 Logic 全层)
│ ├── test_runner.gd # 单元测试运行器
│ ├── smoke_test.gd # 冒烟测试
│ ├── test_base.gd # 断言基类
│ ├── test_game.gd # Game 核心逻辑测试
│ ├── test_game_grid.gd # 网格数据测试
│ ├── test_game_tile.gd # 方块数据测试
│ └── test_save_data.gd # 分数格式化测试
├── tools/ # 辅助工具(Python)
├── main.gd # 主协调者(LV 薄层:仅 96 行信号接线)
├── main.tscn # 主场景(仅 6 行:根节点 + 脚本引用)
├── project.godot # 引擎配置
└── export_presets.cfg # 导出预设配置
godot --path .)export_presets.cfg 中调整目标平台预设本项目使用付费自定义许可证。购买后可修改代码并发布衍生游戏,但不得二次分发源代码或以商业目的销售源代码。详细条款请参阅项目内的 LICENSE.md。