公司动态

数值飞轮深拆:产出收敛、飞升转生与有限多周目设计

📅 2026/7/15 4:41:41
数值飞轮深拆:产出收敛、飞升转生与有限多周目设计
本文是「放置游戏策划实战」系列第 4 篇。P1 总纲里我抛出了放置类的灵魂——数值飞轮并指出绝大多数数值崩坏出在两个地方① 推图更远后产出没有收敛② 飞升的永久加成没设计好。P2 用 Python 跑了蒙特卡洛模拟检测卡点与留存P3 我们拆了独立乘区战力公式为什么必须是乘法。今天回到飞轮本身用数学和实验把那两个崩坏点彻底讲透。目录一、为什么推图更远后产出必须收敛二、飞升/转生把无限增长变成有限多周目三、永久加成质变感飞升到底该加多少四、离线收益上限别让挂机碾压实时玩法五、完整可运行脚本六、总结与下期预告一、为什么推图更远后产出必须收敛问题玩家每推过一关就解锁更高阶的资源掉落倍率。如果这个倍率涨得比关卡需求还快会发生什么如果比需求慢呢如果恰好相等呢数学模型设关卡需求的增长速度 R等比数列公比推图解锁后的产出增速 out_growth每关解锁的产出倍率则第 L 关时产出 / 消耗比值为ratio(L)(OUT0/CONS0)×(out_growth/R)**L起点 OUT0 CONS0 时 ratio(0) 1。关键在于(out_growth / R)这一项实验我用三种 out_growth 跑到第 40 关看 ratio 怎么变化结果场景out_growthout_growth / R第 40 关产出/消耗后果通胀1.301.13134.8 倍数字爆炸资源毫无意义玩家瞬间无敌收敛1.151.001.0 倍始终平衡每一关都值得打卡死1.080.940.08 倍产出跟不上消耗玩家永远卡住核心结论产出增速必须 ≈ 需求增速。这是数值飞轮的第一个调节阀。out_growth R → 通胀玩家越推图资源越溢出。到了后期数字变成天文数字1.2e308但玩家毫无成就感——因为数字已经失去了参照意义。out_growth R → 卡死产出跟不上需求玩家在某一关永远无法突破。这是 P2 蒙特卡洛模拟里我们看到的多数玩家卡在第 10~18 关的根本原因之一。out_growth ≈ R → 收敛比值始终维持在 1 左右。玩家每推一关获得的额外产出刚好够支撑下一关的需求——这才是健康状态。实操建议在你的游戏里算一下out_growth / R的值。如果偏离 1 太远超过 ±0.05说明飞轮的产出端或需求端需要调参。具体调哪个回 P3 看独立乘区收敛性实验——只动对应乘区的系数即可。二、飞升/转生把无限增长变成有限多周目问题即使产出完美收敛ratio ≈ 1指数增长最终还是会把数字推向无穷大。放置类怎么解决这个根本矛盾答案是飞升Ascend/转生Rebirth——定期重置当前进度换取一个永久加成让下一圈飞轮转得更快。核心公式假设飞升时给玩家的永久乘区b如每次飞升基础战力永久 ×1.5关卡需求公比 R首轮能到达的最高关卡 L0那么第 c 轮飞升后该轮最高可达关卡为L_c L0 c × ln(b) / ln(R)每轮额外推进的关卡数 ln(b) / ln®——这是一个常数这意味着每轮飞升带来的增益是恒定的不会因为轮次增加而放大。实验R1.15b1.50结果飞升轮次最高到达关卡该轮新增1首轮15—2183 关3213 关4243 关5273 关6303 关7322 关图表解读这张图揭示了有限多周目的本质线性上升非指数——每轮增益恒定本例中ln(1.5)/ln(1.15) 2.9 关。玩家确实在进步但不会出现越飞升越夸张的失控膨胀。每轮都是一次有意义的冲刺——从重置状态出发带着永久加成重新跑一圈飞轮到达比上一轮更高的位置。这给玩家提供了持续的再来一轮的动力。有限——每轮增量固定意味着你不需要担心玩家飞升 100 轮后战力变成天文数字。同时这也意味着你必须持续添加新内容来维持长期吸引力——当玩家觉得每轮只是重复同样的过程时就是你需要出新系统的时候。不同 b 值下的每轮增益速查表飞升乘区 b每轮额外推进关卡数R1.15设计评价×1.100.7 关白重开——几乎感觉不到进步×1.201.3 关勉强可感知——偏弱×1.352.1 关合理区间——推荐×1.502.9 关良好——推荐×1.804.2 关较强——适合快节奏×2.005.0 关很强——注意不要让单轮太短记住这个公式每轮增量 ln(飞升乘区) / ln(关卡公比)。它直接决定了你飞升系统的节奏感。三、永久加成质变感飞升到底该加多少问题飞升给了玩家永久加成但如果加得太少比如 ×1.10玩家会觉得重开了个寂寞加得太多比如 ×3.0又会让每轮变得太短、失去挑战感。多少才是刚刚好实验对比弱飞升b1.10和强飞升b1.50在 7 轮内的总进展结果方案7 轮累计提升每轮体验玩家感受弱飞升×1.104 关15→19几乎原地踏步“白重开没意义”强飞升×1.5017 关15→32每轮明显更深“有质变想再飞一轮”核心发现弱飞升×1.10的红线几乎是一条水平线——7 轮下来总共才多推了 4 关。玩家花时间重新跑了一遍流程得到的回报微乎其微。这种设计直接导致飞升后流失——因为玩家看不到继续玩的理由。强飞升×1.50的绿线斜率清晰可见——每轮稳定推进 2~3 关7 轮翻了一倍多。玩家每次飞升都能明确感知到这一轮比上一轮快了/远了这就是质变感。质变感的三个层次不是所有永久加成都叫质变。真正的质变需要满足三个条件层次条件例子❌ 无感加成 ×1.15每轮 1 关×1.10 → 白重开✅ 有感加成 ×1.25~1.60每轮 1.5~3 关×1.50 → 明显更快✅✅ 强质变加成 ×1.80每轮 4 关 新内容解锁×2.0 解锁新系统我的建议首次飞升放在 ×1.35~1.55 区间让玩家感受到明显的加速但不至于一轮结束太快。后续可以逐步提高 b比如第 3 轮开始 ×1.70配合新内容解锁形成强质变。四、离线收益上限别让挂机碾压实时玩法飞升解决了无限增长的问题但还有一个常见崩坏点经常被忽视离线收益。问题放置游戏的卖点就是挂机也有收益。但如果离线收益不加限制会出现什么情况玩家 A 每天上线 1 小时实时游玩。玩家 B 上线 5 分钟收菜就走纯靠离线积累。如果 B 的离线收益无上限 → B 的总资源可能超过 A →在线玩家被惩罚这会摧毁核心循环的即时反馈环节——既然不玩也能拿更多谁还会认真玩解决方案两个必选其一最好都用方案 A离线上限离线收益 min(实际离线时长 × 时产, 8小时 × 时产)不管离线多久最多给你 8 小时的量。这样长线玩家不会碾压短期活跃玩家太多。方案 B衰减曲线离线效率 max(0.3, 1 - 离线小时数 / 48) # 最低保留 30%前几小时满效率之后逐渐衰减最低保底 30%。这样既鼓励每天上线拿满效率部分又不会完全抹杀离线收益的价值。最佳实践AB 组合使用。设 8 小时硬上限 超过后衰减到 30%。TapTap 上表现好的放置游戏基本都在用这套方案。五、完整可运行脚本保存为flywheel_deep_dive.py一键生成全部 3 张实验图表# -*- coding: utf-8 -*-数值飞轮深拆实验器 —— 产出收敛 / 飞升多周目 / 质变感importnumpyasnpimportmatplotlib matplotlib.use(Agg)importmatplotlib.pyplotaspltfrommatplotlibimportfont_managerasfmimportos,platform# ── 跨平台中文字体 ──_sysplatform.system()if_sysDarwin:FONT/System/Library/Fonts/STHeiti Medium.ttcelif_sysWindows:FONTC:/Windows/Fonts/msyh.ttcelse:FONT/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttcfm.fontManager.addfont(FONT)plt.rcParams[font.family]fm.FontProperties(fnameFONT).get_name()plt.rcParams[axes.unicode_minus]FalseOUT./csdn_images/p2os.makedirs(OUT,exist_okTrue)P0,REQ0,R10,12,1.15INDIGO,CYAN,AMBER,GREEN,RED#4F46E5,#06B6D4,#F59E0B,#16A34A,#DC2626# ── 1. 产出收敛 ──defexp_convergence():lvnp.arange(41)cases[(1.30,通胀,RED),(1.15,收敛,GREEN),(1.08,卡死,INDIGO)]fig,aplt.subplots(figsize(8,4.4),dpi110)forog,lab,cincases:a.plot(lv,(og/R)**lv,colorc,lw2.4,labelf{lab}out_growth{og})a.axhline(y1,color#94A3B8,ls--,lw1.4,label比值1健康线)a.set_yscale(log);a.set_xlabel(关卡)a.set_ylabel(产出/消耗对数轴)a.set_title(产出收敛性产出增速必须≈需求增速,fontsize13,weightbold)a.legend(fontsize9);a.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p2_01_产出收敛.png,dpi110)plt.close(fig)# ── 2. 飞升多周目 ──defflywheel_cycles(b,L015,cycles7):incnp.log(b)/np.log(R)returnnp.array([round(L0c*inc)forcinrange(cycles)]),incdefexp_cycles():ml,incflywheel_cycles(1.5)fig,aplt.subplots(figsize(8,4.4),dpi110)a.plot(range(1,len(ml)1),ml,colorAMBER,lw2.6,markero,ms6,label每轮最高到达关卡)fori,vinenumerate(ml,1):a.annotate(str(v),(i,v),textcoordsoffset points,xytext(0,8),hacenter,fontsize9,fontpropertiesfm.FontProperties(fnameFONT))a.set_xlabel(飞升轮次);a.set_ylabel(该轮最高关卡)a.set_title(f飞升多周目每轮恒定{inc:.1f}关有限多周目,fontsize13,weightbold)a.legend(fontsize9);a.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p2_02_飞升多周目.png,dpi110)plt.close(fig)# ── 3. 质变感对比 ──defexp_transcend():weak,_flywheel_cycles(1.10)strong,_flywheel_cycles(1.50)fig,aplt.subplots(figsize(8,4.4),dpi110)xsnp.arange(1,len(weak)1)a.plot(xs,weak,RED,lw2.4,markers,ms5,label弱飞升永久×1.10几乎白重开)a.plot(xs,strong,GREEN,lw2.4,markero,ms5,label强飞升永久×1.50明显质变)a.set_xlabel(飞升轮次);a.set_ylabel(该轮最高关卡)a.set_title(永久加成质变感飞升到底该加多少,fontsize13,weightbold)a.legend(fontsize9);a.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p2_03_飞升质变.png,dpi110)plt.close(fig)if__name____main__:exp_convergence();exp_cycles();exp_transcend()print(✅ 全部图表已保存至,OUT)六、总结与下期预告今天我们从三个维度拆穿了数值飞轮的两个调节阀维度结论一句话口诀产出收敛out_growth 必须≈R否则要么通胀要么卡死产出跟需求同速飞轮才不崩有限多周目飞升让每轮增益恒定ln(b)/ln®把无限增长变成有限循环每轮固定增量无限变有限质变感b≥1.35 才有再来一轮的理由b1.15 就是白重开加少了白重开加多了太短离线收益上限 衰减双保险保护在线玩家体验挂机不能碾压上线飞轮设计的终极检查清单产出增速 out_growth 与需求公比 R 的偏差是否 ≤±5%飞升乘区 b 是否在 1.35~1.55 之间每轮增量 ln(b)/ln® 是否 ≥ 2 关离线收益是否设有上限建议 8h和衰减建议最低 30%飞升是否伴随新内容/新目标解锁而非单纯重开四项全勾你的飞轮就不会崩。下一篇P5我会切换到系统策划线——拆穿「三层核心循环」短/中/长循环怎么设计才能让玩家每 30 秒都有事做以及如何用 Bartle 分类和心流理论给每个系统装上钩子。如果你正在纠结自己的飞升参数 b 该设多少欢迎评论区贴出你的 R 和期望每轮增量我帮你反推。