一个人 + AI,58 天:首周 258 个玩家,本周 10 个,收入 0 元

1 阅读20分钟

一个人 + AI 做的网页刷宝游戏,上线 58 天:首周 258 人,本周 10 人,收入 0 元

先说结论,一个数字组合:

首周上榜 258 人 → 本周 10 人;58 天 450 次提交;游戏内打赏收入 0 元。

这不是一篇成功学文章。如果我想写成功学,我可以只发第一行数字(「上线首周 258 个玩家」),然后闭嘴。但排行榜接口是按赛季分的,我把它一季一季拉下来之后,看到的是这条曲线:

赛季上榜人数本季最高层
第 1 赛季(上线首周)2581277
第 2 赛季1561613
第 3 赛季1802212
第 4 赛季831134
第 5 赛季482003
第 6 赛季192354
第 7 赛季142101
第 8 赛季152001
第 9 赛季(本周,进行中)102066

数据来源:线上公开接口 GET /api/droptale/leaderboard?seasonNo=N,今天实拉。口径是「该赛季上传过新纪录的存档码数」,按 (赛季, 存档码) 唯一——因为我们这游戏没有经验值,层数就是进度,赛季每周四 07:00 重置,所以「上传过新纪录」基本等于「这周真的玩过」。

游戏叫《掉落物语》(Droptale),一个纯网页的放置刷宝 RPG,点开就玩,不用下载不用登录:www.lootstory.work/droptale/

另外先坦白一件事:玩法不是我原创的。

8 月 6 日我的第一次提交,标题是这么写的:

改造需求文档 v1.0:参考游戏 vue-idle-game → 掉落物语(改名+纯前端化+UI现代化)

我把一个现成的 Vue 挂机游戏拉下来,写了一版改造文档,然后开始改。所以这篇文章的主题不是「我怎么发明了一个玩法」,而是:一个人 + AI,58 天里做了什么、错在哪、以及那些数字是怎么来的。


先上数据

数据拉取时间:2026-10-13。能拉的我都不手填——上面那张表你能自己复现,把 seasonNo 从 0 换到 8 就行。

开发侧(git log 和仓库里数的)

项数字
提交次数450(8 月 327 / 9 月 118 / 10 月 5)
前端71 个 .vue + 88 个 .ts,约 34,144 行
后端Flask app.py + audit.py(单机 Nginx + MySQL + systemd)
发版更新日志里 27 个版本(v4.9.0 → v4.11.16,9 月 1 日到 9 月 28 日)
存档迁移迁移链做到 第 11 代(每次改数值都要把玩家已经打出来的东西还回去)
玩家反馈111 条(截至 9 月 1 日,带存档的快照约 160 份)
验证脚本scripts/ 下 170 个 .mjs(其中 84 个 verify-*、26 个 check-*),全是 puppeteer 真机跑
线上版本v4.11.16 / 存档格式第 11 代

玩家侧(线上接口)

项数字说明
第 1 赛季上榜 258 人里,没打过 100 层的222 人(86%)段位表里 100 层是 T1 的门槛,也就是绝大多数人连第一个段位都没出去
9 个赛季累计上榜条目783 条跨赛季去重人数我算不出来(接口只给匿名 token),后台能看到
榜一最高层1277 层(第 1 赛季)/ 2354 层(第 6 赛季)数值重制后现在稳定在 2000 层上下
单人最高转生次数5494 次一个人,转了五千多次生
深玩家破 1000 层的每季 1~17 人这批人是这个游戏真正的骨架

258 是面子,222 是里子。 这篇文章后面所有内容,基本都是在解释那 222 个人为什么走了。

钱

项数字
广告0(不做)
内购0(不做)
打赏收入0 元
打赏驱动的开发项11 项投票已达标,一项资金未到账;榜首 123 票、成本 ¥80

(打赏那两行是 9 月 1 日的状态,我在最后留了核对清单。)


成本怎么算的

独立游戏「成本」通常被理解成买素材花了多少钱。能算的我列出来:

项花费说明
美术素材0 元图标来自 game-icons.net(CC BY 3.0,页脚已署名);背景图全部来自 Wikimedia Commons 公版或 CC 授权;战斗角色等原游戏素材保留未替换——CREDITS.md 逐条写了来源与许可
域名 + ICP 备案域名年费 + 0 元备案备案免费但要等,这一步卡流程
服务器一台 ECS 的月费Nginx + Flask + MySQL 全在一台机器上
AI token每月一份 token 账单全程 AI 结对,这是我的主要现金开销
我的时间58 天最贵的一项,具体小时数我没统计过

具体金额我不写(个人账单,没什么参考价值)。你只要知道一个对比:上面这几项加起来,远小于一次改错数值的返工。

但真正贵的不是这些,是「改错了要还回去」。 我给你算一次:

一次事故的完整成本:新玩家穿着装备,打不过第一只怪

9 月 18 日,一个真实的新玩家反馈:

穿了装备还是 1 攻击 3 HP,连第一个本第一个怪都打不过。

我一开始以为是「新手不会玩」,灌了他的存档实测才发现是真 bug。根因链条:

  1. 9 月 15 日的 v4.10,我把全局数值压缩了 100 万倍(原来伤害是 92 万亿级的天文数字,玩家根本读不出来)
  2. 玩家侧的量纲压了,普通副本的怪物公式没跟着压(它还是旧量纲的 lv^2.1)
  3. 秘境第 1 层的难度锚点,是按毕业号的乘区标定的
  4. 结果:新号被高出 2~4 个数量级的怪物秒杀;而这游戏是「打赢才升级、才掉装备」——新手直接死锁在开局

那天我修了两件事:给 100 层以下做了一整条「新手带」(怪物恒定低血量、防御置 0),基础生命从 200 提到 800。

然后我回头看那条曲线,发现最贵的一课不在代码里:

我的首周 258 个玩家,是在 8 月中旬来的。而「新玩家打不过第一只怪」这件事,我 9 月 18 日才发现。

也就是说,我唯一一次有流量的窗口,是被我自己亲手掐掉的——而且我当时完全不知道,因为我验收的时候只测了 2000 层的毕业号。

那次事故之后我写下两条纪律,一直执行到现在:

一、改数值不是改一个数,是改一整套量纲。谁受影响,要列清单。

二、验收必须覆盖「最弱的玩家」,不是「最强的玩家」。

第二条纪律并不抽象。9 月 16 到 18 日,我在「经济标度」上连着补了三次漏:

  • 第 1 次:转生费用漏改(相对收入膨胀 100 倍)
  • 第 2 次:自动转生和重铸费用漏改(玩家实测「还是旧价钱」逼出来的)
  • 第 3 次:全面审计,又挖出 5 处——宝石升级费、背包扩容、成就门槛、重复宝石转化、里程碑奖励

教训送你,免费:改标度时不要只改你在想的那几个文件,把 ×20、×500、固定大数全仓库 grep 一遍,再对着文件清单逐个确认。


为啥留不住:数据给了三个答案

我不想把「从 258 掉到 10」解释成「独立游戏就是这样」。复盘下来,三个原因,一个比一个难堪。

1. 首周那 258 人来自推广,不是产品力

8 月 19 日我准备了一套推广素材(封面、截图、宣传页、PPT),投了几个独立游戏渠道。首周的量是那一波流量给的,不是游戏好玩到自来水的。

推广能带来人,但留人靠的是第一小时。 而我的第一小时当时是坏的(见上面那次事故),只是我不知道。

2. 86% 的人没打过 100 层,而我一个月后在优化 2000 层的东西

回看第 1 赛季的数据:258 人里 222 人没突破 100 层。这个游戏 100 层是什么概念?新手带的出口,第一堵真墙。 越过它,你才开始理解「强化是硬门槛」这件事。

我在那之后做的最大的一个批次(v4.11),做的是什么?

  • 排行榜全面改版:1 个实力榜拆成 5 个(巅峰/分组/突破/百分位/纪念)
  • 数值曲线重制:实测墙位从「榜一 3667 层 vs 普通毕业 1100 层」(层差 2667)压到「榜一 ~2080 vs 普通毕业 1327」(层差 753)
  • 深渊强化、赛季奖励映射、Boss 机制减法

这些改动是对的,玩家反馈也很好。但它服务的是已经玩到 1000 层以上的那 9~17 个人,而 222 个人在第一道墙前就走了。

我把力气花在了最忠诚的玩家身上,而没有花在最大的那扇门前面。

用数据说话:v4.11 之后,周活没有回来——第 69 赛季稳定在 1019 人。

3. 赛季制能让人「回来」,但没回答「回来干什么」

赛季制是我最自豪的设计:每周四 07:00 结算,层数归 1、装备保留、赛季词缀重抽、按上赛季最高层发下赛季启动装备。它确实每周把人叫回来一次——第 6 到第 9 赛季,人数没掉到 0,一直有 10~19 个人准时回来。

但从 9 月 28 日之后,我进入了维护期:10 月这 13 天,我只提交了 5 次代码。 原因很直接——打赏管线停摆(11 项投票达标、0 项资金到账),新内容的排期没有燃料。

一个每周重置的游戏,如果每周没有新的东西,玩家会算得比你还快:这周和上周一样,那我为什么要来?

三条加起来就是全部的答案:流量只来了一次、第一小时是坏的、每周没有新东西。

这三件事里,只有第一件不归我管。


那这 58 天到底做了什么

抱怨完了,说产品。

一句话:《掉落物语》是一个没有经验值、没有手动操作的赛季制放置刷宝网页游戏。

核心循环:

打副本(世界地图随机) ──掉装备──> 比较/换装/出售 ──> 强化/重铸/升华
        │                                                    │
        └── 通关 lv>=100 解锁 大秘境(层数制天梯) ── 爬层 ──────┘
                              │
                          卡层(打不过)
                              │
                    ┌─────────┴─────────┐
              刷低层毕业/强化        转生(能量满→永久巅峰点)
                    └─────────┬─────────┘
                        变强,继续爬 → 每周四 07:00 赛季结算重置

五条设计支柱(改造过程中被我一条条钉下来的):

  1. 层数即进度:没有经验值,不引入第二条成长线;关键层(10/20/30/50/100…)发阶段奖励,形成「突破节点」的节奏感
  2. 强化是硬门槛:怪物血量随层数指数增长,玩家靠强化指数放大——卡层就是装备没跟上,不给「操作补救」的幻觉
  3. 转生是无限成长出口:卡层后转生拿永久巅峰点(独立乘区),等级/装备/金币全保留——本质是「重置层数奖励」,不是「重置角色」
  4. 赛季周循环:每周四结算、层数归 1、词缀(4 条增益 + 4 条怪物增强)每周重抽
  5. 放置定位下的 Boss 反制:不做躲技能、不做时间轴,用「锁血 + 护盾 + 开局反弹 + 狂暴」惩罚无脑强杀

9 月 1 日到 9 月 28 日,更新日志里躺了 27 个版本,我挑几条你能看出节奏的:

日期版本主题
09-01v4.9.0终局玩法完整上线:构筑、Boss、挑战、赛季、收藏与幽灵挑战
09-09v4.9.8玩家投票落地:穿戴中装备直接操作、强化成功率平滑、保护石可购买
09-15v4.10.0全局数值重制:所有数字压到百万级,告别天文数字
09-16v4.11.0排行榜全面改版 + 深层曲线重制 + 深渊强化 + 赛季奖励升级
09-18v4.11.8(事故修复)新手期量纲重做
09-18~19v4.11.9~14强化曲线 / 经济标度 / 排行榜口径连续校准(6 个版本)
09-20v4.11.15挑战周奖达标门槛修复
09-28v4.11.16大秘境开战修复(只有一例反馈的 bug)

图 1(封面):promo/xmohe-upload/cover_droptale.jpg 图 2(截图):promo/xmohe-upload/screen_droptale_01_169.jpg 图 3(截图):promo/xmohe-upload/screen_droptale_02.png 图 4(宣传页预览):promo/xmohe-upload/preview_droptale.jpg 发表时把这四张图拖进掘金编辑器,替换掉这几行。


开发怎么做的

这是本文唯一有技术含量的部分。我只讲一个人 + AI 怎么分工,以及我为什么敢让 AI 改一个线上有人玩的东西。

分工

  • 我:定玩法终态、拍板数值曲线、判断「这个体验对不对」、决定什么不做
  • AI:检索代码、实现改动、写验证脚本、跑回归、执行部署

一句话:我做决定,AI 做执行和证据。

这个分工有个致命风险:AI 非常擅长写出「看起来是对的」的东西,包括验收。所以纪律比能力重要。

三条纪律

纪律一:所有数值必须有单一来源,前后端必须逐字节一致。

前端 base.ts 和后端 app.py 各存一份版本号和公式常量。改了一处忘了另一处,线上就会出现诡异状态——真发生过:有一次后端已经是 4.11.15,但前端从没部署过,于是玩家一直看到「有新版本可刷新」的横幅。

所以我写了 verify:data 进验证链,比对前后端版本号与关键公式常量。它当场抓出过我自己漏 bump 的版本号。

纪律二:改完必须留下一条能重跑的证据链。

每次发版的固定动作:

tsc 无错
→ verify-vue-idents(159 个文件标识符齐全,专防「未导入的标识符被空 catch 吞掉」)
→ verify:data(前后端版本与公式镜像)
→ build
→ puppeteer E2E(verify-dami-start 10/10、verify-leaderboard 26/26、season-affix 50/50 …)
→ 服务端 selfcheck 28/28
→ 公网验证:线上 index 只引用新 bundle、旧 bundle 引用数为 0

最后一条最值钱:旧 bundle 引用数必须是 0。浏览器缓存这东西,你不验证,就永远不知道玩家加载的是新代码还是三天前的代码。

纪律三:用真实存档回放,不要只用自己造的测试数据。

改数值之前,我会把线上真实玩家存档灌进改动后的公式跑一遍(做过一次 197 份)。这件事直接救了一个合法玩家:

我原本把「收入/战力比」反作弊阈值定在 2.2。47 份线上快照全部回放后,发现它会误杀一个审计完全干净的合法玩家(比值 2.27)。于是阈值放宽到 3.0——作弊号 6.5 倍照样拦得住。

宁可漏一个改档的,不能杀一个真肝的。

AI 的边界在哪

58 天里,AI 帮我实现过整条「排行榜改造 + 数值曲线重制」,也帮我抓出过下面那个「连点 40 次才触发」的 bug。但它有两条明确的边界:

  1. 它不替你判断什么叫「好玩」。 它能把曲线调得数学上完美,但「玩家看到榜一 3667 层就流失」这件事,只有人能拍板
  2. 它会漏掉它没被要求覆盖的量纲。 新手期事故就是活例:验收覆盖了「大秘境 2000 层毕业号」,普通本和新号零覆盖——不是 AI 偷懒,是我没要求。所以现在的流程是:任何数值改动,先让它列出受影响的量纲清单 + 验证矩阵,我审清单,再动手

两个我印象最深的 bug

案例 A:全服只有一个人会中的 bug。

玩家报「大秘境点开始挑战,点多了就没反应」——界面切到战斗场景、按钮变成「终止挑战」,但不出怪、不打回合。我灌他的存档复现:连点 45 次,第 41 次起必然触发。

根因很脏:战斗组件挂载逻辑里有个重试计数器(50ms × 40 次)。而因为 Vue 的 DOM 更新在微任务里,点开战那一帧模板 ref 必然是 null——所以这个「重试」根本不是兜底路径,而是每次开战的必经路径。计数器每次开战 +1、成功也不清零,于是同一页面点满 40 次后,开战函数永远不会被调用。

修法是把重试改成 await nextTick(),等组件挂载完再开战。修完这个 bug 我没赚到一分钱,但如果那一个玩家没来反馈,我永远不知道自己的开战逻辑是靠一个 bug 在撑着的。

案例 B:玩家说「装备有 bug」,其实是他的加点。

另一个玩家说「穿上某条裤子/某套装备就秒死」。我拿他的真实存档做了三组对照实测(当前档 / 换那条裤子 / 换整套),结论是装备没有任何问题——真根因是他 2000 点属性点全投了暴击伤害,生命和攻击恒为 0,面板血量只有 38.7 万。

装备没问题,但他需要一个解释。所以我加了「卡层诊断」和加点引导,让面板把「你差在哪」直接说出来。

玩家说「有 bug」,一半时候是「我看不懂」。这句话我验证过很多次了。

反作弊:安全边界必须在服务端

这是个网页游戏,存档在玩家浏览器里,客户端的一切限制都能被改档工具绕过。所以:

  • 上传拦截:校验强化等级、装备等级上限、词条是否超过公式上限、金币是否超过收入估算的合理倍数
  • 快照审计:客户端上传 gzip 存档,服务端打开存档核对层数、境界、战力、赛季分,再加增长速率(300 层/小时)和只升不降
  • 封禁名单:确认的作弊号直接拒绝上传,配「只上传新纪录 + 重复上传 noop」堵住「删了又重传」的循环

三层防线:上传拦截 → 人工审核 → 实机验证。


写在最后

回到那个 0 元。

我这套变现设计是「投票 + 打赏驱动开发」:玩家投票决定优先做什么,票数达标 → 资金到账 → 我排期开发,单项目成本 ¥20~80。现状是:11 项投票达标,一项资金未到账,榜首那项 123 票。

我不打算假装这件事不疼。免费无广告、纯靠打赏,意味着这 58 天我在钱上是完全亏损的。

但把话说完整:这 58 天我拿到的不是 0。

  • 783 条上榜记录、9 个赛季的真实数据:它告诉我问题不在「留存差」这种模糊判断上,而在具体的三个位置(第一小时是坏的、力气花错人、每周没有新东西)
  • 一套能复用的工程方法:单一来源、证据链、真实存档回放、验收覆盖最弱玩家——换成任何项目都能用
  • 111 条真实反馈教会我的事:玩家说「有 bug」时,一半是设计没表达清楚;玩家说「装备有问题」时,可能他自己加点错了;而只有一个人反馈的 bug,也可能是必然触发的逻辑错误
  • 以及:我改数值的能力,从「改一个数」变成了「改一整套量纲,并列出受影响的清单」

下一步我不打算再做什么大功能。我打算按数据排优先级:

优先级做什么为什么
1把新手前 30 分钟做对(前 100 层的引导、卡层解释、第一次强化的正反馈)86% 的人死在这道墙前,这是唯一值得现在投的地方
2手机浏览器适配(1~2 周)挂机游戏的天然场景是手机;拿真机留存数据
3微信小游戏(6~10 周:小游戏没有 DOM,88 个 chunk 的渲染层要重写,主包还要从 4.9MB 瘦到 4MB 以内)等第 1、2 项的数据是正的再说

第 3 项我想多说一句:在拿到「手机端有人玩」的证据之前投 6~10 周,回报是负的。 这跟写代码没关系,是算账——这也是我这 58 天学会的最贵的一课:先修通最大的那扇门,再去拉人进门。

游戏还开着,免费、无广告、点开就玩:www.lootstory.work/droptale/

如果你愿意进去挂一会,然后告诉我你在第几层想关掉——那对我来说,比打赏有用得多。


附:发表前请核对(作者自查,别一起发出去)

  1. 玩家曲线那张表:数字是我用公开接口 GET /api/droptale/leaderboard?seasonNo=0..8 实拉的,口径是「该赛季上传过新纪录的存档码数」。你后台能按 season_no 看到准确人数,发表前对一眼
  2. 赛季编号口径:我按游戏内排行榜下拉框的显示写的(seasonNo=0 显示为「第 1 赛季」,当前 seasonNo=8 显示为「第 9 赛季」)。如果你平时习惯说内部编号,把表头改一下别让读者对不上
  3. 「58 天」的算法:按仓库里记录的首次上线部署时间(8 月 16 日)算到 10 月 13 日。如果你认定的首发日不是这天,标题和正文的数字一起改
  4. 推广渠道:正文写的是「投了几个独立游戏渠道」这种模糊表述——我不知道你实际投了哪里,没敢替你编。如果愿意写实(哪个平台、上了什么榜),说服力会更强
  5. **「累计 783 条上榜记录」**是各赛季相加(同一玩家跨赛季会重复计入),我特意没写成「783 个玩家」——跨赛季去重人数只有你后台能算
  6. 收入与打赏那两行是 9 月 1 日的状态:如果你后来收到过打赏,改成真实数字(哪怕 ¥20,诚实反而更好)
  7. 成本表我故意没写金额(只写了「域名年费 / 一台 ECS 月费 / 每月 token 账单」)。你要是愿意公开真实数字,替换掉更有说服力;不愿公开就保持现状
  8. 数据时间:全文口径是 2026-10-13,发表时改成当天或写明「数据截至 X 月 X 日」
  9. 玩家信息:我只用了「榜一 1277 层」「单人转生 5494 次」这类数字,没有写任何玩家昵称——这样最安全,别加回去
  10. 是否需要「上一篇」呼应:参考的那篇掘金文是接着上一篇的评论写的。如果你有前作,开头加一句呼应,读者黏性会更好
  11. 图片:promo/xmohe-upload/ 那四张图拖进编辑器,封面建议用 cover_droptale.jpg
  12. 删掉这个附录再发表