我让 AI 独立开发了一款游戏:零依赖、188 个测试全绿、工期压到四分之一

参赛声明 :本文参加掘金「1024·新饭碗计划」赛道二·作品征集,参赛作品为「熵减特勤局 Entropy Rangers」(话题:#1024AI时代程序员的新饭碗#)。

在线体验 :entropy-rangers.yangchina.cn (打开即玩,纯静态零后端)

开源仓库 :atomgit.com/dickeryang/... (Apache-2.0)
摘要:我用 AI 代码智能体独立开发了一款零运行时依赖的 Canvas 塔防游戏「熵减特勤局」,188 个测试全绿、一整局就是一个回归测试用例。本文讲清它解决的真实需求、开源与在线运营现状,以及开源加公众号加打赏这套组合的变现预期。

关键词:AI 编程、vibecoding、Canvas、TypeScript、小游戏、开源、变现、1024

技术栈版本:华为云码道 CodeArts 代码智能体(2026-09 版本)|TypeScript strict(运行时零 npm 依赖)|Canvas 2D|自研 ECS|Vitest 确定性回放回归|实测时间 2026-09 ~ 2026-10

写在前面:我的 Plan B 是造作品,不是换赛道

10 月 21 日掘金上线了「新饭碗计划」,AI 时代程序员的新饭碗在哪里,这个话题我认真想过。白天我在公司码砖,答案不敢押在"换个行业"上,而是押在一个更具体的动作上:用 AI 把完整工程作品造出来,开源、上线、挂在个人品牌下。

过去一个月我真的干了这件事:让华为云码道的 CodeArts 代码智能体独立开发了一款纯浏览器策略小游戏「熵减特勤局」。全部代码由 AI 生成,我负责定架构、出验收、调平衡------开发加调参大约 21.5 小时,按经验估算纯手写要 10 天左右,工期压到约四分之一。成品零运行时依赖、gzip 后约 29KB、188 个测试全绿,已开源在 AtomGit 并部署上线。

这篇文章就是这次"造饭碗"的完整复盘:作品是什么、解决了什么真实需求、现在运营得怎么样、能带来什么变现预期。所有数字都是实测值,仓库状态如实交代------它刚上线,Star 还只有 1 个,我不打算编一个漂亮的运营故事。

一、作品本身:部署改变流场,一局就是一个测试用例

「熵减特勤局」是一款塔防式即时策略游戏:在网格化机房部署守护进程,抵御熵潮(错误数据流)对核心服务的侵蚀。核心策略一句话说得清------部署改变流场,流场决定战局:你放下的每一座防火墙都会实时改写敌人的寻路流场,路线变化在画面上直接可见。

功能一览:

模块 功能
玩法 4 种守护进程 × 4 种熵潮 × 8 关(含引导关),部署即改写 BFS 流场
胜负期望 按"防御有效输出 × 路径覆盖率 vs 剩余威胁"实时评估守住的把握
回放系统 指令流 + 种子完整重放任意一局,失败可跳转到击穿时刻的战场快照
本地存档 localStorage 存关卡进度与最佳完整度,唯一存储、无任何网络请求

选中守护进程进入部署模式,悬停格高亮合法性并预览射程圈;部署防火墙的瞬间,熵潮的行走路线被整条改写:

守住有结算,守不住也有说法------失败自动弹出「防线击穿时间轴」,标注首次受击、完整度跌破 50%、终局三个节点,点击可跳回该时刻复盘补防:

二、它解决的真实需求:不是"又一个 demo",而是三件具体的事

赛道二要求讲清楚作品解决的真实需求。这款游戏的需求分三层,一层比一层实际。

第一层,它先是一款能完整玩通的游戏。 8 个关卡有难度曲线、有存档、有失败复盘,不是逻辑糊在渲染循环里、刷新就重来的生成式 demo。游戏是所有品类里工程差距最大的:多数 AI 一次性生成的游戏代码魔法数字满天飞、不可测试,所以我刻意选它当试金石。

第二层,它验证了一个具体问题:AI 代码智能体能交付"完整工程"的上限在哪里。 我给它的不是"帮我写个游戏",而是可验收的工程约束------纯逻辑层禁 DOM、确定性四纪律、覆盖率分级门槛、10 道 CI 门禁。最终交付物通过了全部验收,这件事本身比游戏好玩与否更有信息量:AI 缺的从来不是写代码的能力,是"被验收"的纪律,而纪律可以由人来定义。

第三层,它沉淀了一套可复用的方法论:「回放即测试」。 因为模拟是确定性的,一整局游戏(指令流 + 种子)就是一个回归测试用例------预录三条标准局(胜/负/险胜)进 CI,任何破坏确定性或平衡的改动立刻变红。"游戏能完整跑通"从一句口头承诺变成了一条机器断言。这套思路可以搬到任何确定性模拟场景:策略验证、物理仿真、金融回测。

三、支撑"作品质量"的三个工程决策

这节不展开完整架构(那够写另一篇长文),只讲三个直接支撑"完成度"评价的决策,每个都有取舍。

3.1 决策一:ECS + 逻辑渲染彻底分离

直觉写法是每个塔/敌人一个 class 互相持有引用,但塔防实体关系是网状的,class 网会纠缠成不可测的泥球。我用 ECS:实体是 ID、行为在 System、数据在 Component,并立了一条硬纪律------sim 层不 import render 层与任何 DOM API。这直接换来一个能力:同一份模拟可以无头跑,回放测试因此成立。

3.2 决策二:固定步长模拟 + 确定性四纪律

【我为什么不用"rAF 每帧模拟一步"的直觉写法】144Hz 屏上游戏会快 2.4 倍,切后台回来瞬移;而"按 dt 变步长"的浮点累计误差会让回放永远对不上。所以模拟恒定 1/60s 步长,渲染可变并做插值:

typescript 复制代码
// src/engine/loop.ts(节选)------纯逻辑部分,可单测
export const FIXED_DT_MS = 1000 / 60;

/**
 * 模拟恒定 1/60s 步长;渲染每帧用 alpha 做状态插值;
 * 后台返回最多补 10 步,超出按快进丢弃积压(显性架构决策)。
 * 【确定性纪律】sim 层禁止读时钟------performance.now 只允许出现在 rAF 壳一处。
 */
export function planTick(accumulatorMs: number, maxCatchupSteps = 10): LoopTick {
  const raw = Math.floor(accumulatorMs / FIXED_DT_MS);
  const simSteps = Math.min(raw, maxCatchupSteps);
  const catchingUp = raw > maxCatchupSteps;
  const consumed = catchingUp ? 0 : raw * FIXED_DT_MS; // 快进时清空积压
  return {
    simSteps,
    catchingUp,
    interpolationAlpha: (accumulatorMs - consumed) / FIXED_DT_MS,
  };
}

确定性不靠自觉,靠四条纪律加机器把守:随机一律走注入的 Rng(ESLint 自定义规则禁 sim 层 Math.random)、系统执行序固定、模拟层禁时钟、资源与伤害全整数结算。

3.3 决策三:回放即测试------把"能玩"变成断言

手玩一局导出回放 JSON(指令流 + 种子 + 数值表哈希),无头重放并与基线逐位比对。这套机制在仓库里的形态是一条测试命令:

bash 复制代码
$ npx vitest run src/replay

✓ 回放回归(防退化)(3)
  ✓ standard-win: outcome=victory, stateHash=581952af
  ✓ standard-lose: outcome=defeat, stateHash=3f42ed1c
  ✓ standard-close: outcome=victory, stateHash=604d2feb
✓ 回放确定性(3)
  ✓ 同一 ReplayData 播放两次 stateHash 一致
  ✓ 指令乱序注入(tick 逆序)与顺序播放结果一致
✓ balanceHash 校验(3)
  ✓ balanceHash 不匹配 → 抛 BalanceMismatchError

Tests  18 passed (18)

这条输出同时是三样东西:回归测试(改坏即红)、游戏能完整运行的机器证明、Bug 复现协议(玩家附上指令流即可精确复现)。

四、目前的运营情况:刚上线,但底座是工程化的

先如实交代:作品 2026-09-17 建仓、2026-10-11 完成最后一轮迭代上线,到现在是一个刚满月的早期作品。AtomGit 公开仓库目前 1 个 Star、0 Fork、0 Issue------数字很小,但每一个都是真实的。

开源与在线,两条触点都通了:

  • 在线玩 :entropy-rangers.yangchina.cn ------ 纯静态部署,没有后端、没有数据库、没有任何遥测,打开即玩;
  • 看代码 :atomgit.com/dickeryang/... ------ Apache-2.0 协议,22 个 commit 全程可追溯,仓库首页直接挂了体验地址。

虽然用户数据还在起步,但工程质量数据是满格的,这也是我对"作品完成度"的底气所在:

指标 实测值
测试 188 用例全绿(engine 27 / sim 99 / replay 18)
覆盖率 sim 87.12% / replay 82.51% / engine 79.53%(核心逻辑层口径)
确定性回归 3 条标准局回放基线,终局哈希逐位比对
性能基线 3000 步无头一局模拟 20.46ms
产物体积 gzip 后约 29KB,静态文件
运行时依赖 0 个 npm 包(CI 门禁强制)
质量门禁 npm run ci 共 10 道门禁,本地与 CI 完全一致

npm run ci 这 10 道门禁里我最看重两道:一道守"零依赖不变量"(谁往 dependencies 里加包就红,保住"零依赖"这个卖点),一道守确定性(sim 层出现 Math.random、时钟读取直接拦截)。运营一个开源作品和运营一个服务一样,靠的不是热情,是让"变坏"这件事自动化地暴露。

五、变现经历与预期:我如实交底

赛道二还要求讲变现经历或预期效果,这节我全部说真话。

当前直接收入:0 元。 熵减特勤局没有广告、没有内购、不打算做收费版,README 里写明了"如果它给你的某个下午添了一点乐趣,欢迎打赏一杯咖啡"。上线至今打赏收入为零,我完全接受这个结果------因为从一开始,这个作品的变现路径就不是"卖游戏"。

我的变现模型是三层漏斗,作品是入口,不是商品:

  1. 作品层(建立信任):一个开源、带完整工程门禁、可在线验证的作品,是"AI 时代我还保有工程能力"的实物证据。它比简历上任何一句话都可信;
  2. 内容层(流量转化):围绕作品产出系列技术文章(本文就是其中一篇),文章带来阅读与关注,沉淀到我的公众号「行者架构谈」;参与活动本身也是流量事件;
  3. 机会层(间接变现) :作品与内容组合起来,指向的是 AI 协作开发的咨询、接单、企业内训这类"新饭碗"机会。打赏二维码放在那里,更多是一种姿态:我的产出对得起一杯咖啡,但我真正想经营的是信任。

微信打赏:请作者喝一杯咖啡

预期效果的边界我也说清楚:打赏和流量对个人品牌是长线投入,短期看不出收益曲线;这套漏斗里真正可能规模化的是"用 AI 完成完整工程"的方法论本身------它正在通过系列文章获得验证。如果本文有幸进入活动评选,掘金的 5w 矿石参与奖会是这个作品的第一笔"平台变现",我会更新在这里。

六、踩坑实录:AI 写对了九成,剩下一成靠人

全程记录开发中真实发生的问题,每个都带修复过程。

1. 一行浮点乘法,让回放第一次变红

现象 :回放回归首次接入时,同一条标准局两次重放的终局 stateHash 不一致------确定性真的破了。 根因 :经济系统的出售返还写成了 credits * 0.7,浮点乘法在两次运行中舍入路径不同,整数结算纪律被一行代码破坏。 解决 :改成 (credits * 7) / 10 的整数运算(先乘后除),并补 ESLint 规则禁止 sim 层对金额类变量做浮点运算,回放转绿。 感受:这个坑反过来证明了回放测试的灵敏度------一行浮点都能被哈希抓住。确定性不是设计出来的,是测出来的。

2. AI 会"顺手"破坏你没盯着的约束

现象 :AI 生成的分裂体敌人死亡分裂用了 Math.random,另一处系统里写了 Date.now() 做耗时统计。都能跑,肉眼看不出版本差异,但回放立刻漂移。 根因 :AI 不会主动维持你没反复强调的全局约束------"就一个随机数"在它的局部视角里完全合理。 解决 :固化一条修错话术:不得通过删减确定性断言来让测试通过,修复方向只能是把随机改经注入的 Rng、时间来源改为注入;修复后回放回归必须全绿。再把禁令写进 ESLint 自定义规则,由 CI 兜底。 感受:AI 的产出质量等于"你把约束写得有多可验收",这句话在这一个月里被反复验证。

3. 切后台回来"录像带快进"

现象 :标签页切走几分钟后切回,敌人位置瞬间跳到"未来"。 根因 :rAF 在页面不可见时停摆,恢复后累积了数千毫秒 delta;planTick 里追帧上限的设计是对的,但 rAF 壳没接对------纯逻辑层的防御,薄壳层没接上等于没有。 解决 :追帧上限 10 步 + 超限快进丢弃积压,恢复时清一次累加器;验收从此要求跨层走一遍。 感受:单测全绿不等于功能正确,"可测的纯函数"和"不可测的薄壳"的交界处是 bug 高发区。

七、提效数据:21.5 小时干完预估 10 天的活

基于开发日志的实测耗时(个人单项目样本,仅供参考):

开发阶段 纯手写预估 AI 辅助实际 提效来源
ECS 内核 + 双循环 + 单测 约 2 天 约 3 小时 结构清晰的纯逻辑是 AI 最强区
网格流场 + 最小可玩闭环 约 2.5 天 约 4.5 小时 算法 + 边界穷举,一次过审率高
回放系统 + 全部单位 约 2 天 约 4 小时 数据驱动设计让实现即翻译
Canvas 渲染 + 部署交互 约 2 天 约 5 小时 AI 写结构,手感调优靠人
关卡调参 + 复盘 + 收口 约 1.5 天 约 5 小时 回放工具让调参可验证
合计 约 10 天 约 21.5 小时 工期约为传统方式的四分之一

两点如实说明:纯手写预估基于经验估算,有主观误差;数值平衡的时间没有被省------"回放验证、人工微调"的循环跑了三轮才达到想要的手感,这部分是游戏品类特有、AI 替代不了的时间。

八、总结:新饭碗的答案是"作品"

回到活动的问题:AI 时代程序员的新饭碗在哪里?我的答案是------AI 接管的是打字,接不走的是定义问题、定验收标准、为结果负责这三件事。 这次实践里,我的角色从"写代码的人"变成"定纪律的人":定架构、写验收、调平衡,AI 负责九成的实现。工期四分之一、188 个测试全绿、零依赖开源上线,就是这套分工的实测成绩。

作品链接再放一次,欢迎上手体验并看看代码:

互动讨论

你也在用 AI 做完整的工程作品吗?三个问题想听听掘友们的看法:

  1. 你用 AI 做过最"完整"的一个作品是什么,卡在哪里?
  2. 你觉得 AI 作品的变现,卖作品、卖内容还是卖能力更靠谱?
  3. 如果让 AI 独立开发一个游戏,你会怎么给它定"能玩"的验收标准?

评论区聊聊,我会认真回复每一条。

觉得有用就点个赞、加个收藏。下一篇预告:《回放即测试:把确定性模拟的工程方法搬进你的业务系统》,感兴趣的关注一波。

相关推荐
Eyfcom2 小时前
〖深度〗鸿蒙 ArkTS 移动应用开发经验:从 TypeScript 心智模型到声明式运行时的六层认知重构
typescript·移动开发·harmonyos·arkts
Patrick_Wilson1 天前
悬浮提示从哪来:LSP、tsserver 与 .d.ts
typescript·npm·前端工程化
oldnicke2 天前
理解 TRAE 的 Agent + IDE 思路:用一个 Markdown 检查器拆解完整交付
typescript
钱栈up2 天前
GitHub 热榜实测|REA:用 Agent 逆向一切
typescript·开源·github
keyipatience2 天前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
一只游鱼2 天前
我用原生 JS 做了一个「会呼吸」的博客:Canvas 水境 + 合成音效 + 会破裂的留言气泡(vibe coding)
javascript·agent·canvas·github pages
RuoyiOffice2 天前
Vue3+TypeScript 企业管理平台统一UI:新增一个模块,为什么还要重新调样式?
spring boot·typescript·vue3·组件化开发·企业管理软件·ruoyi office·统一ui
Shockang3 天前
TanStack Router 实战:URL 校验、Loader 与路由权限
typescript·react·路由·前端开发·tanstack router
TYC93 天前
Mac创建Vue3+TypeScript或者React+TypeScript项目
前端·javascript·typescript