咨询电话:400-810-1418服务与监督电话:400-006-6572

RPG游戏战斗数值的设计方法详解

发布时间:2019-09-20 08:56:07

在RPG游戏中,战斗公式的选择以及战力评估体系的设计,对于养成系统非常重要。本文将从基本战斗模型开始,与大家探讨RPG游戏战斗数值的设计方法详解

一、战斗公式的演化与策略

战斗伤害计算公式是RPG游戏对养成其决定性作用的关键因素,一切战斗属性的设计都围绕战斗伤害公式展开。战斗伤害公式也会因战斗属性的添加而随时进行调整。伤害计算公式中的每一个变量、因子和计算符号都结合属性有其蕴含的策略设计和针对性场景的应对设计。在设计中为了方便设计师自身计算和降低玩家的理解成本,不推荐设计过多的属性和过于复杂的计算公式。

1.1 一个经典伤害公式的例子

下面我们先来看经典游戏《魔兽世界》其中一个版本的一个计算公式。

攻击强度(Attack Power,简称AP)

Warrior/Paladin(战士/圣骑士):AP=角色等级*3+力量*2-20

Hunter/Rogue(猎人/盗贼):AP=角色等级*2+力量+敏捷-20

Shaman(萨满):AP=角色等级*2+力量*2-20

Druid(德鲁伊):AP=力量*2-20

Mage/Priest/Warlock(法师/牧师/术士):AP=力量-10

角色DPS(每秒伤害)=AP/14+武器DPS

单次攻击伤害(最小/最大)=攻击速度*AP/14+武器伤害(最小/最大)+技能附加伤害

这里我们可以看到,不同职业的AP计算公式是不一样的,这由设计师所设计的职业特性决定,这样也意味着不同的职业有不同的属性和装备追求。

防御力(Armor)

1敏捷(Agilty)=2护甲(Armor)

原来:Armor减少伤害%=0.75%*防御力/(攻击方等级+9)

后调整为:伤害=原始伤害值/(1+armor/x),x和等级有关,那个x好像是400+85*lvl 伤害减少百分比的封顶值是75%

这里我们可以看到这个防御公式做过一次调整,不过2个公式里面核心思路都是需要有等级这个因子,这个因子的作用是玩家等级越高需求的防御力越大,也就是说防御值的等值收益是随角色等级增加递减的,因此玩家需要不断提升防御力来增加伤害减少的值。

最终伤害还会受到暴击、格挡、技能等因素的影响,在这里我们暂时不做一一介绍。随着版本的变更公式也可能做了很多次调整,这里不影响我们接下来要做的探讨。

1.2 战斗属性的策略模型

基本战斗模型

最基本的战斗模型由生命值、攻击力、回合数3个要素构成,若是即时游戏,可以将一个标准战斗时长和标准攻击频率转化为回合数进行计算,二者没有本质的区别。

伤害=攻击力

之前很多横版清关游戏大部分用的就是这个。基于这个模型可以设计出攻击型单位和肉盾型单位。

属性添加与衍生策略

现在,在属性中增加防御力。

伤害=攻击力-防御力

这样看增加防御力这个属性是没有任何意义的,防御力的增加等同于每回合增加的生命值,从策略维度上看,相等于增加了生命值的上限,因此还是只能设计出攻击型的单位和肉盾型的单位。

为了让防御这个属性发挥作用, 我们进一步分析,这个生命值的增加是基于减少每回合对手攻击力削弱而进行增加的,针对性的策略设计应该是如果我们选择增加防御力,对方可以选择什么样的策略进行对应。因此基于防御力因素的添加方面我们可以从设计一个属性让防御力在策略维度上生效。

1-1.webp.jpg

也就是说,暴击属性和攻击频率的属性增加可以针对属性投放策略设计出入狂暴战士,盗贼,弓箭手这样的职业特性。

基于玩法系统的属性类型添加

伤害=攻击-防御 这是一套完整的战斗体系如果我们要针对法师职业设计法术伤害,那么我们也可以用同样的方法设计出  :法术伤害=法术攻击-法术防御

他们通过共同属性生命值联系在一起。至于暴击,闪避,命中这类属性是否需要也作用于法术伤害体系,取决于具体的投放和设计者想要设计的特性。

如果我们需要针对不同类型的法术设计出不同的伤害效果,例如黑暗魔法,光魔法,神圣伤害之类,我们也可以设计对应的属性与属性抗性,在公式方面既可以基于基础的攻击公式做强相的乘法或弱相关的加法。

例如:

伤害=(攻击-防御)*(1+(黑暗法术增强-黑暗法术抗性))

伤害=攻击-防御+黑暗攻击-黑暗防御

基于节奏投放的的属性拓展

当一个游戏为了后期让玩家有属性方面的追求,尤其是现在以系统迭代为代表的网络游戏,设计者有可能设计与策略无关或是影响原有策略判断但是看起来很厉害的特殊属性,例如原本设计了防御力,后来又增加设计属性无视防御攻击,设计了无视防御攻击有增加无视防御抵抗。设计了暴击增加设计直接暴击属性等等。甚至完全独立出来增加金木水火土另一套伤害与伤害抗性出来。(这里所说的属性伤害不是那种与游戏策略和文化强结合的属性伤害。)

1.3 减法公式与乘法公式

减法公式的伤害计算:伤害=攻击-防御

乘法公式的伤害计算:伤害=攻击*伤害减免(伤害减免一般由防御属性与其他属性常量和变量得到)

下面我们来详细介绍下减法公式与乘法公式的优缺点和需要注意的地方,这里讨论我们主要是基于防御属性的讨论,暂时排除其他属性和例如技能这类的系统的影响。

减法公式

1-2.webp.jpg

由减法公式的缺点可以看到,我们一般做减法公式的时候需要针对这些做一定的处理来缓解这些。可用的处理方式有以下几种:

1、设定标准的防御预期减少伤害的比例,并且尽可能的让这个比例不要过大,由此增加等级范围内防御的提升空间。例如我们在标准投放的时候就让防御可以减少70%以上的伤害,那么玩家只要稍微通过其他途径获得了防御力就可能导致防御力加满。

2、设定最大减少伤害的比例,以免低端玩家对高端玩家无法造成伤害。

3、设定防御力的效果与防御减少比例之间的关系,例如如果防御力减少了50%的伤害,那么超过50%的防御力只能发挥60%的效果,例如对方100点攻击力,我有80点防御力,那么我实际产生的防御效果就是50+30*0.6=68点,依次类推进行调整。

乘法公式

有人将乘法公式和除法公式分成两个类别来进行介绍,我觉得必要性不大,下面我们列举2个常用的乘法公式和大家进行介绍。

公式1:伤害=攻击x攻击/(攻击+系数x防御)

公式2:伤害=攻击x(1-1/(1+防御/等级函数))

乘法公式的核心原则是加入其它变量让防御值增长的时候减少伤害比例接近1而永远无法达到1,因此我们在公式中看到的攻击x攻击/(攻击+系数x防御)实际上是攻击力与攻击/(攻击+系数x防御)的这个系数作用。和公式2的原理是一样的。公式2加入了等级因子,按个等级函数是指每个等级有一定的防御需求,若玩家防御力没有提升,那么防御产生的效果就会下降。

1-3.webp.jpg

在进行乘法公式的时候我们通常需要进行如下的处理:

拉出范围内伤害与防御的曲线,判断有价值的区间是否合理,然后调整系数将它调整到合适的范围,若无法调到每个等级都合理,可能就需要设计分段函数进行细节控制。

对比乘法公式和减法公式的优点和缺点可以看出,乘法公式虽然在复杂程度上提升了很多,但是实际的优点也没有想象的那么多。尽管用了除法公式能够让防御趋向于无限大,但是这个曲线也会受边际效应的影响,和分段减法公式的效果是差不多的,这也是为什么大家看到的大部分游戏选择乘法公式的原因。

总结一下,在进行数值公式的设计和选择过程中,要尽量避免出现为了公式而公式,而是尽可能的从用户接触的数值体验上多做考虑,从游戏的数值策略、节奏和投放上面多做设计和调整。我们在对其他游戏进行公式分析的时候,原则上公式中所包含的每一个变量,每一个运算符号都有其特定的含义。或是节奏上的,或是策略上的,或是为了应对某个技能存在或是某个系统存在。后面我会提供一些其他游戏的公式供大家参考。

二、基于养成的战力换算

现在的RPG游戏普遍习惯于将玩家的能力转为为一个可以辨识的数值来帮助玩家评估自己和其他人的战斗实力。道具价值,装备价值,养成系统属性价值也都继承这套体系进行评估,因此现在战力评估机制在游戏的养成体系中起着至关重要的作用。

现在普遍认为战力的大小是玩家实力的直接表现,将每个属性值乘以一个系数后相加,即可得到这个角色或系统的战力价值。这种认知存在一定的错误和局限性,我们通常见到的战力评估是一种基于节奏的粗略评估而不是实际的战力体现,因此战力经常会有误差,出现高战力打不过低战力的现象。本文我们将一步一步推导来说明这个问题。

2.1 基于真实战斗的评估体系

战力的本质是玩家战斗实力的体现,因此战力评估最基础的层面和玩家的属性和战斗公式相关。这里首先要确定玩家战斗的标准模型,我们在战斗公式篇介绍过,一个战斗标准模型包含,生命,攻击,标准回合数这几个最基本的量。

我们在判断谁比较强的时候,就是假设2个单位同事开始进行攻击,谁先杀死对手则算作胜利,若同时间死亡则2者战力对等。因此可以得到如下最基础的公式。

战斗能力强度=攻击力x生命值

推导:假设a的生命值为Ha,a的攻击力为Aa,假设b的生命值为Hb,b的攻击力为Ab,那么在时间t回合内a对b造成的伤害为 Aa*t,b对a造成的伤害为Bb*t,假设ab战斗力相等,则表示a和b同时杀死对方。则可以得到如下等式:

Aa*t=Hb  

Ab*t=Ha  

求解则得到:  

Aa*Ha=Ab*Hb

基于这样的结论:战力=(攻击力x生命值)*修正系数,加修正系数是为了方面进行查看。

游戏中还有许多其他的属性,我们都会将他们转化为攻击力与生命值的计算公式中进行换算。我们假设:

伤害=攻击-防御    

战力=攻击x(生命+防御x回合数)

因为回合数是不稳定的,因此防御在不同的对战中发挥的作用也是不稳定的,因此我们设定防御的价值的时候是基于标准回合数进行计算的。当回合数发生变化的时候,实际战斗力就会发生一定的偏差。然后我们假设增加暴击率和闪避率进去。假设发生暴击产生2倍攻击的伤害,闪避无视一次攻击。那么战力公式转化如下:

战力=攻击*(1+暴击率)*(生命+防御x回合数)*(1+闪避率)

其他属性依次类推得到。

2.2 基于方便计算的战力误差

上面的实际战斗效果评估的方式用的人不多,主要原因是玩家在获得装备或物品在系统上获得战力提升的时候,需要能够从数值面板上对其价值进行评估,以上方法就很难进行换算。因此就需要现在比较流行的评估方法,对每一个属性进行评估然后相加。

这种评估方法虽然是不准确的,但是可以接近真实值,我们这里先说明一下如何是不准确的。简单举个例子如下:

假设:标准回合数=10,攻击=100  生命值=1000

那么我们可以设定1点攻击=10点战力,1点生命=1点战力。

那么我们可以得到加法计算这个单位的战力=100*10+1000*1=2000

然后我们根据实际战斗计算得到这个单位的战力实际是攻击力=200,生命值=500,那么这个单位的战力=200*10+500*1=2500

这里我们让2个角色同时攻击对方,实际上是同时死亡的。看起来似乎误差还挺大,而且这个误差是无法通过调整系数得到对等。

进一步基于增量我们再来看一组例子,可以得到如下的结果:

2-1.webp.jpg

我们对这个表格进行解析:

若是多个玩家1对玩家2进行攻击。

若是玩家1只能排队对玩家2进行攻击,那么玩家2可以杀死4个玩家1。

若是玩家2只能排队对玩家5进行攻击,那么玩家5可以杀死25个玩家1。

一次函数和二次函数随着增长差距越来越大。

其实我们对比这2个公式可以看出。

战力=攻击力*攻击系数+生命值*生命系数

战力=攻击力*生命值*攻击系数*生命值系数

假设攻击和生命以回合比例b进行投放,那么生命值=攻击力*b

假设攻击系数和生命系数之间的比例为a,那么生命系数=攻击系数*a

代入计算得到:

战力=攻击*(a*生命系数+b生命系数)=攻击*生命系数*(b+a)

战力=攻击*生命系数*a*b攻击力*生命系数

若要调整至加法和乘法的战力一致,二者战力之间的关系可化简为:

(b+a)与a*b*攻击力*生命系数之间的关系

由这里可以看到,回合数b与生命与攻击之间的比值a都是比较小的值,而攻击力是随着成长变大的值,因此可以判断,加法是无法做到准确战力体现的。

鉴于我们一般情况下只用判断同等条件下2个角色之间谁比较厉害。所以我们会通过控制属性投放来忽略这里带来的差异。

我们看不同的设定系数下的实际战力关系:

2-2.webp.jpg

2-3.webp.jpg

2.3 常用的战力设定方法

既然已经明确知道属性评估求和无法准确得到玩家实力,通常我们会通过控制投放节奏来对误差进行控制,尽可能的保证高战力玩家能够打败低战力玩家。

我们可以先设定角色的攻击力和生命值的战力系数。然后根据节奏和战斗公式对这些属性系数进行转换。这里我们假设角色有攻击、防御、生命值、命中、闪避、暴击、抗暴、暴击伤害这几个属性。

2-4.webp.jpg

2.4 技能和系统效果战力评估

技能提供提升战斗力的特殊效果,不同的效果根据其策略范围和能力强弱进行评估。一般技能可以分为增加伤害类型和特殊策略效果类型。特殊系统提供的特殊能力可等同于技能的战力评估。

若是伤害类的技能转化为伤害进行计算。

若是范围伤害战力=伤害x伤害人数1x概率1+伤害x伤害人数x概率2

例如一个aoe可能伤害4个单位,但是大部分时候只能伤害2个玩家。假设技能效果如下

2-5.webp.jpg

因此这个技能的战力=-攻击系数*100*(1*0.25*100+2*0.3+3*0.25+4*0.2)

若是buff类技能转化为对应增加的属性和存在时间进行计算。

假如一场战斗10个回合,一个技能让敌方晕眩3回合。

那么这个技能的标准强度=标准攻击*攻击系数*0.3

若是属性类的buff,则这个技能的标准强度=增加的属性转化的战力x0.3

在进行技能的战力评估的时候,同样会出现和以上战力计算同样难以处理的问题。例如增加属性3%,晕眩3秒这类的技能,因为在不同时期所呈现出来的效果是不同的, 因此往往在进行技能处理的时候我们会只根据技能的所处时期进行战力设定,而不是实际战斗能力的强弱,但是我们再进行技能战力平衡计算的时候就需要进行更加准确的计算。上文已经进行过讨论,这里就不再重复。

2.5 战力压制

通过以上的结论我们可以得出,由于回合数是动态变化的, 百分比属性的效果是动态变化的,每个属性的价值和实际计算值是变化的,因此做到准确的战力评估是不可能的,尤其在充值游戏里面,同等活跃的前提下, 充值多的玩家打不过充值少的玩家,充值玩家打不过免费玩家是我们希望进行一定程度上的规避的, 为了避免这种情况,我们再进行战斗公式计算的时候,我们会在计算过程中给予战力高的玩家特殊加成。

常见做如下处理。

伤害=实际伤害x(玩家1战力/玩家2战力)

做这样的处理可以一定程度上规避这个问题。但是这么做会加快了高战力玩家对低等战力玩家的战斗节奏。

还可以做如下处理。

设定每个等级有一个标准战力。

伤害=实际伤害*(1+玩家1战力/标准战力-玩家2战力/标准战力)

这样可以一定程度上减少战力评估不准带来的影响。

这里只在伤害上做了处理,在进行处理的时候,也可以对判定过程中的生命、攻击、防御、暴击、闪避等其他属性进行处理进行更加细致的调节。

来源:公众号“游戏魂”