原文展示了通过 Lint 规则、形式化验证和 AI 自动测试构建自动化质量闭环的具体方法,为 AI 辅助开发提供了可迁移的工程实践。
这段分享中最有意思的其实是她的 AI 驱动开发方法论:把每次发现的 Bug 转化为 Lint 规则,把系统正确性转化为形式化验证,把游戏平衡性转化为 AI 自动测试。她把工程约束和验证机制变成自动化系统,使 AI 可以持续、大规模地产生代码,同时尽量控制质量退化。
- 4 天前才开始做这个游戏,原本只是一个业余项目(side project),到现在已经提交了大约 1,150 个 PR(Pull Requests)。
- 每次发现代码中存在某个问题,我都会让 AI Bot 为它编写一条对应的 Lint 规则,防止同类问题再次出现。
- 大量使用 TLA+(形式化规约与验证工具) 来寻找游戏中各种状态机的 Bug,包括剧情、过场动画和游戏系统。项目里有许多专门用于形式化验证的 Skills,每个主要系统都有一个对应的 Skill。
- 我把上下文信息编码进了文件路径和扩展名。 每帧或每个 Tick 都会执行的代码,统一使用 .hot.ts 扩展名。Lint 规则禁止这些文件进行内存分配(包括对象字面量、闭包、new 等)。这样一来,游戏主循环几乎不会产生垃圾对象,也就避免了垃圾回收(GC)导致的画面卡顿。
- 游戏引擎大部分是自研的。 使用 Three.js 绘制 3D 场景,但模拟系统、后期处理和音频系统全部由我们自己实现。
- 整个模拟系统是完全确定性的(Deterministic)。 只要输入相同,每次运行都能精确复现相同的结果。当玩家提交高分时,服务器会重新模拟玩家的整局游戏,验证是否存在作弊。
- 我们会根据玩家每局游戏结束时的最终统计数据,动态生成 Open Graph 分享图片(og:image),而且这些图片也支持本地化!游戏支持 10 种语言。
- 我最喜欢的功能: 当玩家进入不同的生态区域(Biome)时,背景音乐会无缝切换成对应区域的音乐,同时延续上一段旋律,而不是突然中断重新播放。
- 游戏没有任何音频文件。 所有音乐和音效都是在浏览器里实时合成的。我们自己实现了一套类似 Game Boy 的声音芯片,包括两个脉冲波声道、一个波形声道和一个噪声声道,再叠加一层 Synthwave(合成器浪潮)风格的音色。所有歌曲都是以文本形式直接写在代码里的。
- 所有像素美术都是代码生成的。 每个 Sprite(精灵图)都是一个独立文件,使用统一的调色板绘制,并在构建时打包成 Sprite Atlas(精灵图集)。
- 游戏可以直接在 X(Twitter)帖子中运行,从宽度只有 245 像素的小卡片一直适配到全屏。性能目标是:在一台中端手机上,即使同时出现 500 个敌人,也要保持 60 FPS。
- 如果首次下载资源大小超过预算,构建就会直接失败。 目前整个游戏经过 Gzip 压缩后大约只有 124 KB。
- AI Bots 会在无界面模式(Headless)下自动玩游戏,根据预设的目标存活率来调整每个难度等级的平衡性。
- Lint 规则禁止代码注释。 如果一段代码需要靠注释才能解释清楚,那么正确的解决方案应该是给变量或函数起一个更好的名字,或者编写一个测试。
来源:Will Downing · x.com