游戏攻击判断的三种模式
攻击判定过程几乎是包括战斗玩法在内的所有游戏都无法绕开的一块内容。常见的攻击判定流程有三种:瀑布算法、圆桌算法和混合算法。本文简述了这三种决策过程的特点,并结合实例对瀑布算法和圆桌算法的优势进行了对比分析,以期为今后其他作战数值设计内容的讨论提供一定的依据。
攻击确定过程概述
从此,正文的叙述开始了——我们直接代入一个例子:
一局游戏中,进攻方有命中率和暴击率两个攻击属性,防守方有闪避率、招架率和格挡率三个防御属性。据此,一次攻击可能产生6种判断结果:未命中、普通命中、闪避、招架、格挡、暴击。当采用不同的决策流程进行攻击结算时,六种决策结果出现的频率会完全不同。
1.?瀑布算法
顾名思义,在瀑布算法中,事件的决策顺序就像一个从上到下的瀑布。如果在某个位置切断了“水流”,后续的工序就无法继续。据我所知,瀑布算法是大多数游戏使用的攻击判定算法。
如果在上面的例子中使用了瀑布算法,将按照以下方式进行判断:
判断攻击者是否先出手。
然后决定是否被辩护方回避。
然后判断是否被防守方招架。
然后判断是否被网格遮挡。
最后判断攻击是否是暴击。
瀑布算法流程图
由此我们可以得出以下结论:
瀑布算法特点1:多次掷骰子,一次只决定单个事件发生与否。
瀑布算法特点二:后决策依赖于前决策的通过。
注意:有些游戏会在一次掷骰中结合命中和闪避,也就是结合进攻方的命中率和防守方的闪避率来计算实际命中概率,然后进行掷骰判断。它仍然是一个瀑布算法。
我们代入一些具体的值,将攻守双方角色的面板属性设置如下:
攻击者命中率=90%
攻击者的暴击率=25%
防御闪避率=20%
防御者的招架率=15%
保持方块率=30%
根据上述过程,六个判断结果将按照以下概率进行分配:
实际未命中概率=1-命中率=1-90%=10%。
实际规避概率=命中率*规避率=90%*20%=18%
实际招架概率=命中率*(1-闪避率)*招架率= 90% *(1-20%)* 15% = 10.8%。
实际盖帽概率=命中率*(1-闪避率)*(1-招架率)*盖帽率= 90% *(1-20%)*(1-15%)* 30%。
实际暴击概率=命中率*(1-闪避率)*(1-招架率)*(1-格挡率)*暴击率= 90% * (1-20%) * (1-)
实际普通命中概率=命中率*(1-闪避率)*(1-招架率)*(1-格挡率)*(1-暴击率)= 90% * (1-20%)。
瀑布算法决策结果的分布
由此我们可以得出以下结论:
l瀑布算法特点三:每个事件的概率符合经典的概率计算方法。
l瀑布算法特点四:骰子转的越偏,属性衰减越大,但不会出现无效属性。
2.圆桌算法
将所有可能的事件集抽象成一个圆桌桌面,就是圆桌算法这个名字的由来。圆桌算法的本质是将所有可能的事件状态按优先级顺序放在桌面上,直到所有事件都放好或者桌面被填满。圆桌算法是史诗巨作《魔兽世界》中使用的算法。据笔者了解,使用这种算法的游戏很少,但即使只是魔兽世界,也足以让这种算法成为永恒的经典~
如果上面的例子采用了圆桌算法,那么攻击的结果将通过掷骰子来判断。
圆桌算法流程图
圆桌算法的操作步骤可以总结如下:
(1)进攻角色的命中率决定了圆桌的大小。
(2)按优先级顺序将每个事件状态放在桌面上,直到所有事件都被放置或桌面被填满。
(3)如果桌面没有填满,空桌面用普通点击填充。
代入之前设置的值,六个判断结果将按照以下概率分布:
实际失误概率=10%
实际规避概率=20%
实际招架概率=15%
实际阻塞概率=30%
实际暴击概率=25%
实际普通命中概率=90%-实际闪避概率-实际招架概率-实际格挡概率-实际暴击概率=90%-20%-15%-30%-25%=0%
注:以上计算中,优先级按以下顺序排列:闪避>;招架>格挡>暴击>普通命中
圆桌算法决策结果的分布
大家可以看到,因为普通hit的优先级最低,所以完全被挤出了桌面。这就意味着,如果攻防双方用这个数值模型战斗,那么攻击者的攻击结果中就不会有普通的命中。
由此我们可以得出以下结论:
圆桌算法特点1:掷骰子一次即可得到本次攻击的判断结果。
圆桌算法特点二:事件有优先级。当圆桌已满时,低优先级的事件将被挤出桌面。这意味着溢出属性的这一部分将不再生效。
圆桌算法特点三:圆桌中每个事件的发生概率不会衰减。只要优先级低的属性不被挤出圆桌,每个事件的实际发生概率与面板属性值一致。
3.混合算法
这是一个先判断进攻事件,再判断防守事件的过程。我在一个帖子里看到过这样的决策过程,不确定是否有实际的游戏应用,这里只做一些简单的理论分析。
混合算法在单边事件的判断中采用了圆桌算法,即:
攻击者的判断结果:普通命中或未命中或暴击。
防御者的判断结果:躲闪或招架或格挡或命中。
混合算法流程图
注意:上图只是为了说明,从流程图的角度来看可能不够严谨。
代入之前设置的值,六个判断结果将按照以下概率分布:
实际失误概率=10%
实际闪避概率=攻击者的命中率*闪避率=90%*20%=18%。
实际招架概率=攻击者的命中率*招架率=90%*15%=13.5%
实际格挡概率=攻击者的命中率*格挡率=90%*30%=27%
实际暴击概率=攻击暴击率*敌方命中概率= 25% *(1-20%-15%-30%)= 8.75%。
实际平均命中概率=攻击者的平均命中概率*敌人的命中概率=(90%-25%)*(1-20%-15%-30%)= 22.75%
混合算法决策结果的分布
由此我们可以得出以下结论:
混合算法特点1:先判断进攻事件,再判断防守事件,* * *掷骰子两次。
混合算法特点二:先在单边事件的判定中使用圆桌算法,再用瀑布算法串联攻防事件。
混合算法特点三:会产生并发动作,比如暴击被规避。
注:这就是实际暴击率低的原因。
瀑布算法和圆桌算法的特点比较
在前面内容的铺垫下,我们不妨继续以《魔兽世界》中攻击判定过程的设计实例为切入点,对比分析圆桌算法和瀑布算法各自的特点。
(1)面板属性传递信息的直观性
瀑布:由于判断过程中每个属性的生效时间都有优先级,所以每个属性的实际效用与面板显示的不一致。
圆桌:因为判断属性没有优先级,所以只要没有属性被挤出圆桌,所有属性的实际效用就等同于面板中显示的。
这里我们可以看到圆桌算法的优点:
属性的实际效用与面板显示一致,显然更容易让普通玩家理解,方便玩家掌握自己的战力。
(2)属性的值
瀑布:越是偏心滚,属性衰减越大,但是所有属性都会生效。
圆桌:只要没有属性被挤出圆桌,属性效用就没有衰减。
这里我们可以看到圆桌算法的优点:
因为判断过程没有先后顺序,所以每个属性的实际值会比较接近,一般不会出现玩家把一个判断过程较低的属性堆起来结果很没用的情况。
也可以看出它的缺点:
一旦属性溢出,这部分属性的效用为零,完全没有价值。
(3)相同面板值下的生存性
圆桌:在面板数值相同的情况下,魔兽世界用圆桌算法大大提高了坦克角色的生存能力,让他们可以应对来自首领怪物的超高攻击,配合大团队副本的玩法设计。
在瀑布算法下,无伤概率= 18%+10.8%+18.36% = 47.16%。
在圆桌算法下,无伤概率=20%+15%+30%=65%。
传统的概率是乘法,圆桌是加法。后者的概率之和要大得多。
而且当防御职业将3D叠加到一个阈值(70%)时,配合技能可以达到100%无伤覆盖,所有命中和暴击都被挤出桌面,从而衍生出特定的玩法(70年代伊利丹的剪发技能)。
瀑布:在瀑布算法的框架下,同样的面板值,无伤概率远低于圆桌算法。换句话说,为了达到同样有效的健康,角色需要更高的免伤害属性。
这里可以看出:
在圆桌算法的框架下,如果属性输送失控,超过了阈值,就会对平衡产生很大的影响(70级的贼会刷gruer——当然在暴雪光环的作用下,玩家会觉得这是一个精妙的设计~)。
在国产游戏以收入为导向的环境下,设计师能否承受收入压力,严守属性交付的极值,是一个值得深思的问题。瀑布算法可以有更多的数值空间进行产能投放,更适合当前的市场环境。
(4)计算量
瀑布:多次掷骰子。
圆桌:单掷骰子
显而易见:
掷骰子的次数越多,计算量就越大。相比瀑布,圆桌的计算量相对较小。简单就是美。
注:除了魔兽世界,冒险和采矿的技能施法也采用了圆桌算法,大大简化了技能施法的判定过程。可以想象,一次攻击最多只能发动一个技能。对于每次攻击,团队中有几十个角色需要决定如果使用瀑布算法会产生多少计算量。
思考和总结
作战数值的研究要建立在理论推导的基础上,并投入实际应用。游戏数值设计毕竟不是数学研究,其本质应该是一种体验设计。最后,希望分享一下我个人对这两个算法的理解。
(1)不同的攻击决策过程会给玩家传达不同的战斗感受。
本质上,不同的攻击判断过程影响着一场战斗中各种攻击判断结果的概率分布。
假设在一个游戏中,闪避率上限30%,暴击率40%,命中率100%。瀑布算法下,闪避、暴击、普通命中概率分别为30%、28%、42%;在圆桌算法下,是30%,40%,30%。这两种不同的概率分布必然会给玩家带来不同的战斗体验,但在没有其他条件的情况下,无法判断孰优孰劣。
将战斗体验与游戏的核心玩法相匹配,让属性传递的极限值满足游戏的商业化需求,是设计攻击判断流程时首先要考虑的问题。
注意:甚至有些竞技游戏强调公平性,把暴击做伪随机。
使用瀑布算法,我们不应该设计多种多样的事件状态。
如果按照魔兽世界的做法设计一系列的事件状态(错过、闪避、招架、格挡、暴击、正常命中、偏转、碾压),不仅计算复杂,而且后判的属性衰减大,效果极其微不足道。这种晦涩难懂的设计会不容易传达,也会影响玩家的游戏体验(决策过程中较晚的某个属性堆得很高,结果却没用)。
使用圆桌算法时,应严格遵守属性放置的上限,以防止平衡崩溃。
需要澄清的是,并不是说瀑布算法可以无限放值,而是圆桌算法的属性放值上限远低于瀑布算法(无伤概率的加法和乘法)。
(2)不同的攻击判断过程会影响有效寿命EHP和有效攻击EDPS的表达。
几乎每个数值规划师都会将角色的属性转化为EHP和EDPS来衡量其战斗能力,但很多人都见过所有游戏都是用统一的EHP和EDPS表情来分析和模拟的。模拟方法的这种大偏差必然会影响经验设计的准确性。在不同的攻击判定过程下,EHP和EDPS有完全不同的表达方式,如下图所示。
瀑布算法下:
如果判断命中闪避两次:
EHP=HP/(1-无伤率)/(1-躲避率)/(1-招架率)
EDPS=DPS*命中率*[1+暴击率*(暴击伤害倍数-1)]
如果命中避开了合并决策:
EHP=HP/(1-无伤率)/(命中率-闪避率)/(1-招架率)
EDPS=DPS*(1+暴击率*(暴击伤害乘数-1))
在圆桌算法下:
EHP=HP/(1-无伤率)/(1-回避率-招架率)
EDPS=DPS*[命中率-敌人闪避率-敌人招架率+暴击率*(暴击伤害比-1)]
注意:闪避招架>暴击>普通命中,各状态概率之和不超过圆桌大小。
在混合算法下:
EHP=HP/(1-无伤率)/(1-回避率-招架率)
EDPS=DPS*[命中率+暴击率*(暴击伤害乘数-1)]
可能有人会觉得模拟的这么精确没用,数值平衡到最后也不是基于调整。诚然,在数值设计领域,确实有一句名言:数值平衡调整。但在我看来,调整要建立在正确的理论推导上。依靠调整来掩盖数值模型的错误设计是一种本末倒置的行为。即使达到所谓的平衡,也只是扭曲的平衡,会为后续版本的迭代埋下隐患。
写在最后
市面上的游戏大多不设计复杂繁多的攻击事件,基本都是使用瀑布算法。这样,攻击确定过程的设计就非常简单了。所以为什么要把简单的问题复杂化呢?
爱因斯坦曾经说过:一切都要尽可能简单,但一点也不能简单——一切都要尽可能简单,但又不能太简单。从理解一个数值设计方法到理解这样设计的目的,从模仿一个成功游戏的数值设计到理解其设计的内在含义,这是每一个数值策划成长的必经之路。
把一个数值体系完全照搬过来,才能根据实际情况灵活整合使用,并不容易。知道是什么,也要知道为什么——这是一个入行一年多的新人的感受。
免责声明:
1.我不能保证本文所用词汇的普适性,请多包涵~
2.不能保证本文中的魔兽世界示例中的设置与原版完全一致。但即使不符合,也不影响圆桌理论的推送。