numeric_planner_tutorial

第1章:战斗数值系统

战斗系统是游戏的核心玩法载体,而战斗数值则是这个系统的灵魂。从最简单的”石头剪刀布”到复杂的MMORPG战斗,背后都有一套精密的数学模型在支撑。本章将深入探讨战斗数值系统的设计原理,从基础伤害公式到概率机制,从属性体系到技能平衡,帮助你建立完整的战斗数值设计方法论。

学习目标

完成本章学习后,你将能够:

  1. 设计并评估不同类型的伤害公式,理解加法与乘法模型的优劣
  2. 构建平衡的属性体系和克制关系,创造深度战斗策略
  3. 合理运用概率机制增加战斗的随机性和趣味性
  4. 设计技能系统和资源循环,控制战斗节奏
  5. 识别并避免常见的数值设计陷阱

1.1 基础伤害公式设计

1.1.1 加法模型 vs 乘法模型

伤害计算是战斗系统的基石。最基础的伤害公式可以表示为:

\[\text{Damage} = f(\text{ATK}, \text{DEF})\]

其中,$f$是我们需要设计的函数。两种最常见的模型是:

加法模型(减法模型): \(\text{Damage} = \text{ATK} - \text{DEF}\)

这是最直观的模型,防御力直接减少受到的伤害。这种模型的特点是:

为了避免负伤害,通常会加入最小伤害保护: \(\text{Damage} = \max(\text{ATK} - \text{DEF}, \text{MinDamage})\)

其中$\text{MinDamage}$通常设为1或者$\text{ATK} \times 0.1$。

乘法模型(除法模型): \(\text{Damage} = \text{ATK} \times \frac{100}{100 + \text{DEF}}\)

这种模型中,防御力提供百分比减伤。特点包括:

我们可以用ASCII图来展示两种模型的差异:

加法模型的伤害曲线(ATK=100):
Damage
100 |*
 80 | *
 60 |  *
 40 |   *
 20 |    *
  0 |_____*************___
    0  20  40  60  80  100  120  DEF

乘法模型的伤害曲线(ATK=100):
Damage
100 |*
 80 | **
 60 |   ***
 40 |      ****
 20 |          *******
  0 |________________*****___
    0   50   100   150   200  DEF

1.1.2 混合模型与高级公式

实际游戏中,往往使用更复杂的混合模型:

《英雄联盟》的护甲公式: \(\text{DamageMultiplier} = \begin{cases} \frac{100}{100 + \text{Armor}} & \text{if Armor} \geq 0 \\ 2 - \frac{100}{100 - \text{Armor}} & \text{if Armor} < 0 \end{cases}\)

这个公式巧妙地处理了负护甲(护甲穿透)的情况,使其产生递增伤害而非无限伤害。

《魔兽世界》的护甲公式: \(\text{DamageReduction} = \frac{\text{Armor}}{\text{Armor} + K \times \text{AttackerLevel}}\)

其中$K$是一个常数(通常在400-500之间),这个公式考虑了攻击者等级,使得护甲的效果会随着敌人等级提升而降低。

1.1.3 伤害浮动与随机性

为了避免战斗过于机械,通常会给伤害加入一定的浮动范围:

\[\text{FinalDamage} = \text{BaseDamage} \times \text{Random}(0.9, 1.1)\]

这个±10%的浮动是许多游戏的默认选择,既保证了一定的随机性,又不会让玩家感觉失控。

1.1.4 收益递减的数学实现

收益递减是数值设计中的重要概念,可以避免单一属性的过度堆叠。常用的收益递减函数包括:

对数函数: \(\text{Effect} = a \times \ln(1 + b \times \text{Stat})\)

双曲线函数: \(\text{Effect} = \frac{a \times \text{Stat}}{b + \text{Stat}}\)

平方根函数: \(\text{Effect} = a \times \sqrt{\text{Stat}}\)

这些函数都具有导数递减的特性,即每增加相同的属性点数,获得的收益会越来越少。

1.2 属性体系与克制关系

1.2.1 基础属性设计

一个完整的属性体系通常包含以下几类:

核心属性(Primary Attributes):

次级属性(Secondary Attributes): 这些属性通常由核心属性派生或独立存在:

属性之间的关系可以用矩阵表示:

属性影响矩阵:
        伤害  生存  节奏  策略
ATK      ◆     ·     ·     ◇
DEF      ·     ◆     ·     ◇
SPD      ◇     ◇     ◆     ◇
CRIT     ◆     ·     ◇     ◆

◆ 强相关  ◇ 中等相关  · 弱相关

1.2.2 属性克制系统

克制系统是创造战斗深度的重要工具。最经典的是”石头剪刀布”模型:

简单克制环:
   火 → 风 → 土 → 水 → 火
   (1.5x伤害)

复杂克制网:
        火   水   风   土   光   暗
火      1.0  0.5  1.5  1.0  1.0  1.0
水      1.5  1.0  0.5  1.0  1.0  1.0  
风      0.5  1.5  1.0  1.0  1.0  1.0
土      1.0  1.0  1.0  1.0  1.0  1.0
光      1.0  1.0  1.0  1.0  1.0  1.5
暗      1.0  1.0  1.0  1.0  1.5  1.0

克制系统的设计原则:

  1. 平衡性:每个属性都应有克制和被克制的对象
  2. 可记忆性:克制关系应符合直觉或有内在逻辑
  3. 战略深度:玩家需要根据敌人属性调整队伍配置
  4. 避免绝对优势:不应存在全面优于其他属性的”最强属性”

1.2.3 属性成长曲线

角色属性随等级的成长通常遵循以下模式:

线性成长: \(\text{Stat}_{\text{level}} = \text{Base} + \text{Growth} \times \text{Level}\)

多项式成长: \(\text{Stat}_{\text{level}} = \text{Base} + a \times \text{Level} + b \times \text{Level}^2\)

指数成长: \(\text{Stat}_{\text{level}} = \text{Base} \times (1 + \text{GrowthRate})^{\text{Level}}\)

不同的成长模式会导致不同的游戏体验:

属性成长对比(Level 1-100):
      Linear  Polynomial  Exponential
L1    100     100         100
L25   600     750         943  
L50   1100    2000        3759
L75   1600    3750        8447
L100  2100    6000        13780

成长差异 = 21x    60x       137x

1.2.4 属性权重与战力评分

战力(Combat Power)是对角色综合实力的量化评估。一个简单的战力公式:

\[\text{CP} = w_1 \times \text{ATK} + w_2 \times \text{DEF} + w_3 \times \text{HP} + w_4 \times \text{SPD}\]

其中权重$w_i$的确定需要考虑:

  1. 属性在实际战斗中的重要性
  2. 属性的获取难度
  3. 属性之间的协同效应

更精确的战力计算会考虑属性的非线性效果:

\[\text{CP} = \sqrt{\text{ATK} \times \text{HP}} + \text{DEF} \times 0.8 + \text{CritScore}\]

其中: \(\text{CritScore} = \text{CritRate} \times (1 + \text{CritDMG})\)

1.3 概率机制设计

1.3.1 暴击系统

暴击是最常见的概率机制,基本公式为:

\[\text{ExpectedDamage} = \text{BaseDamage} \times [1 + \text{CritRate} \times (\text{CritMultiplier} - 1)]\]

例如,50%暴击率和200%暴击伤害的期望伤害为: \(\text{ExpectedDamage} = \text{BaseDamage} \times [1 + 0.5 \times (2 - 1)] = 1.5 \times \text{BaseDamage}\)

暴击系统的设计要点:

  1. 上限设置:通常暴击率上限为100%,暴击伤害上限为300-500%
  2. 收益平衡:暴击率和暴击伤害的收益应该平衡
  3. 反暴击机制:如韧性、暴击抵抗等

1.3.2 真随机 vs 伪随机

真随机(True Random): 每次判定都是独立的,符合概率论:

30%暴击率的实际分布:
连续10次不暴击概率 = 0.7^10 = 2.8%
连续5次暴击概率 = 0.3^5 = 0.24%

伪随机(Pseudo Random): 通过算法调整,使实际结果更接近期望值:

PRD(Pseudo Random Distribution)算法:
初始概率 C = 0.08474(对应30%期望)
每次未触发,下次概率 += C
触发后重置为C

实际触发序列:
次数:  1     2     3     4     5
概率: 8.5%  16.9% 25.4% 33.9% 42.4%

PRD的优点:

1.3.3 闪避与命中系统

闪避系统通常有两种实现方式:

独立判定: \(\text{HitChance} = \text{Accuracy} - \text{Evasion}\)

乘法判定: \(\text{HitChance} = \text{Accuracy} \times (1 - \text{Evasion})\)

两种方式的区别:

例:90%命中 vs 20%闪避
独立判定:命中率 = 90% - 20% = 70%
乘法判定:命中率 = 90% × (1 - 20%) = 72%

1.3.4 概率上的常见误区

赌徒谬误: 玩家常认为”已经5次没暴击了,下次一定会暴击”。实际上在真随机系统中,每次判定都是独立的。

小数定律: 玩家会从少量样本中得出错误结论。比如”我测试了10次,暴击了6次,所以暴击率是60%”(实际可能是30%)。

为了改善玩家体验,可以采用:

  1. 保底机制:连续N次未触发后,第N+1次必定触发
  2. 概率修正:动态调整概率,使短期内更接近期望值
  3. 视觉反馈:用进度条或其他方式暗示下次触发的可能性

1.4 技能系统与资源平衡

1.4.1 技能冷却时间设计

技能冷却(Cooldown, CD)是控制战斗节奏的核心机制。设计原则:

\[\text{CD} = \frac{\text{SkillPower}}{\text{DesiredFrequency}} \times \text{BalanceFactor}\]

技能分类与典型CD:

CD缩减的计算方式:

加法叠加(容易失衡): \(\text{FinalCD} = \text{BaseCD} - \text{CDR}_1 - \text{CDR}_2 - ...\)

乘法叠加(推荐): \(\text{FinalCD} = \text{BaseCD} \times (1 - \text{CDR}_1) \times (1 - \text{CDR}_2) \times ...\)

混合模式(更精细的控制): \(\text{FinalCD} = \text{BaseCD} \times \max(0.4, 1 - \text{TotalCDR})\)

这确保了CD不会低于原始值的40%。

1.4.2 资源系统设计

资源系统决定了技能的使用策略。常见类型:

法力值(Mana)系统:

\[\text{ManaRegen} = \text{Base} + \text{Level} \times 2 + \text{Spirit} \times 0.5\]

能量(Energy)系统:

\[\text{EnergyRegen} = 10 + \text{AttackSpeed} \times 2 \text{ per second}\]

怒气(Rage)系统:

\[\text{RageGain} = \frac{\text{Damage} \times 10}{\text{MaxHP}} + \text{BonusRage}\]

连击点(Combo Points)系统:

连击系统流程:
建立(Builder) → 积累点数 → 终结(Finisher) → 消耗点数
     ↑                                    ↓
     ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←

1.4.3 技能伤害系数

技能伤害通常基于角色属性和技能系数:

\[\text{SkillDamage} = \text{ATK} \times \text{SkillRatio} + \text{FlatBonus}\]

系数设计原则:

  1. 风险收益平衡:高风险技能应有更高系数
  2. 资源消耗对等:消耗越多,系数越高
  3. 冷却时间补偿:CD越长,系数越高

典型的系数配置:

技能类型    CD(秒)  消耗  系数   DPS贡献
普攻        0       0     100%   100%
速攻技能    3       20    200%   67%
强力技能    8       50    400%   50%
终极技能    60      100   1000%  17%

1.4.4 连击与Combo系统

Combo系统增加战斗的技巧性和观赏性:

时间窗口型: 在规定时间内连续使用技能获得加成: \(\text{ComboDamage} = \text{BaseDamage} \times (1 + 0.1 \times \text{ComboCount})\)

条件触发型: 特定技能序列触发额外效果:

A技能 → B技能 = 普通效果
A技能 → A技能 → B技能 = 触发眩晕
A技能 → C技能 → B技能 = 额外50%伤害

积分累积型: 根据Combo数获得积分,积分可兑换强化效果: \(\text{ComboScore} = \sum_{i=1}^{n} i \times \text{HitDamage}_i\)

1.5 案例分析

1.5.1 街霸系列的帧数据系统

街头霸王将战斗数值精确到帧(1/60秒),创造了独特的数值体系:

帧数据三要素:

帧优势(Frame Advantage): \(\text{Advantage} = \text{OpponentBlockstun} - \text{Recovery}\)

当优势为正时,攻击方可以先行动;为负时,防守方反击。

隆的站立中拳帧数据:
启动: 5帧
持续: 3帧  
恢复: 7帧
总计: 15帧

防御硬直: 12帧
命中硬直: 15帧

防御优势: +5帧(12-7)
命中优势: +8帧(15-7)

这个系统的精妙之处:

  1. 确定性:所有数据都是确定的,高手可以精确计算
  2. 深度:简单的数字背后有复杂的攻防博弈
  3. 平衡性:通过微调帧数据就能显著改变角色强度

1.5.2 魔兽世界的DPS计算模型

魔兽世界建立了MMORPG的DPS(Damage Per Second)标准:

基础DPS公式: \(\text{DPS} = \frac{\text{WeaponDamage} + \text{AP} \times \text{APRatio}}{\text{AttackSpeed}}\)

其中:

技能循环DPS: 考虑技能循环的实际DPS计算更复杂:

\[\text{RotationDPS} = \frac{\sum_{i} \text{Damage}_i \times \text{Count}_i}{\text{RotationTime}}\]

一个典型的循环示例:

时间轴(10秒循环):
0s: 瞄准射击 (3s施法, 500%武器伤害)
3s: 奇美拉射击 (瞬发, 300%武器伤害)  
4s: 稳固射击 (1.5s施法, 150%武器伤害)
5.5s: 稳固射击 (1.5s施法, 150%武器伤害)
7s: 奇美拉射击 (瞬发, 300%武器伤害)
8s: 稳固射击 (1.5s施法, 150%武器伤害)
9.5s: 自动射击 (100%武器伤害)

总输出: 1650%武器伤害
DPS = 1650% / 10s = 165%武器伤害/秒

属性权重(Stat Weights): 不同属性对DPS的贡献:

\[\text{DPS}_{\text{new}} = \text{DPS}_{\text{base}} + \sum_{i} \text{StatValue}_i \times \text{Weight}_i\]

典型的权重表:

属性        权重(DPS/点)   优先级
攻击强度    0.5           高
暴击率      15.2          最高  
急速        8.7           中
精通        6.3           低

这些权重会随着角色属性变化而改变,形成动态的优化目标。

本章小结

战斗数值系统是游戏的核心,本章我们学习了:

  1. 伤害公式设计:加法模型简单直观但容易失衡,乘法模型提供更好的收益递减。混合模型可以结合两者优点。

  2. 属性体系:合理的属性设计需要考虑相互关系、成长曲线和克制系统。属性权重决定了角色的养成方向。

  3. 概率机制:暴击、闪避等概率机制增加随机性,但需要通过伪随机等技术改善玩家体验。

  4. 技能与资源:冷却时间、资源消耗和技能系数共同决定战斗节奏。不同的资源系统适合不同类型的游戏。

  5. 实战案例:街霸的帧数据系统展示了精确控制的艺术,魔兽世界的DPS模型则代表了复杂系统的标准化。

关键公式汇总:

练习题

基础题(帮助熟悉材料)

题目1:伤害公式对比 给定攻击力1000,分别计算在加法模型和乘法模型下,防御力为0、500、1000、2000时的伤害值。哪种模型在高防御时仍能保证有效输出?

提示:考虑加法模型需要设置最小伤害。

参考答案 加法模型(最小伤害10%): - DEF=0: 1000 - DEF=500: 500 - DEF=1000: 100(最小伤害) - DEF=2000: 100(最小伤害) 乘法模型: - DEF=0: 1000 - DEF=500: 167 - DEF=1000: 91 - DEF=2000: 48 乘法模型在高防御时仍能保证递减但有效的输出,更适合数值跨度大的游戏。

题目2:暴击期望值 角色基础攻击力为1000,有两种装备选择:

哪种装备提供更高的期望伤害?

提示:使用期望伤害公式计算。

参考答案 装备A期望伤害: 基础 = 1200 × [1 + 0.3 × (2 - 1)] = 1200 × 1.3 = 1560 装备B期望伤害: 基础 = 1000 × [1 + 0.5 × (2 - 1)] = 1000 × 1.5 = 1500 装备A提供更高期望伤害(1560 > 1500)。

题目3:技能CD与DPS 某技能基础CD为10秒,伤害系数500%。角色有30% CD缩减,计算:

  1. 实际CD是多少?
  2. 如果普攻DPS是100,该技能对总DPS的贡献是多少?

提示:技能DPS = 技能伤害 / 实际CD

参考答案 1. 实际CD = 10 × (1 - 0.3) = 7秒 2. 技能贡献DPS = (100 × 5) / 7 = 71.4 总DPS = 100 + 71.4 = 171.4

题目4:属性权重计算 某角色当前属性:ATK=1000,暴击率=30%,暴击伤害=200%。 计算增加以下属性对DPS的提升:

提示:分别计算提升前后的期望伤害。

参考答案 当前期望伤害:1000 × [1 + 0.3 × 1] = 1300 +100 ATK后:1100 × [1 + 0.3 × 1] = 1430 提升:(1430 - 1300) / 1300 = 10% +10%暴击后:1000 × [1 + 0.4 × 1] = 1400 提升:(1400 - 1300) / 1300 = 7.7% 在当前属性下,+100 ATK的收益更高。

挑战题(深度思考与实践)

题目5:设计伤害公式 为一款MOBA游戏设计伤害公式,要求:

  1. 护甲提供20%-80%的减伤区间
  2. 支持负护甲(护甲穿透)
  3. 保证数值平滑,没有突变点

请给出公式并画出护甲-减伤曲线(-100到500护甲)。

提示:可以参考英雄联盟的护甲公式,考虑分段函数。

参考答案 建议公式: $$\text{DamageReduction} = \begin{cases} \frac{\text{Armor}}{|\text{Armor}| + 100} & \text{if Armor} \geq 0 \\ \frac{\text{Armor}}{200 - \text{Armor}} & \text{if Armor} < 0 \end{cases}$$ 关键点: - Armor = -100: -100% (2倍伤害) - Armor = 0: 0% - Armor = 100: 50% - Armor = 300: 75% - Armor = 500: 83.3% 该公式满足所有要求,在0点连续且可导。

题目6:概率系统优化 游戏中有一个30%触发率的被动技能,玩家抱怨”经常10次都不触发”。请设计一个伪随机系统,要求:

  1. 长期期望仍是30%
  2. 最多连续7次不触发
  3. 给出具体的概率递增方案

提示:使用PRD算法,需要计算初始概率C。

参考答案 PRD方案: - 初始概率C = 8.474% - 每次未触发增加8.474% - 触发后重置 概率序列: 1. 8.474% 2. 16.948% 3. 25.422% 4. 33.896% 5. 42.370% 6. 50.844% 7. 59.318% 8. 67.792%(必定在第8次前触发) 验证:平均触发次数 ≈ 3.33,期望概率 = 1/3.33 ≈ 30%

题目7:战斗节奏设计 设计一个3技能循环,要求:

  1. 循环时间10秒
  2. 包含一个生成技能(产生3个资源)、一个消耗技能(消耗3个资源,高伤害)、一个填充技能
  3. 资源不能溢出(上限5)
  4. 最大化DPS

给出具体的技能序列和时间轴。

提示:考虑技能CD和资源生成/消耗的平衡。

参考答案 技能设定: - 生成技能:2秒施法,产生3资源,CD 4秒,200%伤害 - 消耗技能:瞬发,消耗3资源,CD 5秒,500%伤害 - 填充技能:1秒施法,无消耗,无CD,100%伤害 10秒循环: - 0s: 生成技能(0→3资源) - 2s: 消耗技能(3→0资源) - 3s: 填充技能 - 4s: 生成技能(0→3资源) - 6s: 填充技能 - 7s: 消耗技能(3→0资源) - 8s: 生成技能(0→3资源) - 10s: 循环结束 总伤害:200% × 3 + 500% × 2 + 100% × 2 = 1800% DPS = 180%/秒

题目8:平衡性问题诊断 某游戏中战士职业胜率只有42%,数据显示:

请分析问题所在并提出3个具体的数值调整方案。

提示:考虑职业定位和实际表现的差距。

参考答案 问题分析: 战士承伤能力强但输出不足,存活时间长但影响力低。技能使用频率低可能因为CD过长或资源不足。 调整方案: 方案1(提升爆发): - 降低主要技能CD 20% - 提升技能伤害系数15% - 保持生存能力不变 方案2(提升持续输出): - 增加普攻伤害25% - 增加资源回复速度30% - 略微降低防御5% 方案3(机制优化): - 新增"受伤获得怒气"机制 - 怒气提供伤害加成(最高30%) - 平衡总体数值,利用坦克优势 建议先尝试方案3,因其强化了职业特色。

常见陷阱与错误(Gotchas)

1. 伤害溢出问题

问题描述:攻击力过度超过防御力上限,导致防御属性失去意义。

典型场景

解决方案

  1. 使用百分比减伤而非固定减伤
  2. 设置伤害减免上限(如最高减免80%)
  3. 引入穿透上限机制
  4. 采用对数或平方根函数缓解数值膨胀

2. 属性稀释陷阱

问题描述:同类属性叠加导致边际收益急剧下降,玩家被迫平均发展。

典型场景

解决方案

  1. 设置软上限而非硬上限
  2. 不同属性采用不同的收益曲线
  3. 增加属性间的协同效应
  4. 提供多维度的成长路径

3. 概率欺骗感知

问题描述:真实概率与玩家感知严重偏离,导致负面体验。

典型场景

解决方案

  1. 对玩家有利的概率采用真随机
  2. 对玩家不利的概率采用伪随机
  3. 显示概率时适当”说谎”(显示28%,实际30%)
  4. 添加保底机制

4. 技能真空期

问题描述:所有技能都在CD中,玩家只能普攻,体验糟糕。

典型场景

解决方案

  1. 错开技能CD设计
  2. 提供低CD填充技能
  3. 普攻也要有一定趣味性
  4. 资源回复机制要平滑

5. 极端Build问题

问题描述:某些极端配装打破平衡,如纯输出秒人或纯防御不死。

典型场景

解决方案

  1. 关键属性设置递减收益
  2. 强制属性多样化(如装备提供多种属性)
  3. 引入克制机制
  4. PVP和PVE分离平衡

6. 数值可读性

问题描述:数值过大或过小,玩家难以理解和比较。

典型场景

解决方案

  1. 使用K、M、B等单位简化
  2. 百分比保留1-2位小数
  3. 用图形化展示代替纯数字
  4. 相对值比绝对值更直观

调试技巧

  1. 建立数值模拟器:用Excel或Python搭建战斗模拟,快速验证公式

  2. 对数坐标图:发现指数增长等问题

  3. 敏感度分析:测试数值变化1%、5%、10%时的影响

  4. 极限测试:输入0、负数、极大值,检查公式鲁棒性

  5. 玩家路径模拟:模拟玩家1-100级的完整成长曲线

  6. A/B测试:小范围测试数值改动的实际效果

记住:数值设计是迭代过程,没有完美的公式,只有适合的方案。保持数据驱动,倾听玩家反馈,持续优化。