仅用5小时AI自动生成完整马里奥游戏全过程
近期借助OpenMatrix开展了一项真实开发实践——将超级马里奥兄弟NES版本进行了1:1完整复刻。技术选型采用TypeScript + HTML5 Canvas + Web Audio API,从空白项目目录到4个关卡可流畅游玩,全程由AI自主驱动执行,未涉及任何人工干预。没错,您没有看错,所有代码均由AI自动编写,未手动输入一行。
起点:一条命令开启AI开发
openmatrix start "超级马里奥兄弟 NES 版 1:1 还原"
OpenMatrix在读取设计文档后,自动将任务拆解为4个阶段、12个子任务,质量等级选用最为严格的strict模式。接下来的流程完全自动化——AI系统独立完成了全部开发工作。
执行总览与时间节点
| 时间节点 | 里程碑 | 测试数 |
|---|---|---|
| T+0 | 启动,12 任务排队 | — |
| T+8min | Phase 1 完成:GameLoop + EventBus + InputHandler | — |
| T+19min | Phase 2 完成:物理引擎 + 碰撞检测 + Mario 三态 | — |
| T+31min | Phase 1 测试全绿 | 91 |
| T+1h08min | Phase 2 测试全绿,覆盖率 95.92% | 167 |
| T+1h52min | Phase 3 完成:4 关卡 + 敌人 AI + 道具系统 | — |
| T+2h01min | Phase 4 完成:音效 + 粒子 + 性能优化 | — |
| T+4h05min | 全部单元测试通过 | 611 |
| T+5h04min | 集成测试 + E2E + 代码审查,结束 | 802 |
值得关注的是,编码实现与测试验证是同步推进的——Phase 2进行代码编写时,Phase 1的测试套件已在并行运行。这正是整个项目仅耗时5小时即可高质量完成的关键原因。
项目产出数据一览
| 指标 | 数据 |
|---|---|
| 源代码 | 30 个文件,~3,900 行 TypeScript |
| 测试代码 | 36 个文件,802 个测试(611 单元 + 160 集成 + 31 E2E) |
| 语句覆盖率 | 95.92% |
| 分支覆盖率 | 91.54% |
| 可玩关卡 | 4 个(1-1、1-2、2-1、4-1) |
| 外部资源 | 零 — 没有图片文件,没有音频文件 |
除了上述数据,还有三个关键经验值得深入分享。
干货一:如何有效防止架构漂移
AI自动编程的最大挑战是什么?并非代码写不出来,而是随着项目推进,代码逐渐偏离初始架构设计。
常见现象:第一个功能模块结构清晰,第二个开始出现“将就”的倾向,发展到第五个功能时,代码已演变为难以维护的意大利面条式结构。每个独立任务看起来合理,但整体架构早已面目全非。
在此项目中,OpenMatrix采用了三道防线来应对这一挑战:
1. 架构定义写入plan.md,每个Task执行前必读
GameLoop (60FPS) → [InputHandler, LogicLayer, RenderLayer]
LogicLayer: PhysicsEngine + CollisionDetector + Level
RenderLayer: PixelRenderer + TileRenderer + UIRenderer + Camera
这并非装饰性文档。每个Task开始编码前,AI系统会首先读取plan.md中的架构定义,明确当前产出的模块应归属哪一层、通过什么接口与其他层进行通信。Phase 1建立的EventBus机制,后续Phase 2/3/4全部经由该总线通信,未出现任何跨层直接调用的情况。Phase 1定义的物理常量(gravity: 0.25、terminalVelocity: 6.0、antiTunneling: 16px),后续所有阶段均精确引用,零近似误差。
2. context.md传递决策上下文
每个Task完成后,实现摘要会被写入context.md。下一个Task启动时首先读取该文件后再进行编码。这不只是简单“记住之前做了什么”——它传递的是关键决策和约束条件:
# TASK-001 摘要: GameLoop 60FPS accumulator模式, Canvas 256x240 NES分辨率,
constants.ts含完整物理常量
# TASK-003 摘要: PhysicsEngine半隐式欧拉积分, Mario实体(小/大/火焰状态机)
后续Task无需猜测“前一阶段的实现采用了什么方案”——所有决策白纸黑字记录在上下文文档中。
3. 独立的代码审查阶段
TASK-010专门用于代码审查,该阶段识别出8个严重问题:
| 问题 | 严重程度 |
|---|---|
| SpatialHash 构建了但没被查询,碰撞还在用 flat 遍历 | 严重 |
| Mario 短跳速度 -2.0,文档要求 -4.5,与 NES 原版不符 | 严重 |
| 每帧大量临时对象分配(Vector2/AABB/new Set/数组展开),GC 压力大 | 严重 |
| 瓦片渲染器存在重复实现 | 警告 |
这些发现揭示了两件事:AI生成的代码并非完美无缺——这完全正常;但问题能够被系统性地识别和定位——这才是核心价值。如果没有代码审查环节,这些问题将持续潜伏在代码库中。借助审查机制,每个问题都被详细记录、分级评估并可追溯。
干货二:零外部资源背后的设计逻辑
整个游戏未使用任何外部素材文件。像素精灵通过SpriteData调色板以程序化方式绘制,音效采用Web Audio API的方波合成技术生成。
这并非炫技行为,而是约束条件驱动的结果:原始需求明确规定了“所有图形使用Canvas绘制像素图,不依赖外部素材文件”以及“所有音效通过Web Audio API程序化合成,不引入外部音频文件”。OpenMatrix将这两条要求作为硬性约束严格执行,而非建议性指导。
最终呈现的是一个极其干净的项目结构:30个TypeScript文件 + 4个关卡JSON配置,执行npm install && npm run dev即可运行。无需图片CDN加载,没有音频文件加载失败风险,不存在跨域问题。
这验证了一个重要原则:好的约束能够催生优秀的架构设计。当AI系统被告知“不可使用外部资源”时,它反而会设计出更加优雅的程序化解决方案。
干货三:TDD不是口号,而是执行序列
观察Task的实际执行顺序:
TASK-001: Phase 1 实现 → TASK-003: Phase 2 实现(并行)
↓
TASK-002: Phase 1 测试 ← 结果回传 ←┘
↓
TASK-004: Phase 2 测试
实现阶段先行启动,测试验证紧随其后。并非“先完成所有编码再补充测试”,而是每个Phase独立完成“实现+测试”的完整闭环。这意味着Phase 3开始编写关卡逻辑时,Phase 1的91个测试已在守护基础框架。如果Phase 3的代码破坏了GameLoop或EventBus,那91个测试会立即拦截并报告问题。
最终测试规模:611个单元测试(覆盖率95%)+ 160个集成测试(跨模块协作验证)+ 31个Playwright E2E测试(浏览器真实运行环境)。三层防护体系,层层相扣,无一缺失。
诚实的总结与反思
这个项目并非完美无瑕。代码审查发现了SpatialHash虽然构建但未被查询、短跳速度与文档不一致、GC压力较大等问题。如果这是一个商业级项目,这些问题都需要被修复。
然而,这个项目有力证明了一件事:在结构化执行流程的引导下,AI能够在复杂项目中保持架构一致性,产出远超“勉强可用”水平的成果。5小时,3,900行代码,802个测试用例,4个可玩关卡,架构零漂移。
启动你的下一个AI驱动项目
npx openmatrix start "你的项目描述"
OpenMatrix将自动分析需求、拆解任务、执行编码并验证结果。您只需提供设计文档和质量标准要求。马里奥项目是一个游戏开发案例,但同样的机制适用于任何复杂项目——API服务、前端应用、CLI工具等。架构漂移的防护效果不取决于项目类型,而取决于你所采用的流程体系。
```