简介:面向游戏数值策划与战斗系统设计者的学习资料,围绕网络游戏数值体系展开,重点解决属性价值评估、战斗公式推导与平衡性设计等问题,适合入门至进阶阶段、希望系统理解数值建模思路的读者参考。压缩包内共1个docx文档,约191KB,内容以章节形式组织,涵盖公式与模型、模型设定、模型特征参数、属性成长曲线、护甲减伤、闪避与招架强度转率、暴击与命中强度转率、攻击强度转DPS、EHP与EDPS计算等模块,并附有各公式的推导过程与结果汇总。已有247人学习。读者可从中获得一套以PVP平砍节奏为基础的完整推导框架,理解EHP与EDPS如何抽象攻防属性、如何通过设定单位属性价值规避边际效应,并参考闪避强度实际价值分析等案例,将思路迁移到装备、技能等数值设定中。
1. 数值策划的“黑匣子”:一份把战斗公式从拍脑袋变成推导的实战资料
很多做战斗数值的人都有过这种经历:主策丢过来一句“把护甲减伤调成 35%”,你打开 Excel 随手写了个减伤 = AC / (AC + K),K 拍了个 1000,上线后发现玩家堆护甲堆到后期直接无敌,又回头把 K 改成 3000,结果前期脆得像纸。问题不在于公式丑,而在于这个 K 是拍出来的,不是推出来的。这份《网络游戏数值学习大全》解决的正是这件事:它用一套以 1v1 平砍节奏为基准的 PVP 模型,把护甲减伤、闪避/招架转率、暴击/命中转率、攻强转 DPS 这几条公式的参数,全部从“模型特征参数”里解出来,而不是靠感觉填。适合已经能写战斗公式、但被边际效应和属性价值漂移折磨过的从业者,也适合想搞明白“为什么 BLZ 系公式长那样”的新人照着推一遍。
2. 模型先立住:EHP/EDPS 与平砍节奏的三件套
2.1 为什么必须先有战斗节奏,再谈公式
这份资料开篇就把话说死了:公式因需求而存在,运算的目的不是得出一个结果,而是得出一个能满足需求的结果。它设定的需求非常朴素——两个属性完全相同的标准玩家站桩平砍,打出一场节奏稳定的战斗。所谓战斗节奏,就是这场平砍从开始到分出胜负要花多少秒,资料里默认拍的是 20 秒。
这个设定看起来简陋,但它是后面所有推导的地基。因为一旦你承认“战斗节奏要被预期”,攻击类属性的价值就等价于缩短节奏,防御类属性的价值就等价于延长节奏,公式的任务就变成了让每一单位属性对节奏的影响保持恒定。反过来,如果你连节奏都没定,直接去讨论“减法公式好还是除法公式好”,那基本是无意义的争论——资料里作者自己也说,他的公式里四则运算都有,根本分不清该叫减法还是除法。
所以落地时第一步不是打开 Excel 写公式,而是先把这句话写进文档:本项目的平砍节奏目标是多少秒,PVP 还是 PVE。PVE 模型往往会忽略掉一部分防御属性的价值,这份资料明确基于 PVP,因为它要综合考虑攻防两端。
2.2 EHP 与 EDPS:把七项属性收进两个篮子
模型只保留七项基本属性:MHP(生命上限)、AP(攻击强度)、CHP(暴击强度)、HitP(命中强度)、AC(护甲强度)、DGP(闪避强度)、PRP(招架强度)。力敏耐智精这类复合属性不直接进模型,因为它们不直接作用于战斗,资料的处理是认为它们已经等价转化成了上面七项。
然后做一次关键抽象:所有防御类属性的综合体现叫 EHP(有效生命值,也就是抗打击能力),所有攻击类属性的综合体现叫 EDPS(有效伤害值,也就是打击能力),平砍节奏 = EHP / EDPS。这一步是整个方法能不能套用的分水岭——你必须能从自己的模型里抽出独立的 EHP 和 EDPS,抽不出来,后面的推导全部作废。
资料里还特意说明它精简掉了“影响对方防御”的攻击类属性(比如精准、破甲),因为这类属性会让 EDPS 的计算变复杂。如果项目里确实需要,得额外推导“降低对方 EHP”和“提高自身 EDPS”之间的价值换算,或者在 EDPS 公式里引入敌方防御数据。这是个很实在的边界提醒,很多团队就是在这里偷懒,最后属性价值算不平。
2.3 稳定属性价值:两个推论撑起整个方程组
模型要解决的核心痛点是边际效应:某属性数值越大价值越大,玩家的最优策略就变成要么往死里堆、要么一点不堆。攻防相减的模型必然出现这个现象,传统的闪避减伤同理。这份资料的所有公式结构,都是为了把属性价值摁成常数。
具体靠两条推论:
- 推论一:EHP 与 EDPS 对引起它们变化的属性值成线性关系。
- 推论二:每单位战斗属性价值相等(模型默认设置),于是 EHP 与 EDPS 对任意属性自变量的导数相等。
有了这两条,就能建立方程组,代入模型特征参数后联立,解出公式里的待定系数。资料也提醒了反向操作的坑:理论上可以先拍公式系数再反推属性价值,但对于含两个及以上参数的公式,必须先确认参数之间有没有相关性,有的话只能由一个推另一个,不能两个都拍脑袋。
3. 参数怎么拍:模型特征参数表与成长曲线 f(lvl)
3.1 模型特征参数:先定需求,再谈公式
模型特征参数本质上是你对这个模型的基本需求,代表模型的“特征”。资料给的拍数流程是:分析模型总结出特征数据、确认这些参数不常变且相互无逻辑关系、按需求赋值、然后保证游戏实际环境与拍定的数匹配。
它自己拍的一套参考值如下(明确说了没啥实际意义,仅供参考):
| 参数 | 取值 | 说明 |
|---|---|---|
| 总护甲减伤比例 | 35% | 标准模型下 AC 转化的总减伤 |
| 总闪避率 | 15% | 含其它闪避率 |
| 其它闪避率 | 5% | 天赋/Buff/初始化生成,不受削减 |
| 总招架率 | 15% | 含其它招架率 |
| 其它招架率 | 5% | 同上 |
| 总暴击率 | 25% | 含其它暴击率 |
| 其它暴击率 | 10% | 同上 |
| 总命中率 | 96% | 含其它命中率 |
| 其它命中率 | 90% | 同上 |
| f(lvl) 每增加 1 时的 MHP 增量 | 100 | 成长曲线斜率 |
| 攻强转化 DPS 占总 DPS 比例 | 50% | 攻击端拆分 |
| 武器 DPS 占总 DPS 比例 | 25% | 攻击端拆分 |
| 等级偏移量 B | 4 | 让 1 级角色有 5 级属性 |
| 平砍击杀时间 | 20 秒 | 战斗节奏目标 |
| 全技能后 EDPS 提高幅度 | 100% | 技能平衡另做 |
| 全技能后 EHP 提高幅度 | 50% | 技能平衡另做 |
| 暴击价值 / 命中价值 / 闪避价值 | 1 / 1 / 1 | 单位价值 |
| 招架价值 | 1.25 | 招架略贵 |
这张表最值得抄的不是数字,是它的组织方式。资料反复强调:把模型特征参数集中定义在一张表单里,所有计算格都来引用;计算页的公式里除了 1 之外不应该出现任何数字,每个参数都是对其它单元格的引用。最终目标是模型建完后,后续维护只调特征参数,不动公式。这是血泪经验——把变量当常数填进公式,后期调整时几十页公式得重翻一遍。
还有一条容易被忽略的约束:拍定的数必须和实际游戏环境匹配。你预设“其它闪避率 = 5%”,那天赋闪避加初始闪避之和就不能离 5% 太远;你设定全技能 EDPS 提高 100%,做技能数值时就得往 100% 靠。模型不是写完就完事,它是给后续设计立的靶子。
3.2 成长曲线 f(lvl):随手写的式子和它的边界
属性成长曲线 f(lvl) 是个关键表达式,会被各处公式调用,代表角色属性随等级成长的曲线。资料给的形式是f(lvl) = level + B,B 取 4,效果是让 1 级角色拥有实际 5 级的属性,初始数值好看一些。
它明确警告别随便模仿这个线性式子:按这个公式每升一级增长的属性是固定值,但角色能力成长幅度不一定是固定值。实际项目里要根据需求调整 f(lvl) 的结构,甚至定义成纯读表的无规律函数。资料顺手给了个观察到的分段线性例子(通过护甲公式反推):
旧区间(1<=level<=60) f(lvl) = level + 4.5 f(60) = 64.5 中区间(60<=level<=70) f(lvl) = 5.5*level - 265.5 f(70) = 119.5 后区间(70<=level<=80) f(80) 约等于 174.5(实测反推,缺准确公式)这里有个很重要的性质:无论你怎么调 f(lvl) 的表达式,只要所有公式都调用同一个 f(lvl),就不会影响平砍节奏。证明很简单,资料略过了,但这个性质意味着你可以随意调整指定等级的角色强度而不破坏节奏,调数值时非常方便。
3.3 属性计算公式与 B 的作用
属性预期值的计算形式是y = f(lvl) * (f(lvl) 每增加 1 时 y 的增量)。当 f(lvl) = level + B 时,如果 B = 0,角色属性值和等级成正比:1 级 100 HP、2 级 200、3 级 300。B = 4 时,1 级就有 500 HP、2 级 600、3 级 700,相当于把整条曲线往左平移了 4 级。
这个平移量就是给初始属性留的余量,让新手期不至于太寒酸。落地时 B 取多少,取决于你希望 1 级角色“看起来像几级”,没有标准答案,但一旦定了,所有属性共用同一个 B,别这项属性 B=4、那项 B=6,否则标准模型就对不齐了。
4. 公式推导实操:从护甲减伤到攻强转 DPS 的四个解
4.1 护甲减伤:C 为什么等于 1
护甲减伤公式的形式是减伤率 = AC / (AC + A * f(lvl))这一类结构(资料里 C 代表强度转率效率兼极限,A 是等级削减系数)。推导先看 C:如果 C = 1,EHP 公式分母里的 AC 会被消掉,EHP 与 AC 变成线性关系——每点 AC 提升固定量 EHP,与当前 AC 值无关。这正是模型要的效果,所以 C 直接定为 1。招架和闪避的 C 值设定也走同一思路。
这一步解释了一个常被误解的问题:这类公式之所以长这样,跟它是加法还是除法毫无关系,纯粹是因为只有这个结构才能推出“EHP 与 AC 成线性关系”。
然后求 A。由 EHP 对 AC 求导,化简后得到A = MHP增量 * (1 - 总减伤比例)。代入资料的数据:每级成长 100 HP、总减伤 35%,得 A = 100 × (1 - 0.35) = 65。于是护甲减伤公式确定为减伤率 = AC / (AC + 65 * f(lvl))。
再往下算标准模型下的属性值:B = 4、level = 60 时,MHP = (60 + 4) × 100 = 6400,护甲 = 0.35 × 65 × (60 + 4) / (1 - 0.35) = 2240。这两个数就是 60 级标准玩家的靶子,装备、天赋、Buff 加起来要尽量往这上面靠。
资料在这里花了不少篇幅吐槽某些商业游戏的护甲公式参数(比如某处常数为什么是 400 而不是 425 或 340、分段曲线为什么在 60 级不相交),这些吐槽的技术价值在于提醒你:分段函数的段与段必须在分界等级相交,否则标准模型在分界点附近会跳变。另外它还提到一个没想通的问题——某次版本把耐力价值降了 1/3、耐力数值提高 50%,标准 MHP 变了但公式参数没动,这在模型视角下是矛盾的。这类历史遗留问题不用深究,但你自己做分段时别犯。
4.2 闪避/招架转率:C 是解出来的,不是拍的
闪避和招架的公式结构与护甲类似,但多了一层:等级削减后的率还要再削减一次。推导目标同样是让 EHP 对 PRP(招架强度)成线性关系,由此反解出 C 需要满足的条件。资料代入数值后得到 C = 0.92647,然后 A 的推算过程与护甲完全相同。
这里有个值得记住的结论:这类游戏里闪避/招架削减公式的系数看起来怪异,是因为它们是算出来的而不是拍出来的。资料也留了个疑问:从数字看闪避的 C 值与预期吻合,但招架的 C 值偏小,导致招架价值大打折扣,原因不明。落地时如果你发现招架堆起来收益明显低于闪避,先别怀疑自己算错,检查一下 C 是不是被某个“历史参数”带偏了。
4.3 暴击/命中转率:为什么分母里没有 x
暴击和命中的转率公式与护甲那组不同,分母里没有强度值 x,强度与率是线性关系,只受等级削减系数 A 影响。资料特意澄清:这么设计不是因为“它们是攻击类属性”,而是因为这两个自变量在 EDPS 公式里出现的位置不同。这个区分很重要——很多人照着“攻击属性用线性、防御属性用除法”去套,套出来的 EDPS 对属性导数不是常数,白忙一场。
推导需要先求总 DPS。定义 F(lvl) 为 f(lvl) 每增加 1 时总 DPS 的增量,联立方程解出结果,再回到 EDPS 公式对暴击强度、命中强度分别求导,令导数相等,解出两个 A 值。资料还补了一句:如果命中与暴击的判定方式是先判命中再判暴击(多次掷筛),结果会不一样,公式要换成另一组。
这就引出模型设定里的一个取舍:单次掷筛(圆桌)还是多次掷筛。圆桌在程序上略省效率,各种率的真实发生几率与面板数值吻合得好,但可能导致策划算期望时因 Table 溢出出现误差,且同一 Table 内属性价值相互关联、无法稳定;多次掷筛则分开判定。资料明确只以圆桌模型推导,并假设所有率之和不出溢。你如果项目用多次掷筛,这套推导的暴击/命中部分要重来,别直接抄。
4.4 攻强转 DPS:用价值相等联立
攻强转 DPS 的公式很简单,因为 DPS 与 EDPS 直接成正比,DPS = AP * 系数就能满足“AP 与 EDPS 成正比”。系数怎么来?由 EDPS 对 AP 求导,再利用“价值(AP) = 价值(MHP)”以及“价值(EDPS) = 平砍节奏 × 价值(EHP)”联立解出。
这段推导短,但它是整个模型“单位属性价值相等”假设的直接兑现。落地时如果你改了平砍节奏目标(比如从 20 秒改成 15 秒),这个系数会跟着变,所以节奏参数一定要放在特征参数表里被引用,别写死在公式里。
5. 避坑与排查:五条推导路上真会翻的车
5.1 现象:属性价值算出来不是常数,越堆越强
原因:公式结构没选对,EHP 或 EDPS 对属性自变量的导数里还带着自变量本身。最常见的是护甲公式的 C 没取 1,或者暴击/命中误用了带 x 的分母结构。
解决:回到推导起点,先写出 EHP(或 EDPS)表达式,对目标属性求导,看结果里有没有该属性。有就说明结构不对,按第 4 章的思路重选 C 或换公式形式。别在系数上找补,结构错了调系数只是把漂移挪个位置。
5.2 现象:改了平砍节奏目标,所有属性预期值全乱
原因:节奏参数被写死在了某个公式里,或者 f(lvl) 在不同公式里用了不同表达式。
解决:把所有模型特征参数集中到一张表,计算页公式只引用单元格;确认所有调用 f(lvl) 的地方引用的是同一个定义。资料的目标是“后续维护只调特征参数”,做不到这一点,说明抽象没做干净。
5.3 现象:分段成长曲线在分界等级附近数值跳变
原因:两段线性函数在分界点没有相交,比如一段按 level-59 写、另一段按 level-60 写。
解决:每段函数都代入分界等级验算,确保两段输出相等。资料吐槽某商业游戏分段不相交“像胃里有只苍蝇”,这不是洁癖,跳变会直接破坏标准模型在分界点的连续性。
5.4 现象:圆桌模型下各率之和溢出,期望伤害对不上
原因:单次掷筛时所有率共享一个 Table,总和超过 100% 会挤掉后面的判定,面板数值和实际发生几率脱节。
解决:建模阶段就假设所有率之和不溢出,并在特征参数表里给总暴击率、总命中率、总闪避率、总招架率留出余量;上线前用脚本跑一遍各职业标准配装下的率和,超了就砍。如果项目本来就用多次掷筛,暴击/命中那组公式要按资料给的替代结果重推。
5.5 现象:玩家专堆某一属性,实际强度远超模型预期
原因:这不是 bug,是模型边界。资料说得很直白:角色大幅偏离标准模型有两种常见情况,装备档次整体偏高偏低(误差较小,可忽略),以及玩家有堆某属性弃某属性的倾向。后者无法靠模型解决,因为此时赖以消掉分母自变量的等式已不成立。
解决:接受它。资料的建议是给高端装备定制统一属性结构,让玩家怎么穿都不偏;或者干脆承认属性价值平衡主要是给 LightUser 一个基本靠谱的选择标准,CoreUser 自己会找平衡点。真正要避免的只是“越堆某属性强得越厉害”的失控,而不是玩家偏离标准模型本身。
6. 用导数复核实际价值:以闪避强度为例的验算习惯
模型建完不等于结束,资料第 10 部分给了一个很实用的复核动作:在非标准模型下,用 EHP 对属性求导,算出该属性的实际价值。以闪避强度为例,假定价值(EHP) = 1,由 EHP 对 DGP 求导得到闪避强度的价值表达式。这个表达式在标准模型下会退化成常数(因为分母里的自变量被消掉了),但在玩家实际属性偏离标准时,它会告诉你当前这一点闪避到底值多少。
我一般会把这个验算做成一张小表,输入玩家当前七项属性,输出每项属性的边际价值,然后看两件事:一是标准配装下七项属性的价值是否接近相等(验证模型没建错),二是极端配装(比如全堆暴击)下价值曲线是否还平缓(验证没有失控的堆叠收益)。下面是个简化的验算骨架,参数名对应前面的特征参数表:
# 闪避强度实际价值验算(简化骨架,仅示意结构) def dodge_value(dgp, other_dodge, f_lvl, A_dodge, C_dodge, ehp_base): # 闪避率 = 其它闪避率 + C * dgp / (dgp + A * f_lvl) dodge_rate = other_dodge + C_dodge * dgp / (dgp + A_dodge * f_lvl) # EHP 与 (1 - 闪避率) 成反比,对 dgp 求导得边际价值 d_value = C_dodge * A_dodge * f_lvl / ((dgp + A_dodge * f_lvl) ** 2) return ehp_base * d_value / ((1 - dodge_rate) ** 2) # 标准模型下应接近常数;偏离标准时观察曲线斜率 for dgp in range(0, 3000, 200): print(dgp, round(dodge_value(dgp, 0.05, 64, 65, 0.92647, 6400), 4))代码里other_dodge是不受削减的其它闪避率,A_dodge和C_dodge是第 4.2 节解出的参数,f_lvl是当前等级的成长曲线值,ehp_base是标准 MHP。跑出来的序列如果在标准值附近基本平、往两端缓慢变化,说明模型健康;如果某一段突然翘起来,回去查 C 和 A 是不是代错了。这个习惯救过我一次——某次改版后闪避价值在中段莫名翻倍,最后发现是新加的“其它闪避率”没进特征参数表,被硬编码进了公式。
从那以后我每次调完特征参数,都会强制走一遍“标准配装价值相等 + 极端配装曲线平缓”这两项验算,再去看装备和技能数值。希望帮到你。
本文还有配套的精品资源,点击获取