我用 TRAE 把一万年文明史做成了一场 3 分钟的牌局:一个单文件游戏的全链路开发实录

0 阅读8分钟

参赛赛道:全链路开发实战 选题方向:从 0 到 1 全链路开发 话题:#TRAE双端融合

先看成品

01-game-main.png

一句话介绍这个游戏:你是一部文明史的话事人。面前摆着四格电量——能源、生态、知识、协作,桌上是 35 张从一万年前递过来的抉择卡。左滑,或者右滑,每一张都在给某些格子充电、从另一些格子放电。任何一格归零,文明冻死;任何一格充满到过载,文明烧死。

撑过 35 张牌,你就把人类送到了 I 型文明的门口。撑不过,你会得到一张这样的结算单——

04-death-ending.png

整个项目从一个模糊的念头到一个可访问的线上作品,我全程没有离开过 TRAE。这篇文章完整复盘这个过程:需求怎么拆解、代码怎么生成、bug 怎么修、产品怎么上线。

需求拆解:三个互相打架的设计约束

先说这个项目为什么长这样。它源于 TRAE 的盲盒开发挑战赛:规则是随机锁定三个关键词——一个主题词、一个功能词、一个风格词——然后围绕它们做出一个作品。我抽到的三颗骰子是:

05-blindbox-keywords.webp

文明、电量表、北欧冷淡风。 也就是说,主题必须是文明,核心功能必须是电量表,视觉必须是北欧冷淡风。

宏大叙事、工业仪表、极简美学——这三个东西天然互相排斥。我的第一步不是写代码,而是把这个命题原样发给 TRAE,让它出方案:

06-trae-first-prompt.png

它一口气给了四个:巨型文明仪表盘、万年时间线、文明体检问卷、技术电池墙。我挑了两个顺眼的先做出来看效果——能跑,排版精致,冷淡风的味道也对。

然后我盯着这两个页面看了十分钟,做了一个决定:全部推翻。

原因很直接:好看,但不好玩。你可以看,可以读,但你碰不到它。纯展示页没有任何让人记住的理由。我跟 TRAE 说的原话是:

「展示这种页面效果不好没亮点,交互性很差,能不能改成强交互的小游戏类的页面,关键词还是要紧扣。」

它给出的答案是 Reigns 式滑动决策——左滑右滑做抉择的卡牌机制。那一瞬间,三个拧巴的约束突然各就各位了:

  • 文明,从展板上的文字变成 35 张牌。第一簇篝火、第一粒种子、第一台蒸汽机……每一张都是历史上真实发生过的两难:砍林开田,喂饱协作,掏空生态。
  • 电量表,从装饰变成了命。四格电量是文明的资产负债表,而且过载和归零一样致命——文明的敌人从来不只是匮乏,还有失控。
  • 北欧冷淡风负责反衬。纸灰、墨色、雾蓝,克制的细线。画面越冷,文明熄灭那一刻的红闪和震屏就越锋利。

回头复盘,这一步是整个项目最值钱的环节:需求拆解阶段多花的一小时,省掉了后面所有返工的犹豫。

03-card-soil-age.png

开发:一次成型的游戏骨架

方向定了之后,TRAE 一次就把完整可玩的版本写了出来:单文件 HTML,零框架零构建,双击即玩。核心数据结构干净得像一张表格:

const DOM = [
  { k: "eng", cn: "能源",   v: 50 },
  { k: "eco", cn: "生态",   v: 55 },
  { k: "kno", cn: "知识",   v: 45 },
  { k: "soc", cn: "协作",   v: 50 },
];
// 每张牌:{ q, l, r, L:{域:±n}, R:{域:±n} }
// 8 种死亡结局,通关按卡尔达肖夫能级评分

拖拽交互、卡片飞出动画、电量条充放、纪元切换、死亡判定——全部可用。这里是 TRAE 的 Agent 模式最显威力的地方:它不是补全一行代码,而是理解「做一个游戏」这个目标后,把界面、逻辑、状态机、动画当成一个整体交付。

测试验证:AI 写的代码,也要过我的手指这一关

能跑不等于能玩。测试环节踩了三个真实的坑,每个都值得一提:

「卡牌拖不动了。」 最早的版本在手机上完全拖不动卡片。TRAE 排查后定位到 setPointerCapture 在部分浏览器直接抛异常,整个拖拽链路当场阵亡。修法是把 move/up 事件挂到 window 上、给 capture 套上 try/catch。问题不难,但只有真机才能暴露。

「AI 说代码有 bug,我说没有。」 我用浏览器自动化测试拖拽,合成事件怎么都滑不动,一度以为是代码 bug。人工把输入链路逐行核对后确认:代码是对的,是自动化工具和真实触摸事件之间的差异在骗人。这个坑让我记住:AI 可以帮你验证功能,但「手感」只能用手指投票。

「流光为什么时有时无?」 电量条有一道流光扫过的动画,时灵时不灵。我把现象描述给 TRAE,它反推出根因:background 简写属性把 backgroundImage 整个覆盖了。拆开赋值,问题解决。这种 CSS 层的幽灵 bug,靠肉眼翻代码可能要翻一晚上——把现象描述清楚,AI 的报错分析能力远超我的预期。

【截图:TRAE 定位拖拽 bug 的对话过程】

迭代打磨:三轮一句话需求,外加一次「自我否决」

能玩之后,是三轮一句话需求的迭代:

「太单调了。」 ——于是有了 7 张 AI 生成的配图,全部经过滤镜统一降饱和,保证冷淡画风不走样。

「动效太少了。」 ——于是有了随纪元变色的尘埃粒子、卡片的 3D 倾斜和视差、死亡时的红闪震屏,还有纪元切换时那块安静推开的幕布:

纪元切换幕布:火与篝火之后,农耕纪元缓缓入场转存失败,建议直接上传图片文件

「新玩家进来是懵的。」 ——这一轮最能体现人机分工。TRAE 先做了遮罩式新手引导,我一看效果直接否了:整块卡片被白雾罩住,高亮位置还跑偏。换方案,改成「元素脉冲描边 + 浮动小气泡」的分步指引,第一步的气泡里甚至藏了一个滑动手势的小动画。

顺手还加了一个角色:右侧悬浮的电量精灵,一个圆滚滚的冷淡风小家伙。点它一下,它会根据你所在的纪元讲一条冷知识——蒸汽纪元时它会告诉你,1952 年伦敦一场大烟雾死了四千人,催生了人类第一部《清洁空气法案》。

【截图:电量精灵与知识点气泡】

【GIF/录屏:完整一局游戏的滑动操作】

交付:从本地文件到全世界可访问的链接

最后一步是部署。仓库建在 GitHub,游戏文件复制为 index.html,开启 Pages 后自动构建,得到了任何人可访问的地址:codeganhaoz.github.io/civilizatio…

唯一的插曲是 push 死活推不上去,报错显示连接的是 127.0.0.1。TRAE 用一条 git config --list --show-origin 揪出元凶:我的全局配置里残留着一条指向本地代理端口的 github.com 域名级配置——代理软件没开,请求全被发去了空气。清掉,推送成功。

至此链路完整闭合:需求拆解 → 代码生成 → 测试验证 → 迭代打磨 → 部署交付,全程一个工具、一个对话框。

复盘:这套全链路能力,到底好不好用

回到最实际的问题:用 TRAE 走完一个完整项目,体验到底如何?我的三个真实体感:

第一,它改变的不是写代码的速度,而是试错的成本。 推翻两个精致的展示页重做游戏版,搁以前我要犹豫很久——那毕竟是两份能跑的成品。但当重来的成本只是一轮对话时,「这个不够好」的判断就变得容易说出口。这次项目里最正确的决策,恰恰是一次推翻。

第二,Agent 模式的边界在于「目标感」。 只要我能把需求说成一句有明确目标的话——「改成强交互的小游戏」「动效太少」「新玩家是懵的」——它就能交出完整的东西。但目标本身的判断,比如「展示页没亮点」「遮罩引导不好看」,只能我来下。AI 把「做起来」的成本压到接近零,人的价值反而更集中在「做什么、什么算好」。

第三,全链路的意义是「不断档」。 方案、代码、修 bug、配图、部署、排查 git 配置——如果每个环节换一个工具,光是上下文切换就足以把这个小项目拖死。一个对话框里从头到尾做完,才是这个项目能在一个晚上跑通的真正原因。

三个互相打架的设计约束,最后变成了一部可以握在手里滑动的文明史。如果你手里也有一个「想了很久却总觉得麻烦」的念头——现在的工具链,可能真的够用了。


项目关键词:文明 × 电量表 × 北欧冷淡风 | 单文件 H5 · 无需构建 · 双击即玩