
本文是「放置游戏策划实战」系列第 3 篇。上一篇P2我们用 Python 跑了蒙特卡洛模拟来检测掉率、卡点和留存。在那篇的模拟器底层我用了一个关键设计玩家战力按指数成长——power P0 × m^day。这个公式背后藏着一个几乎所有放置类数值策划都会踩坑的命题战力公式到底是加法还是乘法这篇文章就把这个问题拆透——从原理到实验到 Excel 实操让你看完就能直接套进你的项目。目录一、加法模型 vs 乘法模型一次升级爽不爽二、独立乘区的核心公式与设计意图三、多乘区收敛性调一个乘区能移动卡点四、各乘区贡献占比每个系统各占一块蛋糕五、Excel 投放回收表搭建指南六、完整可运行脚本七、总结与下期预告一、加法模型 vs 乘法模型一次升级爽不爽问题你的装备升级给玩家加了1000 战力。第 1 关时玩家总战力只有 1000——这 1000 点战力相当于直接翻 1 倍爽爆了。到了第 30 关玩家总战力已经涨到 31000——这 1000 点战力只占总量的 3.2%玩家几乎感觉不到。这就是加法模型的致命缺陷# 加法模型每次升级固定 1000战力基础装备值技能值觉醒值……# 乘法模型每次升级 15%战力基础 ×(1装备%)×(1技能%)×(1觉醒%)× ……实验我模拟了两种模型在 0~30 关的成长轨迹同时记录每次升级的边际提升占当前战力的比例——这才是玩家实际感受到的爽感。结果对比项加法模型乘法模型第 1 关单次升级边际50.0%15%第 10 关单次升级边际9.1%15%第 30 关单次升级边际3.2%15%第 30 关总战力31,00066,212核心发现加法模型的边际占比呈指数级崩塌——从 50% 一路跌到 3.2%。这意味着前期每次升级感觉巨爽1000 在 1000 的基础上就是 100%但这是假象——你其实是在透支后期的体验空间。后期同样的 1000 升级变得毫无感知玩家觉得升了跟没升一样流失风险飙升。你没法修复它——如果为了让后期有感觉把 1000 改成 10000那前期就彻底崩了一上来就无敌如果前期降下来保持平衡后期又没得改。乘法模型的边际占比恒定本例中始终是 15%——不管你在第几关、总战力多少每一次升级都给你带来相同比例的成长感。这就是为什么所有成功的放置/挂机类游戏底层都是乘法结构。一句话记忆加法让升级越来越不值钱乘法让升级永远一样值钱。二、独立乘区的核心公式与设计意图上面说的乘法还不是完整版。真正能用的战力公式长这样战力 基础 × (1 装备加成%) × (1 技能加成%) × (1 觉醒加成%) × (1 活跃度加成%) × 暴击倍率 × 其它独立乘区……关键词是“独立乘区”——每个系统装备、技能、觉醒、活跃度等各自占一个独立的乘法因子互不干扰。为什么必须独立假设你把装备和技能混在一个乘区里×(1 装备% 技能%)——这就退化成了加法。两个系统互相抢同一个乘区的额度调任何一个都影响另一个后期根本没法精细控制。而独立之后每个系统的效果完全解耦操作影响提高装备掉率 → 玩家装备更好只影响「装备乘区」系数技能/觉醒不受影响加强某个技能的效果只影响「技能乘区」系数装备/觉醒不受影响新增一个「飞升」永久加成单独开一个新乘区旧系统零改动设计原则每个主要系统至少一个乘区——主线、装备、技能、觉醒、成就、活动各占一块。乘区之间不要嵌套——别搞×(1 装备% × (1 技能%))这种复合结构。错误示例假设装备系数 0.05、技能系数 0.03嵌套后技能的效果会被装备放大两个系统不再独立——改装备系数时技能也被迫跟着变调参时完全失控。暴击/暴伤这类概率触发可以放在最外层——因为它们本质上是条件乘数不影响基础乘区的独立性判断。新系统上线时优先开新乘区而不是往现有乘区里硬塞。三、多乘区收敛性调一个乘区能移动卡点问题P2 的模拟里我们发现多数玩家卡在第 10~18 关附近取决于日成长倍率 M。当时我们是通过调整全局成长速度 M 来解决的。但更精准的做法是找到具体哪个乘区出了问题单独调它。方法给四个独立乘区分别设一个随关卡线性成长的系数 k_i计算总战力 / 关卡需求的比值随关卡的变化# 参数与 P2 对齐P01000, 关卡公比 R1.08P0,REQ1,R1000,1000,1.08# 四个独立乘区的每关成长系数k_basenp.array([0.04,0.03,0.02,0.015])# 装备/技能/觉醒/暴击k_doublenp.array([0.08,0.03,0.02,0.015])# 仅把装备系数翻倍# 总战力 基础 × Π(1 k_i × 关卡数)deftotal_power(level,k):returnP0*np.prod(1np.outer(k,level),axis0)# 关卡需求 REQ1 × R^关卡简化等比模型不含 Boss 墙reqREQ1*R**level# 比值 1 → 能过比值 1 → 卡住ratiototal_power(level,k_base)/req结果方案卡点位置说明基准4 乘区均衡第 29 关当前配置下的自然卡点仅装备乘区翻倍第 48 关只动了一个乘区卡点后移 19 关图表解读这张图揭示了独立乘区最大的战术价值**蓝线基准**先上升后下降——前期乘区积累快于关卡需求玩家轻松推进后期关卡需求指数级 R^L追上并反超玩家开始卡住。比值跌破红线1的那一点就是卡点。**橙线装备翻倍**整体抬高——因为装备乘区的系数翻倍后总战力在整个生命周期都被放大了。卡点从第 29 关推到48 关整整后移 19 个关卡。关键洞察你不需要动其他任何参数——技能、觉醒、暴击三个乘区完全没碰只是单独把装备那个乘区的系数调了一倍整个卡点就移动了。和 P2 的呼应P2 里我们通过敏感性分析发现M 从 1.15 提到 1.207 天中位关卡从 11 涨到 17——这是全局粗调。本篇展示的是局部细调——当你知道问题出在装备系统时不用动全局成长速度只调装备乘区的 k_i 系数就够了。两者互补先用 P2 的方法定位玩家卡在哪、卡多久再用本篇的方法精确定位到具体乘区并修复。四、各乘区贡献占比每个系统各占一块蛋糕可视化验证为了直观看到独立乘区到底是什么样我把每个乘区对ln(总战力)的贡献画成了堆叠面积图结果以第 30 关为例乘区占 ln(总战力) 的比重含义装备35%最大的一块合理装备通常是主力养成线技能28%第二块和装备接近觉醒21%中期开放占比略低暴击16%概率型乘区稳定贡献设计启示没有哪个乘区独大或消失——这正是健康状态。如果某块占比 50%比如装备占了 70%说明其他系统太弱、沦为摆设如果某块 5%说明该系统对总战力几乎没有影响玩家不会去追求它。占比会随关卡推移缓慢变化——早期可能装备占比更高装备先解锁后期觉醒/飞升占比提升。这种权重转移本身就是一种长期目标感的设计手段。如果你想加强某个系统的存在感提高它的 k_i 系数即可它的色块会在图中变宽——直观且可控。五、Excel 投放回收表搭建指南代码模拟很强大但你日常调参更多用的是Excel。下面是一张最小可行的投放回收表模板可以直接复制到你自己的项目里表头设计列含义怎么填A系统名装备/技能/觉醒/成就/活动B每周期产出万战力/天从游戏内埋点统计或估算C每周期消耗万战力/天同上D投放回收比 B/C≥1 健康1 需调参E所属独立乘区写该系统对应的乘区名称F当前乘区系数该系统当前的 k 值与本文 Exp2 对应G评估自动标绿/红填表示例系统每周期产出万战力/天每周期消耗万战力/天回收比乘区评估主线推图120801.50基础✅ 健康装备系统60750.80装备(k0.04)⚠️ 偏紧技能系统40301.33技能(k0.03)✅ 健康觉醒系统15101.50觉醒(k0.02)✅ 健康活动运营30500.60活动 预警产出/消耗的单位是「万战力/天」——即玩家平均每天从该系统获得的战力增量万为单位方便阅读。你可以把它拖进 Excel 后加上公式自动着色D 列1标红、≥1标绿。每周更新一次数值跑一遍这张表比凭直觉调参靠谱太多。使用流程① 定期导出 TapTap 埋点 → 统计各系统真实产出/消耗 ② 填入 Excel → 自动算回收比 标色 ③ 回收比 1 的系统 → 回到本篇 Exp2调对应乘区的 k_i ④ 发版本 → 下一周再拉埋点 → 形成闭环这就是总纲里说的每一个版本都是一次数值实验的具体执行方式。六、完整可运行脚本保存为independent_zones.py一键生成全部 3 张实验图表# -*- coding: utf-8 -*-独立乘区实验器 —— 加法vs乘法 / 收敛性 / 贡献占比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/p3os.makedirs(OUT,exist_okTrue)# ═══════════════════════ 参数区 ══════════════════════P01000# 初始战力与 P2 对齐REQ11000# 第 1 关需求R1.08# 关卡公比每关 8%K_BASEnp.array([0.04,0.03,0.02,0.015])# 装备/技能/觉醒/暴击ZONES[装备,技能,觉醒,暴击]A_ADD1000# 加法模型每关固定增量G_MUL0.15# 乘法模型每关增长率LMAX60# ══════════════════════════════════════════════════════deftotal_power(lv,k):returnP0*np.prod(1np.outer(k,lv),axis0)# ── 实验 1加法 vs 乘法 ──defexp_add_vs_mul():lvnp.arange(LMAX//21)# 0-30 关paP0A_ADD*lv pmP0*(1G_MUL)**lv maA_ADD/pa*100# 边际占比mmnp.full_like(lv,G_MUL*100)fig,(a1,a2)plt.subplots(2,1,figsize(8,6.4),dpi110)a1.plot(lv,pa,color#DC2626,lw2.4,label加法模型 战力基础Σ固定值)a1.plot(lv,pm,color#4F46E5,lw2.4,label乘法模型 战力基础×Π(1%))a1.set_xlabel(关卡);a1.set_ylabel(战力)a1.set_title(战力成长加法 vs 乘法,fontsize13,weightbold)a1.legend(fontsize9);a1.grid(alpha.3)a2.plot(lv,ma,color#DC2626,lw2.4,label加法单次升级占比)a2.plot(lv,mm,color#4F46E5,lw2.4,label乘法单次升级占比恒定)a2.set_xlabel(关卡);a2.set_ylabel(边际提升占当前战力(%))a2.set_title(关键区别每次升级爽不爽,fontsize13,weightbold)a2.legend(fontsize9);a2.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p3_01_加法vs乘法.png,dpi110)plt.close(fig)# ── 实验 2收敛性与卡点 ──defexp_convergence():lvnp.arange(LMAX1)reqREQ1*R**lv k2K_BASE.copy();k2[0]*2# 仅装备翻倍r1total_power(lv,K_BASE)/req r2total_power(lv,k2)/reqdefstuck(r):alv[r1];return(a.max()1)iflen(a)else0s1,s2stuck(r1),stuck(r2)fig,axplt.subplots(figsize(8,4.4),dpi110)ax.plot(lv,r1,color#4F46E5,lw2.4,labelf基准卡点≈第{s1}关)ax.plot(lv,r2,color#F59E0B,lw2.4,labelf装备翻倍卡点≈第{s2}关)ax.axhline(y1,color#DC2626,ls--,lw1.6,label卡点线)ax.axvline(xs1,color#4F46E5,ls:,lw1.3,alpha.7)ax.axvline(xs2,color#F59E0B,ls:,lw1.3,alpha.7)ax.set_ylim(0,max(r1.max(),r2.max())*1.06)ax.set_xlabel(关卡);ax.set_ylabel(总战力 / 关卡需求)ax.set_title(多乘区收敛性比值1即卡点调一区移19关,fontsize13,weightbold)ax.legend(fontsize9);ax.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p3_02_多乘区收敛.png,dpi110)plt.close(fig)# ── 实验 3各乘区贡献占比 ──defexp_contribution():lvnp.arange(LMAX//21)# 0-30 关cnp.array([np.log(1ki*lv)forkiinK_BASE])fig,axplt.subplots(figsize(8,4.4),dpi110)ax.stackplot(lv,c,labelsZONES,colors[#4F46E5,#06B6D4,#16A34A,#F59E0B],alpha.85)ax.set_xlabel(关卡);ax.set_ylabel(对ln(总战力)的贡献)ax.set_title(独立乘区每个系统各占一块蛋糕,fontsize13,weightbold)ax.legend(locupper left,fontsize9);ax.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p3_03_乘区贡献.png,dpi110)plt.close(fig)if__name____main__:exp_add_vs_mul();exp_convergence();exp_contribution()print(✅ 全部图表已保存至,OUT)七、总结与下期预告今天我们从三个维度拆穿了独立乘区维度结论工具/方法加法 vs 乘法加法边际占比崩塌→后期无感乘法恒定→永远有劲双轴对比实验多乘区收敛性总战力/需求比值决定卡点调一个乘区就能移动卡点收敛性曲线各乘区贡献每个系统各占 ln(战力) 的一块无独大无消失堆叠面积图日常调参Excel 投放回收表 每周埋点闭环表格模板一句话记住独立乘区战力不是一堆东西加起来而是每个系统各管一个乘法因子——你调哪个哪个动其余不动。下一篇我会回到总纲的灵魂——数值飞轮深拆产出到底该怎么收敛才不会通胀飞升/转生的永久加成怎么设计才有质变感如果你有自己的战力公式想让我帮你分析是不是独立乘区结构欢迎评论区贴出来。