转载 暴雪战斗公式——除法公式的精髓

2023-11-06 07:20

本文主要是介绍转载 暴雪战斗公式——除法公式的精髓,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

想必一般玩过暴雪游戏的人,都会对暴雪游戏的平衡性赞不绝口。若是对其游戏数值有进一步研究的人,更会惊叹其战斗公式设计的如此精妙。暴雪的战斗公式已经成为一个流派,成为我们最广为熟知的一种除法型公式,影响着日后千千万万的游戏设计。

对于战斗公式采用除法公式这个体系,一般的游戏设计者都不会很陌生,甚至一些资深的wower都会理解一些该体系下的结论,但实际上未必多数人都能对除法公式的精髓有着深入的了解,比如让我们来看如下的这些问题,是否都有明确清晰的答案呢。

1. 除法公式下如何定义一个涵盖了角色所有属性量,并且可用来衡量其能力强弱的函数?

2. 为什么除法公式中伤害减免百分比要用这么复杂一串公式?
 


3. 除法公式通常的形式和一些变种的除法公式有什么关系?
 


4. 玩过wow的很多人认为,由于伤害减免曲线随着防御增加变化越来越平缓,所以防御这个属性的收益是逐渐递减的,这个说法是正确的么?

5. 攻击,防御,血量这些属性究竟如何影响了一个角色的能力,即不同属性提升时,角色能力如何提升?即每点属性的属性价值如何?各个属性之间的等价关系如何?

下面我们便来逐一讨论这些问题,看一下暴雪的战斗公式究竟是如何推导出来的。他的精妙,他的美体现在何处。

一. 能力函数的推倒

对于非回合制的即时网游,考虑一个玩家的实力,主要看其与另外一方进行战斗时,

被击倒的时间。(对于回合制游戏主要考虑击杀回合数)

那么我们就来通过比较敌我双方的被击倒时间,来抽象出一个衡量角色能力的函数:

首先,除法公式计算伤害的核心是:伤害=攻击*(1-伤害减免%),

则:
 


然后,我们比较敌我双方的被击倒时间,会有3种结果,

即:
 


将被击倒时间的具体计算公式带入,

有:
 


由于上式中各项均为正数,移动DPS参数的位置不改变不等式符号,

即:
 


至此,我们将关于己方和敌方影响战斗结果的参数分别放在了不等式的两边。那么比较两方实力强弱,即为比较这个算式值的大小,即该式为可以反映一个角色实力的函数,即:
 


二. 除法公式的产生

刚才文中有提到,除法公式伤害计算的基础其实是伤害=攻击*(1-伤害减免%),

那么我们为什么不直接用伤害减免%直接作为角色的一个属性呢?

原因主要有2点:

1. 伤害减免%这个属性的值域过小,只能从0增加至100%

2. 每点伤害减免%增加所对应角色能力的提升是非线性的

什么叫非线性呢,首先我们来解释一下,什么叫线性。数学中类似y=kx+b形式的函数被称为线性函数,线性函数的核心在于其斜率为定值k,即y对x的变化率始终为k。在我们的公式中,以乘积形式存在的公式,即为线性公式,如 能力函数W=EHP*DPS 。线性公式的好处在于,提升每点属性所对应的能力的提升是固定的。比如例式中,当把EHP看做常量时,每点DPS的提升,对能力函数的提升始终为定值EHP,我们也可以说,每点DPS的提升对能力函数的提升是线性的。

现在,我们回过头来看伤害减免%,显然,该值对能力函数W的提升是非线性的。由于其函数形式为幂函数,因此其具有幂函数的性质,当其逐渐增加至趋近于1时,每点伤害减免%增加带来的能力函数W的提升急速增大,以至于趋于无穷。由此我们也可以看出,伤害减免%这个值对于角色能力提升来说,其价值是逐渐增加的,伤害减免%越大越趋近于100,每增加1点所带来的提升也就越大。

正是因为非线性所带来的属性对于能力提升的价值不恒定,难于控制,因此暴雪的公式都在极力追求线性化,由此才带来伤害减免%和防御之间的转化。那么,要如何定义伤害减免%和防御之间的关系才能使防御对能力函数的影响是线性的呢?

首先,我们按照下式定义伤害减免和防御的关系:
 


(其中f(lv)为和等级相关的一个函数,其作用稍后讨论)

整理后可得:
 


实际上这应该是多数人很熟悉的,伤害减免%和防御的关系式。将其带入能力函数中,

有:
 


此式中,防御和能力函数已经是线性关系,当HP与DPS为常量时,每点防御提升对能力函数的提升是恒定的,线性的。

由上述讨论,我们可以看到如此定义伤害减免%和防御的意义。下面我们来讨论,定义式中防御除以f(lv)的作用。

首先,我们来看如果没有除以一个值时,伤害减免%和防御的关系:
 


此时,当防御增加时,只需增加至10以上后,伤害减免%的值迅速上升至90%以上。当伤害减免百分比达到90%以上后,每增加一点防御,所产生的伤害减免%的变化会变得微乎其微。这样玩家的面板上,伤害减免%这个值的提升变化就会很小。对于玩家来说,感受上不好,感觉不到这个值的提升,也会间接的怀疑防御这个值的作用。即使每一点防御对能力函数的提升始终是一致的,但玩家从伤害减免百分比这个角度去看,会误认为防御对伤害减免%的影响是逐渐递减的,那么防御对能力的提升是会递减的。(这种想法实际上忽略了,其实伤害减免%对能力函数的提升效果是递增的。)

由上述讨论我们可以看出,为了使伤害减免%始终维持在一个易于认知的取值空间,故要在公式中除以一个系数,而为了能使防御无限的成长下去,该系数也要随着等级无限的增加,因此抽象出一个随等级变化的函数f(lv)。

由于1/(1-伤害减免%)值始终要大于1,而防御/ f(lv)无法始终满足,故在关系式里加了一个1,由此定义出伤害减免%和防御的关系,即为我们之前的定义式:
 


三. 除法公式的变种

在前面我们讨论的除法公式中,伤害计算公式如下:
 


在一些采用除法公式的游戏中,我们还会遇到一些变种的除法公式,例如:
 


那么,这种变种公式和暴雪型的除法公式有什么关系呢?我们先将该式做一下变形,即:
 


由此可清楚的看出,其实这种变种公式只是将攻击/K作为f(lv)函数而已。

四. 有效血量EHP

由能力函数W公式可以看出,衡量玩家实力可分为两部分,一部分和攻击属性有关,一部分和防御属性有关。

我们把和防御属性有关的部分看作一个整体,可以把这个整体抽象成一个叫做有效血量的概念,即
 


此时,
 


对于有效血量EHP的理解,我们可以将其看作是真正衡量一个角色抗击打能力的值。正如它的名称一样,EHP是包含了玩家抗击打能力的血量,是将玩家防御和血量一体化后的有效血量。

由上式可看出每提升1点防御值所带来的有效血量的提升是线性的,即每提升1点防御所带来的有效血量的提升的值是固定的。

现在我们回过头来看本文开篇提到的第4个问题,显然防御增加的收益并不是递减的,而是恒定的,线性的。之所以有很多人认为防御增加带来的防御方面的提升不是线性的原因是,他们错误的认为防御提升所带来的伤害减免%的提升是非线性的(是逐渐递减的),那么防御所带来的对角色防御能力的提升就是非线性的。

现在我们知道,衡量一个角色防御能力的应该是有效血量EHP,伤害减免%本身对有效血量的影响就是非线性的,它不能像血量一样,作为一个独立的量去衡量其对角色防御能力的作用。

五. 能力函数的展开

到目前为止,我们讨论的能力函数还只涵盖了血量,攻击,防御这3个属性。其实,当有更多防御属性加入时,比如抗性,闪避,格挡等,这些属性均可以以乘积的方式(以其本身或者通过一些属性转换,类似伤害减免%不合适,就要定义防御)合入到有效血量公式中。暴雪也一直在追求,将所有属性对角色能力的影响都线性化,就连像闪避这种很难线性化的属性,暴雪也通过引入敏捷,并使敏捷对闪避的关系采用分段函数的形式,来尽量保证敏捷对有效血量的线性化。

我们已经对有效血量EHP进行了比较详尽的讨论,对于能力函数中还有一部分和攻击有关的属性我们还没有讨论,对于整体攻击属性的描述,是一个我们很熟悉的概念DPS。

我们先以暗黑3为例,看一下当角色属性增加后DPS函数是如何构成的:
 


由上式我们可以看出,这些属性均是以乘积的形式对DPS产生影响的,换句话说,这些属性对DPS的影响都是线性的,即任意属性在任何水平下,如果其他属性值保持不变,每增加一点该属性值,所带来的DPS提升是恒定的。

六. 属性价值

前面提到过多次线性这个概念,其最大的好处在于,线性的属性由于其对能力函数的提升保持恒定的特性,易于进行属性之间的价值比较。PS:如果非线性的话,会带来过度堆叠某种属性后,该属性的价值被放大的后果。

下面我们来讨论如何进行各个属性价值间的比较。

设能力函数为W(武器伤害,攻击速度,防御,生命……),那么对任意一种属性x,其属性价值,就是当其他属性不变时,每增加1点该属性,能力函数W所增加的值。由该描述我们可以看出,求一个属性x的属性价值,实际上是在对能力函数W的复合函数进行求对x的偏导数。

如我们将能力函数简单展开为:
 


那么,武器DPS的属性价值即为能力函数对DPS求导数:
 


同理,我们可以得到其他属性的价值:
 


由于人物属性会不断提升,所以上述各式的值也会随着各项属性的提升而增加。这样,上述各式的绝对值对我们来说意义不大。但是当游戏进行到某一个极限时,比如40级or80级,这时按游戏设计的标准人物的各个属性之间的投放比例是固定的,那么把上述各式,以某式作为标准,求出各式与其的比例,这个比例便是一个固定的值。这样我们便可以获得各个属性之间价值的换算规则。

例如,我们以主属性作为标准式,即我们把一点主属性的价值看为1,那么:
 


以此类推,我们可以得到各个属性和主属性价值的比例。也就是1点主属性=?武器DPS=?暴击率=……

在暗黑破坏神3的设计中,便可以首先由设计者定义出极限标准人物各个属性之间的比例,再通过在该比例下计算出各个属性间的价值换算关系,由此便可以定义出各个属性作为一个词缀的价值了。

至此,我们基本将暴雪的除法公式体系讨论完整。暴雪除法公式之美,美在其对于对各个属性价值的精确把控,以使游戏可以达到完美的平衡;美在其通过种种公式和属性的引入,使各个属性的价值都是线性的,以使玩家的属性养成过程不会过度堆叠单一属性;美在其不断通过各种设定,使玩家的数值体验达到最优的追求。


via:gad-腾讯游戏开发者平台

这篇关于转载 暴雪战斗公式——除法公式的精髓的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355239

相关文章

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

提问的智慧(转载)

此文让我受益良多。值得一读,大家如果也觉得不错就一起来推~~~   ---------------------------------      在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。       首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们

Struts2常用标签总结--转载

Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。 Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

不同饭局,如何说开场白才能打开氛围?教你一个万能公式

在人情社会中,饭局不仅是吃饱饭的场合,更是人际交往、情感交流的重要平台。无论是家庭聚会、商务宴请、朋友相聚还是同事联谊,一个恰当的开场白都能迅速打破沉默,营造温馨和谐的氛围。 针对现实生活中最常见的四种饭局,酱酒亮哥教你一个万能开场白公式,这个公式分为四步,当然,不是一步不落的照搬,需要灵活应用,挑其中的两步、三步就行了,只要打开氛围,我们的目的也就达到了。接下来我们一起学习一下,希望你在不同的

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏

UVA10071(重温高中物理公式)

Back to High School Physics Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18809 Description A parti