下载 App
开发者日志 ⑤:不会写代码,用 AI 做游戏
昨天 13:461 浏览 包含 AI 合成内容
#聚光灯gamejam开发者日志这个项目从 10-02 到今天 10-15,14 天,88 次提交,164 张卡、107 条配方、24 座建筑、56 个 Lua 模块。
这些代码没有一行是我手写的。
但我要先把话说全:「我不会写代码」不等于「我没有在思考」。 这 14 天里我做的最多的事不是生成代码,是判断代码对不对。
这是两种完全不同的工作量,而后者才是真正的门槛。
一、别让 AI 直接开始写
我犯过的最大的错,是第一天就把需求丢给它然后等着。
正确的顺序是这个:
代码块
先让它读代码 → 再让它给方案 → 你批准 → 它才动手
举个例子。我要加「土壤肥力」系统,第一句话不是「帮我实现土壤肥力」,而是:
先读一遍现有的 Production.lua 和 Config.lua,告诉我现在作物收获时会改哪些字段、土壤卡有哪些属性。读完先不要改代码。
为什么这一步不能省? 因为 AI 对「你现在的代码长什么样」默认是猜的。它猜的时候会用最常见的写法,而你项目的写法不一定是常见的。
后面我会讲到,我因为这个吃过四次亏。
二、让它写测试,而不是让它「注意」
这是我最想分享的一条。
10-12 我给配方系统加「标签规则」——让「任意作物 + 粪便 → 堆肥」这种通用规则可以被写出来,不用给每种作物抄一遍。
我顺手把通用规则放在了配方表的第一行。
跑测试才发现全错了。原因是:find 用顺序扫描,命中第一条就返回。通用规则在最前面,把所有具体配方全抢走了。
最可怕的是它不报错。 游戏照常跑,日志一片干净,只是番茄忽然种不出番茄了。
所以我没有让 AI「下次注意」,我让它写测试:
护栏测试 守什么
标签词表完整 卡上用到的标签都必须登记
尾缀纪律 通用规则必须在数组末尾
零遮蔽 逐条验证具体配方没被抢走
无成环 不能出现免费刷资源的闭环
写完我还让它做了一件事:故意把规则挪回前面,看测试会不会报错。
会。这四条护栏才算真的存在。
没验证过的护栏不算护栏。
这一条适用于所有「让 AI 别再犯」的场景:你让它记住,它下次还会犯;你让测试盯住,它永远犯不了。
三、数字必须自己算,不能让它拍
10-05 我让它做了一件事,是我这 14 天里最值的一笔投入:
把 Config.lua 里所有数值提取出来,建约束链,交叉验证代码是不是真的读了它们。不许用「感觉」下结论。
出来的结论是三个字:不可玩。
三处结构性断裂,其中最要命的一处是这样算出来的:
代码块
一天 86.4 秒 ÷ 天气间隔 43.2 秒 = 一天 2 次天气
夏季晴天权重 27%
→ 每天阳光产出 = 2 × 27% = 0.53 张
→ 而每株作物必须消耗 1 张阳光
→ 全年理论产量上限 193 株
→ 而任务要求累计卖 9000 币
→ 即使全程种番茄也只有 579 币
产出率比任务门槛低一个数量级。
这不是「玩家要努力一点」,是这个游戏在数学上就通不了关。
而在此之前,游戏能跑、测试全绿、构建成功——它是一个完整的、无 bug 的、且不好玩的游戏。
测试全绿 ≠ 游戏能玩。 测试只验证「代码按写的跑」,验证不了「写的东西是对的」。
这个方法我后来固化成了纪律:
数值不得凭感觉写:先跑脚本得约束链,再定目标曲线。顺序不能反。
先定「一株番茄应该几天」再调参数,是设计;先调参数再看结果,是赌博。
四、AI 会说谎,而它不知道自己在说谎
这是最难防的一类。
10-12 写固氮规则,AI 在文档里写:
不新增卡牌,只给现有作物打标签。固氮作物:豌豆、大豆、三叶草、卷心菜。
写得很专业、很完整、逻辑自洽。
而这四种作物,一张都不存在。
它不是在骗我,它是在补全——它觉得这些作物「应该有」,就写上了。这是语言模型的工作方式。
后果是:固氮规则写完了、测试通过了、代码跑得一点没错,而它永远不会生效。玩家永远等不到那块地自己回肥。
同一天我清出来同类问题四处。最离谱的一处:我提议把一年从 365 天压到 48 天,理由是节奏太慢。核对后才发现 365 不是孤立数字——它是整套二十四节气历法的坐标系,改它等于推翻全部历法。那个提议撤回了。
我给这类错误起了个名字:凭印象写,没回代码核对。
防法只有一条,写进项目纪律的第一条:
动任何文件之前,先核对「记忆」与「实际文件」是否一致。
我踩过三次之后才把它提到第一位:
用旧版配置审计 → 得出「11 个建筑拿不到」的错误结论(其实早就改好了)
记的「顶层变量 194 个」,实测只剩 163 个
按旧行号去改代码,行号已经漂移了几百行
用过期事实回答,比不回答更糟。 因为它看起来是对的。
五、报错要贴原文,别转述
User-facing 的沟通里,我最坚持的一条:
出了问题,把报错原文整段贴给 AI,不要自己转述。
原因很实在:转述会丢信息,而丢掉的那部分往往是关键。
举个真实例子。早期有一次每次进配方页就崩溃,我的描述是「进配方页会崩」。这个描述没用。
贴上原文之后,AI 一秒定位:LoadLayout 在第 420 行被调用,但它在第 992 行才 local function 定义。Lua 的 local 只在自己那一行往后可见——声明之前读到的是 nil。
这个坑后来占了整个项目 bug 的六成,它有三种症状:
症状 表现 难度
抛错 整层黑屏 容易,看得见
静默失效 有 if x then 守卫 → 不报错,整块不跑 难,看不见
误读全局 恰好有同名全局变量 → 跑出完全无关的行为 最难查
第二种最贵。10-04 那次「合成通知链断裂」就是它:玩家做了一百次合成,进度条一动不动,日志干净得像新装的。
六、让它解释,直到你能复述
我不懂 Lua,但我最后能读懂这个项目在干什么。
方法是:每次它给方案,我要求它先讲清楚「为什么这么改」和「改了会影响什么」。
讲得我听不懂,就让它换说法。讲到我能用自己话复述一遍,才让它动手。
这件事有两个作用:
过滤错误方案。 它讲不清楚的方案,往往是它自己也没想清楚的。
让你有判断力。 14 天之后,我能看出来「这个改动会打断动物 AI 的坐标语义」这类问题——不是因为我学会了 Lua,是因为我搞懂了这套系统的因果。
七、生产出来之后,必须自己玩一遍
这是第 4 篇的内容,但作为方法论它值得再说一次。
10-14 我提交了当天最大的一次改动(49 个文件,+4789 行),然后在日志里写「建议下一轮先做真机试玩」。
第二天真机试玩,21 小时里修了 24 个问题:
弹窗正文 20 号字、补货按钮 9 号字——手机上根本看不见
「日常订单」按钮被历史遗留偏移挤到屏幕外
图鉴翻页按钮在单页时隐藏 → 玩家以为「按钮不见了」
拖卡松手卡自己飞回去(四个独立成因,连修四个提交)
新加的两张卡忘了配图,真机上直接加载失败
没有一个会报错。全部是「程序自认为一切正常」。
按钮确实被渲染了,只是坐标在屏幕外。翻页按钮确实按逻辑隐藏了。卡确实被正确地移回了「原位」。
只有人拿起来说「这不对」。
八、最后一条:让它写文档,尤其是「不要照着做」的文档
这个项目有一份 MEMORY.md,按事故类型分节,不是按功能分节。
我明确要求它这么做,理由是:按功能写的文档会告诉你系统长什么样,按事故写的文档会告诉你哪里会咬人。
里面有一段是这样写的:
⚠️ 以下是死配置:注释写得很专业,但代码从不读。 照它们调平衡会得到全错结果。
还有一段:
⚠️ 本文下面写的「一天 720 秒」未采用,实际是 86.4 秒。 本节保留仅为记录当时的推导过程,不要照着它调平衡。
让 AI 把「自己曾经的错误」也写进文档,这是最有价值的一类内容——因为它是不会再犯第二次的错,而你会犯。
如果重来一次
做法 我会不会再做
先让它读代码再给方案 会,一步都不能省
用测试代替「注意」 会,收益最高的一笔
跑脚本算数值 会,它救了整个项目
每次都核对记忆 vs 实际 会,这条排在纪律第一条
贴报错原文不转述 会
要求它讲清楚为什么 会
真机试玩留到最后 不会。 应该每两天就玩一次
最后一行是唯一后悔的。
我在电脑上跑了几千条测试,然后攒了 4789 行改动才第一次拿起来玩——结果那 4789 行里的问题,测试一条都没发现。
写在最后
这 14 天我学到的,跟代码关系不大:
AI 会把事情做得很快、很完整、看起来很专业。它的产出永远比你手写的好看。
所以你的价值不在写,在于判断它写对了没有。
而判断力只有三个来源:真机玩过、数字算过、报错读过。







