一款基于 Godot 4.7+ 开发的经典 2048 游戏克隆,专为 PC 桌面端横屏(1280×720)设计。合并相同数字直到 2048——简单的规则、上瘾的体验,一份结构优雅、注释详尽的 Godot 学习范本。
整个项目纯代码构建:main.tscn 仅 6 行(根节点 + 脚本引用)。主题样式由 ThemeBuilder 纯代码生成(替代 .tres 文件),UI 节点由 ViewBuilder 在运行时构建,无 .tscn / .tres 资源黑盒。读 .gd 即可理解全貌。
ThemeBuilder 替代 .tres,ViewConfig 单一数据源GridView 直接监听键盘/触摸,发射 move_requested 信号,无需 Controller 中转GridView 通过 _dead/_live 数组复用 TileView,避免频繁创建/销毁节点与 Block Fall、Block Blast、移动端版 2048 一脉相承的 Logic-View 分层,替代常见的 MVC,main.gd 仅 95 行薄层协调器:
| 层 | 职责 | 关键文件 |
|---|---|---|
| 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 board_sizer.gd |
| main.gd | 薄协调者。ViewBuilder.build() 构建 UI → 连接 Logic ↔ View 信号 → Game.start() 启动 |
— |
关键:Logic 层全部是 RefCounted,无需场景树即可直接实例化测试——Game.new() + 固定随机种子 = 可复现的测试棋盘。
项目自带轻量级测试框架(无插件依赖),测试目录与移动端版一致:
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 # 冒烟测试
board_sizer.gd 自适应棋盘:在可用空间中保持棋盘为正方形并居中999 / 1.0k / 1.0m),最高分 JSON 持久化项目内置自动演示脚本 tools/auto_demo.gd:以固定随机种子开局,按简单贪心策略自动走 80 步,走完自动退出,可一键录出 60fps 素材(画面完全可复现)。
godot --path . --write-movie frames/frame.png --fixed-fps 60 res://tools/auto_demo.tscn
ffmpeg -y -framerate 60 -i frames/frame%08d.png -c:v libx264 -preset slow \
-crf 18 -pix_fmt yuv420p -movflags +faststart -an demo.mp4
godot-2048-pc/
├── 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)
│ ├── view_builder.gd # 场景构建器(纯代码构建节点树)
│ └── board_sizer.gd # 棋盘正方形自适应居中(PC 版独有)
├── 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/ # 辅助工具
│ └── auto_demo.gd # 自动演示脚本(固定种子 + 贪心策略走 80 步)
├── docs/ # 项目文档
│ ├── intro.md # 本文档(godotstudy.cn 介绍文案)
│ └── intro_en.md # 英文版介绍
├── main.gd # 主协调者(LV 薄层:仅 95 行信号接线)
├── main.tscn # 主场景(仅 6 行:根节点 + 脚本引用)
├── project.godot # 引擎配置
├── export_presets.cfg # 导出预设配置
└── LICENSE.md # 付费许可证(含 LICENSE_en.md 英文版)
godot --path .)export_presets.cfg 中调整目标平台预设本项目使用付费自定义许可证。购买后可修改代码并发布衍生游戏,但不得二次分发源代码或以商业目的销售源代码。详细条款请参阅项目内的 LICENSE.md。