一个人 + AI 做的网页刷宝游戏,上线 58 天:首周 258 人,本周 10 人,收入 0 元
先说结论,一个数字组合:
首周上榜 258 人 → 本周 10 人;58 天 450 次提交;游戏内打赏收入 0 元。
这不是一篇成功学文章。如果我想写成功学,我可以只发第一行数字(「上线首周 258 个玩家」),然后闭嘴。但排行榜接口是按赛季分的,我把它一季一季拉下来之后,看到的是这条曲线:
| 赛季 | 上榜人数 | 本季最高层 |
|---|---|---|
| 第 1 赛季(上线首周) | 258 | 1277 |
| 第 2 赛季 | 156 | 1613 |
| 第 3 赛季 | 180 | 2212 |
| 第 4 赛季 | 83 | 1134 |
| 第 5 赛季 | 48 | 2003 |
| 第 6 赛季 | 19 | 2354 |
| 第 7 赛季 | 14 | 2101 |
| 第 8 赛季 | 15 | 2001 |
| 第 9 赛季(本周,进行中) | 10 | 2066 |
数据来源:线上公开接口 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。根因链条:
- 9 月 15 日的 v4.10,我把全局数值压缩了 100 万倍(原来伤害是 92 万亿级的天文数字,玩家根本读不出来)
- 玩家侧的量纲压了,普通副本的怪物公式没跟着压(它还是旧量纲的
lv^2.1) - 秘境第 1 层的难度锚点,是按毕业号的乘区标定的
- 结果:新号被高出 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 之后,周活没有回来——第 6
9 赛季稳定在 1019 人。
3. 赛季制能让人「回来」,但没回答「回来干什么」
赛季制是我最自豪的设计:每周四 07:00 结算,层数归 1、装备保留、赛季词缀重抽、按上赛季最高层发下赛季启动装备。它确实每周把人叫回来一次——第 6 到第 9 赛季,人数没掉到 0,一直有 10~19 个人准时回来。
但从 9 月 28 日之后,我进入了维护期:10 月这 13 天,我只提交了 5 次代码。 原因很直接——打赏管线停摆(11 项投票达标、0 项资金到账),新内容的排期没有燃料。
一个每周重置的游戏,如果每周没有新的东西,玩家会算得比你还快:这周和上周一样,那我为什么要来?
三条加起来就是全部的答案:流量只来了一次、第一小时是坏的、每周没有新东西。
这三件事里,只有第一件不归我管。
那这 58 天到底做了什么
抱怨完了,说产品。
一句话:《掉落物语》是一个没有经验值、没有手动操作的赛季制放置刷宝网页游戏。
核心循环:
打副本(世界地图随机) ──掉装备──> 比较/换装/出售 ──> 强化/重铸/升华
│ │
└── 通关 lv>=100 解锁 大秘境(层数制天梯) ── 爬层 ──────┘
│
卡层(打不过)
│
┌─────────┴─────────┐
刷低层毕业/强化 转生(能量满→永久巅峰点)
└─────────┬─────────┘
变强,继续爬 → 每周四 07:00 赛季结算重置
五条设计支柱(改造过程中被我一条条钉下来的):
- 层数即进度:没有经验值,不引入第二条成长线;关键层(10/20/30/50/100…)发阶段奖励,形成「突破节点」的节奏感
- 强化是硬门槛:怪物血量随层数指数增长,玩家靠强化指数放大——卡层就是装备没跟上,不给「操作补救」的幻觉
- 转生是无限成长出口:卡层后转生拿永久巅峰点(独立乘区),等级/装备/金币全保留——本质是「重置层数奖励」,不是「重置角色」
- 赛季周循环:每周四结算、层数归 1、词缀(4 条增益 + 4 条怪物增强)每周重抽
- 放置定位下的 Boss 反制:不做躲技能、不做时间轴,用「锁血 + 护盾 + 开局反弹 + 狂暴」惩罚无脑强杀
9 月 1 日到 9 月 28 日,更新日志里躺了 27 个版本,我挑几条你能看出节奏的:
| 日期 | 版本 | 主题 |
|---|---|---|
| 09-01 | v4.9.0 | 终局玩法完整上线:构筑、Boss、挑战、赛季、收藏与幽灵挑战 |
| 09-09 | v4.9.8 | 玩家投票落地:穿戴中装备直接操作、强化成功率平滑、保护石可购买 |
| 09-15 | v4.10.0 | 全局数值重制:所有数字压到百万级,告别天文数字 |
| 09-16 | v4.11.0 | 排行榜全面改版 + 深层曲线重制 + 深渊强化 + 赛季奖励升级 |
| 09-18 | v4.11.8 | (事故修复)新手期量纲重做 |
| 09-18~19 | v4.11.9~14 | 强化曲线 / 经济标度 / 排行榜口径连续校准(6 个版本) |
| 09-20 | v4.11.15 | 挑战周奖达标门槛修复 |
| 09-28 | v4.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。但它有两条明确的边界:
- 它不替你判断什么叫「好玩」。 它能把曲线调得数学上完美,但「玩家看到榜一 3667 层就流失」这件事,只有人能拍板
- 它会漏掉它没被要求覆盖的量纲。 新手期事故就是活例:验收覆盖了「大秘境 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/
如果你愿意进去挂一会,然后告诉我你在第几层想关掉——那对我来说,比打赏有用得多。
附:发表前请核对(作者自查,别一起发出去)
- 玩家曲线那张表:数字是我用公开接口
GET /api/droptale/leaderboard?seasonNo=0..8实拉的,口径是「该赛季上传过新纪录的存档码数」。你后台能按season_no看到准确人数,发表前对一眼 - 赛季编号口径:我按游戏内排行榜下拉框的显示写的(
seasonNo=0显示为「第 1 赛季」,当前seasonNo=8显示为「第 9 赛季」)。如果你平时习惯说内部编号,把表头改一下别让读者对不上 - 「58 天」的算法:按仓库里记录的首次上线部署时间(8 月 16 日)算到 10 月 13 日。如果你认定的首发日不是这天,标题和正文的数字一起改
- 推广渠道:正文写的是「投了几个独立游戏渠道」这种模糊表述——我不知道你实际投了哪里,没敢替你编。如果愿意写实(哪个平台、上了什么榜),说服力会更强
- **「累计 783 条上榜记录」**是各赛季相加(同一玩家跨赛季会重复计入),我特意没写成「783 个玩家」——跨赛季去重人数只有你后台能算
- 收入与打赏那两行是 9 月 1 日的状态:如果你后来收到过打赏,改成真实数字(哪怕 ¥20,诚实反而更好)
- 成本表我故意没写金额(只写了「域名年费 / 一台 ECS 月费 / 每月 token 账单」)。你要是愿意公开真实数字,替换掉更有说服力;不愿公开就保持现状
- 数据时间:全文口径是 2026-10-13,发表时改成当天或写明「数据截至 X 月 X 日」
- 玩家信息:我只用了「榜一 1277 层」「单人转生 5494 次」这类数字,没有写任何玩家昵称——这样最安全,别加回去
- 是否需要「上一篇」呼应:参考的那篇掘金文是接着上一篇的评论写的。如果你有前作,开头加一句呼应,读者黏性会更好
- 图片:
promo/xmohe-upload/那四张图拖进编辑器,封面建议用cover_droptale.jpg - 删掉这个附录再发表