飞升/转生系统专题:转生曲线怎么画、过渡期怎么设计、数字膨胀怎么控制
本文是「放置游戏策划实战」系列第 6 篇回到数值线深挖飞升/转生——这是放置类游戏最核心、也最容易被做坏的系统。P2 里我们推导了每轮增量 ln(b)/ln®这个公式知道飞升乘区 b 决定了多周目节奏。P5 里我们把它定位为长循环的核心钩子。今天这篇要把飞升系统从概念拆到可执行转生奖励曲线的数学形态、过渡期的体验设计、以及三种数字膨胀控制策略。目录一、飞升奖励曲线为什么必须是凹函数二、α 参数选择从 0.3 到 0.7 的调参区间三、过渡期体验重开到底有多痛四、数字膨胀控制三种策略与优劣五、最佳飞升时机什么时候该按按钮六、完整可运行脚本七、总结与下期预告一、飞升奖励曲线为什么必须是凹函数问题玩家决定飞升时你根据他本轮累计获得的总资源量来计算给他多少永久加成。这个映射关系就是飞升奖励曲线。最常见的错误是写成线性关系# ❌ 线性奖励 —— 会导致增长失控permanent_bonusbase_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 倍。这让后期的膨胀速度大幅放缓配合飞升重置就能把数字控制在可读范围内。实验取K1、首飞门槛E010万三条曲线在首飞点earnedE0都恰好给出bonus2x然后看累计资源从 1 千到 1 万亿时各自的走势结果曲线类型α累计 1,000 时累计 10 万首飞累计 1 亿时累计 1 万亿时线性1.01.0×2×1,001×10,000,001×← 失控凹函数推荐0.51.1×2×33×3,163×← ✅ 可控过平0.31.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 的调参区间不同 α 的实际影响K1E010万α首飞加成累计 1 亿时累计 1 万亿时适用场景0.352×9×127×休闲向、节奏偏慢0.452×22×1,414×偏保守0.502×33×3,163×推荐区间0.552×48×7,081×重度养成、硬核≥0.702×251×251,189×⚠️ 后期必崩怎么选你的 α两个步骤定首飞门槛和加成E0 你期望的首飞累计资源量如 10 万K 首飞时的加成幅度建议取 1即首飞bonus2x这样所有 α 在首飞点给出相同的 2x方便横向对比检查长期上限假设玩家最终能累计到1e12查上表对应 α 的 bonus如果 10,000x说明 α 偏大后期数字会失控推荐 α0.50 时1e12 对应 3,163x——配合飞升重置单轮数字仍可控和 P2 的 b 参数配合飞升后的永久乘区bP2 讲的每轮增量和这里的bonus_multiplier是两个不同层面的东西b 飞升操作本身给的基础战力乘区如 ×1.5bonus_multiplier 飞升时根据累计进度额外给的乘区加成来自本篇公式两者相乘才是总效果总永久加成 b^c × bonus_multiplier_c建议先定 b1.35~1.55再微调 α 来控制长期上限三、过渡期体验重开到底有多痛问题飞升的本质是重置当前进度换取永久加成。那问题来了重开后玩家需要多久才能追回来如果追回来的时间太短比如 5 分钟→ 飞升没有成本感 → 玩家疯狂刷飞升 → 失去意义如果追回来的时间太长比如跟第一次一样久→ 每次都像从头开始 → 白重开感P2 讲过弱飞升的问题实验我模拟了两种飞升强度下从零推回第 20 关所需的天数随轮次的变化结果飞升强度第 1 轮首飞第 3 轮第 5 轮第 7 轮过渡期缩短比例强飞升 ×1.508.5 天6.5 天4.5 天2.5 天缩短 71%弱飞升 ×1.108.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 金币飞升后因 b1.5下一轮每小时产出提升 50%因为战力更高→打怪更快→产出更多但飞升后需要 3 天过渡期才能恢复到当前关卡水平决策如果不飞升接下来 3 天产出 100 × 24 × 3 7,200 金币如果飞升过渡期 3 天内产出较低假设平均 30/h30 × 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# ── 跨平台中文字体 ──_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/p6os.makedirs(OUT,exist_okTrue)P0,REQ0,R,M10,12,1.15,1.5deflevel_req(n):returnREQ0*(R**n)*(1.6ifn%100else1.0)deffp(s,bFalse):returnfm.FontProperties(fnameFONT,sizes,weightboldifbelsenormal)# ── 1. 奖励曲线归一化公式──defreward():earnednp.logspace(3,12,200)E0,K1e5,1.0fig,aplt.subplots(figsize(8,4.6),dpi110)cases[(1.0,#DC2626,线性 α1膨胀失控),(0.5,#16A34A,凹函数 α0.5推荐),(0.3,#4F46E5,过平 α0.3激励弱),]foralpha,col,labincases:a.plot(earned,1K*(earned/E0)**alpha,colorcol,lw2.4,labellab)a.set_xscale(log);a.set_yscale(log)a.set_xlabel(飞升前累计获得资源对数轴)a.set_ylabel(飞升获得的永久乘区对数轴)a.set_title(飞升奖励曲线斜率α必须1否则膨胀失控,fontsize13,weightbold,fontpropertiesfp(13,True))a.legend(fontsize9);a.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p6_01_奖励曲线.png,dpi110)plt.close(fig)# ── 2. 过渡期 ──deftransition():deftt(tgt,cyc,b):returnmax(np.log(level_req(tgt)/(P0*b**cyc))/np.log(M),0)cnp.arange(0,8)ts[tt(20,x,1.5)forxinc]tw[tt(20,x,1.10)forxinc]fig,aplt.subplots(figsize(8,4.4),dpi110)a.plot(c,ts,color#16A34A,lw2.6,markero,ms6,label强飞升×1.50)a.plot(c,tw,color#DC2626,lw2.6,markers,ms6,label弱飞升×1.10)fori,vinzip(c,ts):a.annotate(f{v:.1f}d,(i,v),textcoordsoffset points,xytext(0,9),hacenter,fontsize9,fontpropertiesfp(9))a.set_xlabel(飞升轮次)a.set_ylabel(重开推到第20关所需天数)a.set_title(过渡期体验强飞升让重开越来越轻松,fontsize13,weightbold,fontpropertiesfp(13,True))a.legend(fontsize9);a.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p6_02_过渡期.png,dpi110)plt.close(fig)# ── 3. 膨胀控制 ──definflation():cnp.arange(0,101)pcM**7ncP0*(pc**c)rpnp.full_like(c,P0*pc,dtypefloat)fig,aplt.subplots(figsize(8,4.4),dpi110)a.plot(c,nc,color#DC2626,lw2.4,label无飞升重置数字爆炸)a.plot(c,rp,color#16A34A,lw2.4,label飞升重置单轮峰值有界)a.set_yscale(log);a.set_ylim(1,1e30)a.set_xlabel(飞升轮次)a.set_ylabel(单轮峰值战力对数轴)a.set_title(膨胀控制飞升重置让数字有界无控制则溢出,fontsize13,weightbold,fontpropertiesfp(13,True))a.legend(fontsize9,locupper left);a.grid(alpha.3)fig.tight_layout()fig.savefig(f{OUT}/p6_03_膨胀控制.png,dpi110)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 与付费漏斗。这是独立开发者相对大厂最大的灵活优势“当天拉数据当天改”。如果你正在纠结自己游戏里飞升系统的 α 该设多少欢迎评论区贴出你的目标首飞门槛和期望加成我帮你反推。