前两篇讲了开工第一天的决定,以及全套美术怎么由 Claude Code 操作 ChatGPT 生成。这一篇讲战役模式的玩法是怎么一步步定下来的。
开工后两天(10 月 25 日到 26 日),我对战役玩法说过的话加起来大约 8 句,没有一句是需求文档,基本都是试玩之后的直接感受,比如「没什么挑战」「不要每次从零开始」。这 8 句话最后变成了:两条可以一路升级的兵种线、按关卡号生成的无限关卡、一套局外成长系统、援军登场式的解锁,以及三处广告位。中间有一个环节是我完全没参与的:AI 写了自动对局脚本,让游戏带着天赋连打几十关,按「第几关开始输」来调难度。
回头看,这两天的分工很清楚。我负责判断好不好玩,并且只用一句话说出来;AI 负责把这句话翻译成可以测试的机制和数字,再用自动对局证明它确实改变了体验。一句「没挑战」本身不可执行,能执行的是「把首次失败从第 50 关提前到第 20--25 关」。这个翻译做得好不好,决定了 vibe coding 做游戏能不能往下走。
8 句反馈和对应的改动

先把全貌列出来,后面挑关键的几处展开:
| 日期 | 我的反馈(原话或大意) | 落地的改动 |
|---|---|---|
| 10-25 | 不想要都是塔,要具体的角色,比如枪兵、弓箭手、剑士,还要有升级关系 | 近战线 5 级、远程线 4 级,每个建造位上站的是一个角色 |
| 10-25 | 近战也是一个塔的角色,不要出兵;要有攻击动作 | 删掉派兵逻辑;攻击拆成蓄力、出手、收势三段 |
| 10-25 | 要给用户制造一些困难,让他们看广告获得紧急救助 | 危机波 + 紧急补给 + 圣光救援 |
| 10-25 | 关卡不要做成有限的,要无限畅玩、让人上瘾 | 第 4 关起程序生成,每 5 关一个首领 |
| 10-25 | 不要每次从零开始,要能积累资产,黏住用户 | 钻石、星级、天赋、强化、连败鼓舞、老兵营、领地税收(天赋、老兵营、税收 10-29 下架) |
| 10-25 | 要保留兵种的神秘性,不要一下子全放出来 | 兵种和敌人按关卡分批登场,未解锁的显示 ??? |
| 10-26 | 感觉没什么挑战,解锁新兵种换一个更好的方式 | 援军登场、波次倒计时、提前叫波奖励、免费技能箭雨 |
| 10-26 | 界面要美观,和游戏素材风格一致 | 同一个生图对话出 UI 素材,按钮按颜色分工 |
最后一条属于美术,流程和上一篇素材篇相同,这里不再展开。
兵种升级线:每个建造位上站一个角色

第一版是常规塔防:路边建箭塔、炮塔。我试玩后的第一句反馈是不想要都是塔,要具体的角色,近战从枪兵一路升到天使这种。
AI 把它做成两条线:近战线 5 级、远程线 4 级,每次升级换一个更强的角色,外形也换。第一版里近战是「兵营派兵上路拦人」的做法,我又补了一句「近战也是一个塔的角色,要有攻击动作」,于是派兵逻辑整个删掉,近战角色和远程一样站在建造位上,攻击拆成三段:蓄力 0.16 秒、出手 0.07 秒、收势 0.2 秒。近战站在原地打不到远处,射程从 135--165 提到 160--190,伤害下调 15%,算是补偿。
这一步的价值在于,后面所有系统都建立在「角色有等级」这个前提上:援军登场是让下一级角色在关卡里赶到,局外强化是给满级角色加星,合成对战也是同一套兵种表。
无限关卡:关卡号就是随机种子

我对关卡的要求只有一句:不要做成有限的,要能无限畅玩,让人上瘾,「你好好设计一下」。
AI 的方案是前 3 关手工设计,用来教玩法,从第 4 关开始由生成器按关卡号生成:
- 关卡号就是随机种子。同一关每次生成的敌人构成都一样,输了重打,面对的还是同一关。
- 难度曲线 = 线性增长 × 复利增长 × 锯齿。锯齿按 5 关一个周期,现在的系数从 0.88 升到 1.18,每到第 5 关是一个小高峰,正好放首领,高峰过后难度回落一截。线性和复利两项的参数后来又调过,现在是每关 +17% 线性、2.6% 复利。
- 用威胁值分配预算。每种敌人按血量、护甲、速度、是否飞行算出一个威胁值,每一波在预算内挑敌人;每组敌人最多 36 个,预算再大就不加数量,改加血量。
- 三张地图的威胁系数不同,草地最低,沙地最高。

生成器有一个专门的测试:把第 7 关和第 25 关的生成结果算成 md5 指纹写进测试。以后改了地图、改了某个兵种的参数,只要关卡内容变了,测试就会失败,逼着 AI 承认「这次改动影响了平衡」并有意识地更新指纹,而不是悄悄改变所有玩家的关卡。这两天里指纹被有意更新过几次,每次都对应一处明确的平衡改动。
局外成长:输了也有收获

第二天我提了连贯性:不要每次玩都从零开始,要积累资产,黏住用户。
AI 选的是「天赋树 + 道具」这条路,做了一组彼此咬合的系统:
- 钻石和星级:通关按剩余生命给 1--3 星,奖励 = (10 + 3 × 关卡号) × 星级系数。重打已通关的关卡只给一半。
- 输了也给钻石:按「每一波挡住了多少威胁」的比例折算,再乘 0.4。打到一半崩盘也不会颗粒无收。
- 天赋:8 项,价格线性上涨,实际上没有封顶。
- 连败鼓舞:在最远一关连续失败,每输一次伤害 +10%,最多 10 层,赢一次清零。前提是这局至少挡住了 40% 的威胁才算一次。
- 强化:只有升到满级的角色能强化,每颗星 +25% 伤害,解决「满级之后没得升」的问题。
- 老兵营:把角色登记成老兵,带进关卡直接部署;首次通关时在场的老兵会积累资历升级。营位从 1 个扩到 4 个,扩建价格 200 / 500 / 1000。
- 领地税收:离线也在攒,每小时 2 + 已通关关卡数,最多攒 8 小时。
我当时提的只是「不要从零开始」,具体做哪些、数值多少、怎么防刷,都是 AI 定的。我能检验的是试玩感受;这些系统合在一起是否真的让人「卡一会儿、攒一点、再过去」,要靠下一节的自动对局。
这套系统没有全部留到现在。10-29 我让首页继续精简、主推对战模式,又说老兵和税收这两个按钮「改一下运营模式,比如引入魔法系统」。AI 给了几个方案,我选了魔法书加每日宝箱:天赋、老兵营、领地税收下架,钻石改用来升法师塔,4 个系、5 档共 20 个法术,卷轴从对战和每日宝箱掉落,每局带 2 个法术。钻石、星级、连败鼓舞和满级强化留在战役里;已经买过天赋和老兵的旧存档,进战役时这些加成仍然生效。上图是现在的版本。
自动对局调平:让游戏自己打几十关
调难度最费时间的部分,是我一局一局去玩。AI 换了个办法:写了一个自动游玩的脚本,按固定策略建造、升级、放技能,打完一关就把钻石拿去点天赋,然后打下一关,一直打到连续失败为止,最后输出「第几关第一次输、最长连败几关、最远打到第几关」。
这个脚本第一次跑出来的结果是:前面零失败,然后在某一关撞上一堵墙,再也过不去。AI 顺着数据一条条修:
| 自动对局发现的问题 | 修法 |
|---|---|
| 开局几波就死 | 第一个危机波之前,每波只用 40% 的难度预算,之后逐步升到 100% |
| 结果被死亡骑士漏怪和首领主导 | 威胁值计入漏怪伤害;首领血量降到 2400 |
| 脚本攒着金币不花 | 自动游玩补上「剩余金币用完」 |
| 防御到上限后撞死墙 | 加入满级强化 |
| 先零失败、再永久卡死 | 天赋改为线性涨价、难度改为复利增长、加入连败鼓舞 |
| 关卡号很大时数值溢出成无穷大 | 关卡上限 500,加一个数值有限的测试 |
修完之后,不看广告的自动对局在第 50 关第一次输,之前那堵「再也过不去」的墙消失了:输了之后靠天赋、强化和连败鼓舞,还能继续往前推。
第二天我说「没挑战」,AI 把目标定成「首次失败提前到第 20--25 关」,结果没调到:带天赋第一次输在第 30 关,竖屏重排地图之后又变成第 42 关。它给的原因是:首领波只有 1 个首领,难度上调全压在首领血量上,再往紧调,首领关就从「难」变成「过不去」。这个结果它如实报给了我,没有为了凑目标把数字调出死墙。
这件事让我对 AI 调平有了一个具体的认识:它能在几分钟内跑完我要玩几天的对局,但「第几关开始输才算好」这个目标,仍然要人来定。
「没挑战」:把解锁做成援军登场

「没挑战」那句后面还有半句:升级新兵种的解锁要换一个更好的方式。之前的解锁是菜单里的一个按钮,到关卡就亮。
AI 先调研了一轮其他塔防游戏的参与感设计,然后改成了「援军登场」:
- 新兵种在固定关卡的某一波赶到战场 ,弹出登场提示,这一关里第一次升级到它免费;
- 这一关赢了才收编,以后的关卡都能用;输了下次还从这一关登场。
- 同时加了波次倒计时 :上一波出完后 15 秒自动来下一波,玩家可以提前叫波,剩余时间越多奖励金币越多。
- 送一个免费技能箭雨,冷却 20 秒,范围伤害。

再加上前一天的「神秘性」要求,兵种和敌人都按关卡分批登场,还没出场的在界面上显示 ???。这个设计对后续更新也友好:新兵种只要在数据里填上登场关卡和波次,不用改代码。
广告位放在「困难」上

我对变现的要求很直白:给用户制造一些困难,让他们看广告获得紧急救助。
AI 给了几个选项,我选了两个:
- 紧急补给:+150 金币,每关最多 2 次;
- 圣光救援:场上敌人扣 40% 血并定身 3 秒,每关 1 次。
触发条件是「危机波」或者生命值掉到 70% 以下,危机波来的时候会有「大军来袭」的横幅。AI 定的原则是:广告是加速,不是门票。不看广告也能通关,只是慢一些:上一节的自动对局全程不看广告,照样能打到第 50 关才第一次输。
后来做微信版时,我又补了一句「首页不要有明显的广告元素,容易劝退」,首页上的广告按钮改成了小角标,并加了一个测试,防止以后首页再冒出广告按钮。
这两天的几条做法
| 做法 | 原因 |
|---|---|
| 反馈只说感受,不写方案 | 「没挑战」「不要从零开始」这类话足够让 AI 提出机制;方案让 AI 给选项,我来选 |
| 关卡生成用关卡号做种子,并用指纹测试锁住 | 关卡可复现,改动影响平衡时测试会提醒 |
| 写自动对局脚本调平,看「第几关开始输」 | 几分钟跑完几十关,比人工试玩快得多,也能暴露死墙和溢出 |
| 难度目标由人定,AI 调不到时如实说原因 | 目标定错比调不到更难发现;硬凑数字会做出过不去的关 |
| 新兵种用数据配置登场关卡和波次 | 以后更新内容只改数据,不动代码 |
| 广告只放在「困难」处,并用不看广告的自动对局验证 | 保证广告是加速而不是门槛 |
下一篇讲打包:给其他 Mac 用户发试玩包、排查启动慢,以及一次由 AI 自己的优化改出来的崩溃。