vibe coding 做小游戏·玩法篇:8 句试玩反馈,变成无限关卡、局外成长和援军登场

0 阅读11分钟

前两篇讲了开工第一天的决定,以及全套美术怎么由 Claude Code 操作 ChatGPT 生成。这一篇讲战役模式的玩法是怎么一步步定下来的。

开工后两天(10 月 25 日到 26 日),我对战役玩法说过的话加起来大约 8 句,没有一句是需求文档,基本都是试玩之后的直接感受,比如「没什么挑战」「不要每次从零开始」。这 8 句话最后变成了:两条可以一路升级的兵种线、按关卡号生成的无限关卡、一套局外成长系统、援军登场式的解锁,以及三处广告位。中间有一个环节是我完全没参与的:AI 写了自动对局脚本,让游戏带着天赋连打几十关,按「第几关开始输」来调难度。

回头看,这两天的分工很清楚。我负责判断好不好玩,并且只用一句话说出来;AI 负责把这句话翻译成可以测试的机制和数字,再用自动对局证明它确实改变了体验。一句「没挑战」本身不可执行,能执行的是「把首次失败从第 50 关提前到第 20–25 关」。这个翻译做得好不好,决定了 vibe coding 做游戏能不能往下走。

8 句反馈和对应的改动

战役实机:第 2 关和第 12 关

先把全貌列出来,后面挑关键的几处展开:

日期我的反馈(原话或大意)落地的改动
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%,算是补偿。

这一步的价值在于,后面所有系统都建立在「角色有等级」这个前提上:援军登场是让下一级角色在关卡里赶到,局外强化是给满级角色加星,合成对战也是同一套兵种表。

无限关卡:关卡号就是随机种子

第 1–60 关难度曲线

我对关卡的要求只有一句:不要做成有限的,要能无限畅玩,让人上瘾,「你好好设计一下」。

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 自己的优化改出来的崩溃。