本文是「放置游戏策划实战」系列第 6 篇,回到数值线深挖飞升/转生——这是放置类游戏最核心、也最容易被做坏的系统。
P2 里我们推导了"每轮增量 = ln(b)/ln®"这个公式,知道飞升乘区 b 决定了多周目节奏。P5 里我们把它定位为长循环的核心钩子。今天这篇要把飞升系统从"概念"拆到"可执行":转生奖励曲线的数学形态、过渡期的体验设计、以及三种数字膨胀控制策略。
目录
- 一、飞升奖励曲线:为什么必须是凹函数
- 二、α 参数选择:从 0.3 到 0.7 的调参区间
- 三、过渡期体验:重开到底有多痛?
- 四、数字膨胀控制:三种策略与优劣
- 五、最佳飞升时机:什么时候该按按钮?
- 六、完整可运行脚本
- 七、总结与下期预告
一、飞升奖励曲线:为什么必须是凹函数
问题
玩家决定飞升时,你根据他"本轮累计获得的总资源量"来计算给他多少永久加成。这个映射关系就是飞升奖励曲线。
最常见的错误是写成线性关系:
# ❌ 线性奖励 —— 会导致增长失控permanent_bonus=base_bonus ×(total_earned/threshold)看起来很合理——资源越多奖励越多。但问题是:如果奖励和资源成正比,那么随着游戏进行,每次飞升获得的加成会与累计资源同步放大,后期数值迅速膨胀到玩家无法感知差异。
数学模型
更通用的形式(以首次飞升门槛E0归一化):
bonus_multiplier = 1 + K × (earned / E0) ^ α其中α(alpha)决定了曲线的凹凸性,K是首飞时的加成幅度。三条曲线共用同一个K,这样α就是唯一的形状变量,方便对比:
- α = 1 → 线性:奖励正比于资源 → 增长无上限
- α < 1 → 凹函数:边际递减 → 增长减速(但仍趋于无穷,只是慢得多)
- α > 1 → 凸函数:边际递增 → 更快失控(基本不会用)
澄清一个常见误解:凹函数(α<1)并不能让增长"有界"——
earned^0.5在 earned→∞ 时依然趋向无穷。它的真正作用是边际递减:资源翻倍时奖励只增长2^α倍(α=0.5 时约 1.41 倍),远小于线性的 2 倍。这让后期的膨胀速度大幅放缓,配合飞升重置就能把数字控制在可读范围内。
实验
取K=1、首飞门槛E0=10万,三条曲线在首飞点(earned=E0)都恰好给出bonus=2x,然后看累计资源从 1 千到 1 万亿时各自的走势:
结果
| 曲线类型 | α | 累计 1,000 时 | 累计 10 万(首飞) | 累计 1 亿时 | 累计 1 万亿时 |
|---|---|---|---|---|---|
| 线性 | 1.0 | 1.0× | 2× | 1,001× | 10,000,001×← 💥 失控 |
| 凹函数(推荐) | 0.5 | 1.1× | 2× | 33× | 3,163×← ✅ 可控 |
| 过平 | 0.3 | 1.3× | 2× | 9× | 127×← ⚠️ 激励太弱 |
核心发现(log-log 图的直观解读)
在双对数坐标上,每条线的斜率就等于 α:
- 红线(α=1)斜率 45°——直线上升,意味着累计资源每增长 10 倍,奖励也增长 10 倍。到了后期(1e12),一次飞升直接给千万倍加成——这会让后续所有数值彻底崩掉。
- 绿线(α=0.5)斜率约 26°——平缓得多。累计资源增长 1 万倍(1e8→1e12),奖励只增长约 100 倍(33→3163)。边际递减让长期膨胀速度大幅放缓。
- 蓝线(α=0.3)斜率最平——虽然绝对安全,但激励太弱。玩家跑了很久才给 127 倍加成,会觉得"不值得飞升"。
黄金法则:α 取值应在 0.45 ~ 0.55 区间。太高(>0.7)后期膨胀失控;太低(<0.35)前期激励不足导致没人愿意飞升。
二、α 参数选择:从 0.3 到 0.7 的调参区间
不同 α 的实际影响(K=1,E0=10万)
| α | 首飞加成 | 累计 1 亿时 | 累计 1 万亿时 | 适用场景 |
|---|---|---|---|---|
| 0.35 | 2× | 9× | 127× | 休闲向、节奏偏慢 |
| 0.45 | 2× | 22× | 1,414× | 偏保守 |
| 0.50 | 2× | 33× | 3,163× | 推荐区间 |
| 0.55 | 2× | 48× | 7,081× | 重度养成、硬核 |
| ≥0.70 | 2× | 251× | 251,189× | ⚠️ 后期必崩 |
怎么选你的 α?
两个步骤:
定首飞门槛和加成:
E0= 你期望的首飞累计资源量(如 10 万)K= 首飞时的加成幅度(建议取 1,即首飞bonus=2x)- 这样所有 α 在首飞点给出相同的 2x,方便横向对比
检查长期上限:
- 假设玩家最终能累计到
1e12,查上表对应 α 的 bonus - 如果 > 10,000x,说明 α 偏大,后期数字会失控
- 推荐 α=0.50 时,1e12 对应 3,163x——配合飞升重置,单轮数字仍可控
- 假设玩家最终能累计到
和 P2 的 b 参数配合:飞升后的永久乘区
b(P2 讲的"每轮增量")和这里的bonus_multiplier是两个不同层面的东西:
b= 飞升操作本身给的基础战力乘区(如 ×1.5)bonus_multiplier= 飞升时根据累计进度额外给的乘区加成(来自本篇公式)- 两者相乘才是总效果:
总永久加成 = b^c × bonus_multiplier_c- 建议先定 b(1.35~1.55),再微调 α 来控制长期上限
三、过渡期体验:重开到底有多痛?
问题
飞升的本质是重置当前进度换取永久加成。那问题来了:重开后,玩家需要多久才能"追回来"?
如果追回来的时间太短(比如 5 分钟)→ 飞升没有成本感 → 玩家疯狂刷飞升 → 失去意义
如果追回来的时间太长(比如跟第一次一样久)→ 每次都像从头开始 → "白重开"感(P2 讲过弱飞升的问题)
实验
我模拟了两种飞升强度下,从零推回第 20 关所需的天数随轮次的变化:
结果
| 飞升强度 | 第 1 轮(首飞) | 第 3 轮 | 第 5 轮 | 第 7 轮 | 过渡期缩短比例 |
|---|---|---|---|---|---|
| 强飞升 ×1.50 | 8.5 天 | 6.5 天 | 4.5 天 | 2.5 天 | 缩短 71% |
| 弱飞升 ×1.10 | 8.5 天 | 8.0 天 | 7.6 天 | 7.1 天 | 仅缩短 17% |
解读
- 强飞升(×1.50):第 5 轮只需要 4.5 天就能回到第 20 关——比首轮快了将近一半。随着轮次增加,过渡期持续缩短,玩家从"重新爬坡"逐渐变成"碾压旧关卡"的快感。这正是 P2 说的"质变感"的具体体现。
- 弱飞升(×1.10):第 5 轮还需要 7.6 天——和首轮几乎没有区别。玩家每次飞升都要重新经历一遍完整的"爬坡",体验极其糟糕。
过渡期设计的实操建议
理想过渡期长度 = 首轮时间的 30%~60%。
即:如果玩家第一次从 1 关推到 20 关花了 8 天,飞升后应该能在 2.5~5 天内回到同一位置。
实现手段(按优先级排序):
- 调整飞升乘区 b(最直接)——b 从 1.1 提到 1.5 就能把第 5 轮过渡期从 7.6 天压到 4.5 天
- 飞升保留部分非核心进度——例如保留已解锁的装备槽位或技能树节点(只重置等级/数值),减少"完全归零"的挫败感
- 飞升后给予临时 buff——前 24 小时内攻击力翻倍之类的"起飞助推器",帮玩家快速度过早期关卡
- 解锁新内容作为补偿——飞升后立刻开放一个之前没有的新系统(如新职业/新地图),让"失去的"被"新获得的"覆盖
四、数字膨胀控制:三种策略与优劣
问题
即使有了飞升重置,数字仍然会在多周目的累积中越来越大(因为b^c在增长)。加上单轮内的战力成长(挂机产出→升级→推图),显示出来的数字迟早会变成1.23e308这种天文数字。
三种策略
策略 A:无控制(❌ 绝对不要这样做)
不做任何处理,让数字自然增长。结果如红线所示:第 20 轮左右峰值战力就已经突破 10^25。这带来三个致命后果:
- 浮点溢出:JavaScript 的
Number.MAX_SAFE_INTEGER是2^53 ≈ 9e15,超过这个数精度丢失;Python 的 float64 上限约1.8e308,再大就是inf - 玩家麻木:看到
1.2e25和看到1.5e25没有任何区别——数字失去了参照意义 - 存储/传输开销:大数字序列化后体积更大,对移动端性能不利
策略 B:飞升重置(✅ 根本解决方案)
每次飞升时清空当前进度,只保留永久加成(b^c)。结果如绿线所示:单轮峰值战力恒定在有界范围内(本例中约为 171)。
关键点:飞升重置解决的是"单轮内"的数字爆炸——每一轮的数字都在可控范围(比如 10~200),只有跨轮的永久加成在缓慢增长(而那个增长已经被 P2 的公式约束为有限多周目)。
策略 C:对数压缩 / 科学计数法(⚠️ 辅助方案)
不改变底层值,只改变显示方式:
1,234 → 1.2K 123,456 → 123.5K 1,234,567 → 1.2M 1,234,567,890→ 1.2B > 10^15 → AA / AB / AC ... (沿用 Cookie Clicker 的 AA 表示法) > 10^308 → e308 格式优点:实现简单,一行代码就能搞定。
缺点:只治标不治本——底层数字仍在膨胀,溢出风险依然存在。必须配合策略 B 使用。
推荐组合
主方案:飞升重置(B)—— 单轮数字有界 辅助方案:对数显示(C)—— 即使单轮内数字较大也保持可读 兜底方案:BigNumber 库 —— 如果用了 JS,引入 decimal.js / break_eternity.js 防溢出五、最佳飞升时机:什么时候该按按钮?
这是每个飞升类游戏玩家都会问的问题:“我现在该不该飞升?” 作为策划,你需要确保答案是明确的、可计算的,而不是模糊的"感觉差不多就行"。
最优飞升条件
当满足以下不等式时,飞升的净收益 > 继续玩的收益:
(b^1 - 1) × 当前总产出 > (继续玩 Δt 时间的新增量) × 未来 N 轮复利简化版实用规则(不需要精确计算也能用):
当"本次飞升获得的永久加成带来的额外产出" ≥ "再玩一轮当前关卡的预计产出"时,就该飞升了。
具体例子
假设你的飞升参数:
b = 1.50(每次飞升基础战力 ×1.5)- 当前每小时产出 = 100 金币
- 飞升后因 b=1.5,下一轮每小时产出提升 50%(因为战力更高→打怪更快→产出更多)
- 但飞升后需要 3 天过渡期才能恢复到当前关卡水平
决策:
- 如果不飞升,接下来 3 天产出 =
100 × 24 × 3 = 7,200 金币 - 如果飞升,过渡期 3 天内产出较低(假设平均 30/h)=
30 × 24 × 3 = 2,160,但之后每小时变成 150 - 飞升后**需要
(7200 - 2160) / (150 - 100) = 100.8 小时 ≈ 4.2 天**就能追回损失 - 之后每多一天都是纯赚(50 vs 0 的差价)
结论:只要你还打算继续玩超过一周,现在飞升就是正收益。
给玩家的 UI 提示
不要让玩家自己算。在飞升按钮旁边加一行提示:
💡 建议:本次飞升可获得 +50% 永久产出加成, 预计 X 天后追平当前进度,之后每天多赚 Y 金币。 [立即飞升] [稍后再说]把复杂的数学隐藏在友好的文案后面——这就是好的 UX。
六、完整可运行脚本
保存为ascend_system.py,一键生成全部 3 张实验图表:
# -*- coding: utf-8 -*-"""飞升/转生系统实验器 —— 奖励曲线 / 过渡期 / 膨胀控制"""importnumpyasnpimportmatplotlib matplotlib.use("Agg")importmatplotlib.pyplotaspltfrommatplotlibimportfont_managerasfmimportos,platform# ── 跨平台中文字体 ──_sys=platform.system()if_sys=="Darwin":FONT="/System/Library/Fonts/STHeiti Medium.ttc"elif_sys=="Windows":FONT="C:/Windows/Fonts/msyh.ttc"else:FONT="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"fm.fontManager.addfont(FONT)plt.rcParams["font.family"]=fm.FontProperties(fname=FONT).get_name()plt.rcParams["axes.unicode_minus"]=FalseOUT="./csdn_images/p6"os.makedirs(OUT,exist_ok=True)P0,REQ0,R,M=10,12,1.15,1.5deflevel_req(n):returnREQ0*(R**n)*(1.6ifn%10==0else1.0)deffp(s,b=False):returnfm.FontProperties(fname=FONT,size=s,weight="bold"ifbelse"normal")# ── 1. 奖励曲线(归一化公式)──defreward():earned=np.logspace(3,12,200)E0,K=1e5,1.0fig,a=plt.subplots(figsize=(8,4.6),dpi=110)cases=[(1.0,"#DC2626","线性 α=1(膨胀失控)"),(0.5,"#16A34A","凹函数 α=0.5(推荐)"),(0.3,"#4F46E5","过平 α=0.3(激励弱)"),]foralpha,col,labincases:a.plot(earned,1+K*(earned/E0)**alpha,color=col,lw=2.4,label=lab)a.set_xscale("log");a.set_yscale("log")a.set_xlabel("飞升前累计获得资源(对数轴)")a.set_ylabel("飞升获得的永久乘区(对数轴)")a.set_title("飞升奖励曲线:斜率α必须<1否则膨胀失控",fontsize=13,weight="bold",fontproperties=fp(13,True))a.legend(fontsize=9);a.grid(alpha=.3)fig.tight_layout()fig.savefig(f"{OUT}/p6_01_奖励曲线.png",dpi=110)plt.close(fig)# ── 2. 过渡期 ──deftransition():deftt(tgt,cyc,b):returnmax(np.log(level_req(tgt)/(P0*b**cyc))/np.log(M),0)c=np.arange(0,8)ts=[tt(20,x,1.5)forxinc]tw=[tt(20,x,1.10)forxinc]fig,a=plt.subplots(figsize=(8,4.4),dpi=110)a.plot(c,ts,color="#16A34A",lw=2.6,marker="o",ms=6,label="强飞升×1.50")a.plot(c,tw,color="#DC2626",lw=2.6,marker="s",ms=6,label="弱飞升×1.10")fori,vinzip(c,ts):a.annotate(f"{v:.1f}d",(i,v),textcoords="offset points",xytext=(0,9),ha="center",fontsize=9,fontproperties=fp(9))a.set_xlabel("飞升轮次")a.set_ylabel("重开推到第20关所需天数")a.set_title("过渡期体验:强飞升让'重开'越来越轻松",fontsize=13,weight="bold",fontproperties=fp(13,True))a.legend(fontsize=9);a.grid(alpha=.3)fig.tight_layout()fig.savefig(f"{OUT}/p6_02_过渡期.png",dpi=110)plt.close(fig)# ── 3. 膨胀控制 ──definflation():c=np.arange(0,101)pc=M**7nc=P0*(pc**c)rp=np.full_like(c,P0*pc,dtype=float)fig,a=plt.subplots(figsize=(8,4.4),dpi=110)a.plot(c,nc,color="#DC2626",lw=2.4,label="无飞升重置(数字爆炸)")a.plot(c,rp,color="#16A34A",lw=2.4,label="飞升重置(单轮峰值有界)")a.set_yscale("log");a.set_ylim(1,1e30)a.set_xlabel("飞升轮次")a.set_ylabel("单轮峰值战力(对数轴)")a.set_title("膨胀控制:飞升重置让数字有界,无控制则溢出",fontsize=13,weight="bold",fontproperties=fp(13,True))a.legend(fontsize=9,loc="upper left");a.grid(alpha=.3)fig.tight_layout()fig.savefig(f"{OUT}/p6_03_膨胀控制.png",dpi=110)plt.close(fig)if__name__=="__main__":reward();transition();inflation()print("✅ 全部图表已保存至",OUT)七、总结与下期预告
飞升/转生系统是放置游戏的命门。今天我们从四个维度把它拆透:
| 维度 | 结论 | 口诀 |
|---|---|---|
| 奖励曲线 | 必须用凹函数(α<1),推荐 α=0.48~0.55 | 斜率 < 1,膨胀放缓 |
| α 参数 | 首飞 2x 加成,累计 1 万亿时控制在数千倍 | 前期够甜,后期有顶 |
| 过渡期 | 强飞升让重开时间逐轮递减 | 越飞越轻松,不是白重开 |
| 膨胀控制 | 主方案飞升重置 + 辅助对数显示 + BigNumber 兜底 | 单轮有界,全局可控 |
| 最佳时机 | 追平时间 ≤ 7 天就值得飞 | 别让玩家自己猜,告诉他答案 |
飞升系统终极检查清单:
- 奖励曲线是凹函数吗?(α < 0.70?)
- 飞升乘区 b 在 1.35~1.55 吗?
- 过渡期能缩到首轮的 60% 以内吗?
- 单轮峰值数字是否被重置控制在有界范围?
- 大数字是否有对数显示方案?
- 是否给了玩家明确的"该不该飞升"提示?
下一篇(P7)我会切到数据驱动实战——如何接 TapTap 埋点、反推卡点、分析 LTV 与付费漏斗。这是独立开发者相对大厂最大的灵活优势:“当天拉数据当天改”。如果你正在纠结自己游戏里飞升系统的 α 该设多少,欢迎评论区贴出你的目标首飞门槛和期望加成,我帮你反推。