正文页

教你如何反推游戏的战斗公式

2014-12-08 11:07 知乎

0

  通常来讲,游戏的数据表现形式,绝大多数都是黑箱式的,除去获得官方公开的数据,通过适当或者不太适当的途径获得源码或者策划案之外,大多数时候,也只能依靠反推这个方案了——反推的可行性评估通常基于:

  A,大多数战斗系统或者其他系统,通常都依靠具体的算法和公式为核心

  B,公式和算法通常不会特别复杂,在网络游戏时代,计算战斗过程和结果通常放在服务器端进行,为了应付海量战斗造成的负担上升,算法势必以简单高效为要求

  C,在一个游戏的生命周期内,其底层系统的核心公式通常不会大幅变动(通常可能发生变动的时间是大幅度的更新如游戏资料片,或出现某些不可调和的问题或 bug 时)

  而反推方案的可执行,对执行者的素质要求是:

  1,对输出输出端的所有数据,结果,一般现象和特殊现象有足够的认知和了解

  2,能够构思,建立,验证简单数学模型的能力

  3,能够在游戏中建立测试环境,对模型进行反复的评估和验证的条件,或者有方法获得用于验证的大量数据样本

  4,最好拥有相关游戏开发的经验或游戏系统的深入了解

  好,下面是具体的例子了:我首先会想起的正是《魔兽世界》(以下简称为 WOW),而且是 60 级年代的,最有趣的那个 WOW。

  那个时候,整个艾泽拉斯大陆的玩家还沉浸在“我操这个游戏好屌”的情绪中,开发方也极少透露出和游戏相关的各种数据,但是仍然有大量的玩家在探求数据系统的奥秘,试图探求黑盒的内部,并且取得了辉煌的结果,更棒的是,他们的结果都后来直接或间接地被证明是正确的。

  第一个故事:

  骰子和百分比之桌(Attack table)——这个问题争论之久涵盖了整个 60 时代,焦点是说,一次普通的攻击可能造成命中,暴击,闪避,招架,格挡,碾压,偏斜还有未命中等等不同的结果——魔兽世界为了凸显即时战斗的多样话和不可预知结果的特性,在一个平砍上就做了这么多的文章。这些数据各自被命中率,暴击率,闪避率,招架率,格挡率(均为百分比数据)和等级差影响,那么这一大堆数字应该看哪个,数学预期到底是怎样的呢?

  艾泽拉斯的民科数学家们,已经因为分成了两个阵营分明的派系,各自有不同的说法:

  多次骰子派认为,每个百分比都是一个独立的 100% 中的占比;结果的出现是先用随机数决定是否命中,再用随机数决定是否招架,再用一次随机数决定是否暴击……

  单次骰子派即认为,所有百分比都是同一个 100% 中的占比,一次骰子决定结果

  但是后者比较容易遭受质疑的是,显然某些极端情况下,这些百分比的数值之和已经远大于 100 了,因此看起来这个算法就不能成立了

  直到官方蓝色帖子发布:

  Info on crit and hit chances | 2006-08-25 09:54 | Aeus

  The way WoW calculates crit rate is over ALL attacks. Crit rate is not based on hits only. In other words, if you have a 5% crit rate, that 5% chance includes misses。

  单 Roll 派才恍然大悟,提出了 Table 制算法——也就是当各种攻防双方各种非命中数据上升时,就好像向一个桌子上摆入更多的杯子,当杯子多到装不下的时候,名叫普通命中的那种被率先挤出去。

  接下来的一大串巨量 combat log 袭来,大量数据证明了这个算法是符合实际情况的,这就很好的解释了大部分现象;其次,部分实验者又用用等级差和装备差,以及利用各种技能产生的极端数据,又一一验证了这个桌上被挤出去的优先顺序列。

  而 elitistjerks 的 Vulajin,一位深思熟虑的盗贼,对于这一结果在物理伤害技能在 PVP 方面的表现存疑,通过超过 50 天,数万次的背刺试验,得到了技能伤害是独立于平砍的计算方式,是两次骰子的形式来决定结果的结论:Backstab: Two Rolls?

  到了 70 年代,elitistjerks 的 Lactose,一个疑心病很重的猎人,对于猎人的远程物理攻击是否遵循 Attack Table 的一次骰子方式进行了验证,用豪华装备加上极端测试环境,积攒了数千行有效 combat log,统计并再次验证了远程攻击也完全遵循 Attack table 的结果。

  到此,这个复杂的问题得到了圆满的解决,而之后的 WOW 版本中,更通过减少了碾压和偏斜的发生,进一步简化了平砍的 Table 相关算法:显然从开发者的角度评估,如果能够实现相似的结果,显然一次骰子的算法,要高效于多次骰子,但如果没有确实的公式,算法和规律加以验证,那么终究难以具有足够的说服力。

骰子与装备

  第二个故事:

  道具(装备)哪家强?(Item level)——这个问题更是伴随了 WOW 多半游戏历程,直到”装等“概念已经深入人心,成为普及观念,也成为衡量一个玩家价值的直接标准(从某种意义上讲我并不喜欢这点)的时候,”两件不同的装备,究竟哪一件更好“这个问题,才基本上不再有人争论。

  但在游戏的早期,大家对装备的概念只有紫的比蓝的好,蓝的比绿的好;到了 60 级中后期,Raid 开始普及紫装的时候,问题就出来了,同样是“60 级”的紫装,到底哪个会更好呢?或者“抢了人女朋友还要不要抢龙人盾呢?”

  在 Addon(各种插件)开放的同时,WOW 也提供了大量的 API 给开发者调用,其中关于道具,可以取得一个叫做 Item level,也就是物品等级的值,但是这个值,普通玩家不能看到(Patch 3.2 之前),只能通过“物品使用等级”来判断,但是问题如上,到了满级就看不出哪个更屌了——从 60-95 的史诗装备,都标注为“最低使用等级:60”。

  对应的译文在这里:[翻译]物品等级机制

  Hyzenthlei 一位牛头人萨满,自己琢磨啊计算啊,得到了一个公式

  方程

  下面是经过对 WOW 物品生成的规则进行了很多方程的尝试后得出的结论:

  ItemValue = [(StatValueX*StatModX)^1.5+(StatValueY*StatModY)^1.5+ …]^(2/3)/100 (X,Y 代表属性的数值,^是指数)

  在这个方程里你要注意到:

  1)它很简单(我害怕那些复杂到搞笑的东西),但并非象所有属性相加那么简单。这意味着物品平衡并非要用一些乱七八糟极为复杂的东西,一些简单的数值就能描绘出这种平衡的方法。

  2)每个属性在公式中的表现都是他本身的 1.5 次方。这样它不会增长得太快,但又可以更好地平衡超高的单独属性。举个例子,一件物品可以有 +29 力量或者 +18/19 力量 / 耐力,这两种情况下物品的 ItemValue 大致上相等(数值足够相近到同等 ilvl 的程度)。

  3)把这些属性的 1.5 次方加起来以后得出的值再化为它本身的 2/3 次方,这能使 ItemValue 不会螺旋型上升。经过这些改变之后,物品的 ItemValue 将基于 ilvl 线性上升。

  严格来说我看到“螺旋形上升”就已经想不明白是怎么个意思了,但是,这一条 Item Value(简写为 IV 清晰的解释了道具等级,道具带来的属性提升,属性的价值,这就意味着,除了极少数明显数值错误的道具之外,对于”我应该如何选择道具,能够使自己的数值成长更多“这个问题的答案已经非常清晰了:获得 ILV,并计算出他的价值就是了。

  我在 60 年代末期,大家还不知道 ILV 是什么概念的时候,就做了一个 addon,核心公式和界面都是抄的,但是增加了几个实用方便的功能:

  1,自动观察每一个视野内的玩家,记录他们的 IV 总值,并存在本地,查询的时候可以进行排名

  2,自动观察队友,一键生成一个 IV 总值列表合计

  3,在装备对比的时候直接显示 IV 和 IV 差值

  其中 1 只要把号在主城挂几个小时,基本就能掌握服务器平均 raid 进度,而第二个功能,在 60 级末期刚刚开始有 20 人野团的时候,这玩意能一下判断出整个团队的硬件状况;第三个则是省了你琢磨换还是不换的问题。

  第三个故事:

  OT 到底该怨谁,神秘的仇恨系统(Threat)——这曾经是最让每一个 Raid Leader 头痛的问题,到底仇恨是个什么机制,为什么有时候风平浪静,有时候 OT 一波接一波。

  相对于前几个问题,你至少还能看到黑箱输入的所有数据和输出数据;而仇恨值我们即无法直观看到输入数据,输出数据也只有一个——OT 还是没有 OT。

  因此,这个反推的难度要高太多了,直到整个 60 年代即将结束的时候,Kenco's research on threat这篇帖子的发布,才宣告仇恨系统的面纱已经被完全揭下。

  作者 Kenco 和几个朋友,建立了一个简单的设想,即普通的平砍伤害 = 仇恨增加,在这个基础上,测出了著名的 0.5(治疗有效值的 0.5 倍相当于产生仇恨),1.1/1.3 等几个极为关键的数值(当某个单位的仇恨值超过当前目标,近战为 1.1,远程为 1.3 倍时,则发生 OT),嘲讽的工作原理(瞬间获得相同于最高仇恨目标的等量仇恨,并强制目标转向)等等,加上对极为含糊的仇恨数据描述(产生“大量”“额外的”“较低的”仇恨)作出了数据测评,使得玩家头一次有一种拨云见日的感觉。

  在那之后的一段时间内,各种 Tank 职业对于如何制造仇恨的技巧大幅增加,而 DPS 们也在如何不 OT 的情况下尽可能增加输出有了良好的理解。

  这一直接影响就是到 70 年代开荒卡拉赞时代,仇恨插件就已经普及,控制仇恨的难度对于 Raid leader 就是件直观明白的工作了:“那个暗牧少用震爆,马上 OT 了!”。

  仇恨系统是 WOW 从 Ever Quest 借鉴并沿袭最为理想的设定之一,其黑箱程度如上所述,在各个系统中也是最高,但仍然被破解了。

  在整个 WOW 的游戏历程当中,类似的情况非常多,例如护甲的加值和减伤效果的推演,怪物和玩家之间的 Arrgo 关系的等等

  既然题主还问了“其他公式”,我们就再讲两个 WOW 以外的故事

  第四个故事:

  谁有利,谁不利——格斗游戏发展到现在阶段,最大的问题不是反应够快不够快,连招练得是不是熟,而是对策是否丰富,而对策是否丰富完全依赖于你对每个角色的数据掌握是怎样的——

谁有利,谁不利

  不,不是这些,和三围年龄爱吃什么没关系,是你需要牢记一大张数据表,我们称之为 Frame Data 帧数数据,这个数据中最重要的数据是——有利和不利。

数值差

  而(硬直差)有利不利翻译过来就是“在你打了我一下,我防住了 / 我挨打了”的情况发生后,谁可以先动的数据,这个数据决定了先发制人还是后发被人制,可以说了解硬直差的人在实战中将有巨大的优势,压制,强择,确反都靠它了!

  我们强调一下:这个数据表只有一个角色全表的 1/3 长,每个角色的数据条数在 70-120 不等,每条至少记下来发生,硬直,命中硬直差和防御硬直差和伤害值吧 5 条吧,这样每个角色只需要大概其记 400-600 个数据,某些不常用可能不用特别记,平均算 200 个吧,街霸 4 这样 40 来个角色的,需要记的总数据可能也就一万不到,全数据则在两万条上下)

  而在早年,官方没有提供这种数据的时候,怎办呢……我们的玩家以有些老土的方式,完成了人肉测量:选择两个(起跳速度)相同的角色,你踢我一下,我防住了,然后大家都拉住上,这样大家都会在硬直结束的时候跳起来,然后把这段情况录下来,用视频工具逐帧播放:

坚持

  根据两个人的跳跃高度差,就可以反推出帧数差了,这就是人肉 frame data 的来历。

  你也知道需要多少数据量,所以请想想看这个工作是如何完成的,那就是不可思议的顽强毅力。

热门工具

返回顶部

微信扫描打开APP下载链接提示代码优化×