该文章来自用户转载  点击阅读原文

前言

  有关于角色的战斗力,大家都不会陌生,几乎每一款游戏都有在计算相关角色的战斗力。 无论采用何种形式、方法,目的只有一个,就是想让玩家比较轻松直接的对比出角色的综合能力。

  在这里,笔者将综合一些情况,与大家讨论一下战斗力的计算方法与有效性验证。

  不过在这之前,按照惯例,还是先给大家讲一下个人的“扭曲”价值观与经验。


  在日常工作中,我们总会发现有一些数值策划,他们的表格做的很漂亮,并且你点击任何 一个单元格,总会让你发现一长串让你无法继续阅读下去的公式,长到令人发指!这些数字环环 嵌套,相互关联,找了半天也很难找到计算的源头。这就是俗称【数值表格的关联性】,并且这 也广泛被业内定位为数值能力好坏的指标,或者 招聘 面试数值策划的标准。

  笔者忍不住要吐槽,不过我想吐槽的不是【数值表格的关联性】而是这一【自动化】的设 计过程。

  很幸运,我亲眼目睹了几个这样的表格,均出自大师之手。

  所谓的数值规划,我个人理解的作用是——多人合作的时候,能够让其他策划看得懂你在 相关数值设计中的思路,并且也给自己一个总体纲要的规划。但是我看到的一份数值规划表格中, 所有数值全部都关联化,牵一动百,妄图将所有数值设计过程全部自动化。每一个层面,每一个 梯度,每一个兴奋点,每一个时间点,所有数值都存在着一个硬性的标杆公式强行控制每一个数 值。最后所有角色单位的数值也都与之前的“标尺”硬性关联,得出最终数值成品(虽然他还有 余力可以“微调”)。

  笔者想说的是,游戏是一件艺术品,那里面承载了设计者的个性结晶。玩家的需求是在游 戏中获得挑战,获得惊喜,获得心意。不是一套自动化就可以得出的产物。自动化,就意味着里 面许多小细节设计者都忽视了。

  最后那份数值产出,代入到产品中,大家看到了些许问题。他忽视了角色单位的差异性, 因为自动化导致了所有角色数值属性都是线性相关的;他忽视了关卡难度的兴奋感,因为所有关 卡数值全都是线性相关地上升,并且其中还会涉及到关卡的递进难度是否会超出预料的问题;他

  只关注于武器、等级、缘分 BUFF 等综合能力占比,却忽视了这些能力组成在每个阶段变化不一, 所以在代入产品后,发现很多数值超出或低于期望。

  笔者认为,一份好的数值规划,首先需要具有良好的易读性,因为这个不只是给你自己看 的,多数是给别人看的。其次它只起到 规划参考 的作用,而不是标尺的作用,不要被自己的数值 规划限制住游戏数值的无限可能。我们制作数值规划的目的应该不会是让今后的数值都在规划数 值中乘以一个系数吧?最后代入产品中,发现处处硬坎,处处单一,然后以“数值不可能是一下 子就出来”的名义“微调”到底。 最后“微调”到亲爹亲妈(那份数值规划)都不认识的地步, 当初何苦花那么长的时间做一份那么华丽的数值规划,意义何在?

  回归本文正题。


RPG 游戏中的战斗力计算模型

  我们先考虑一种简单的模型。

  游戏角色要想进行战斗计算,首先两个属性是必不可少的,HP、ATK。所以我们先模拟一下 只有 HP、ATK 参与计算的两人对战模型。定义:UnitName(HP,ATK)为一个战斗单位。先我 们有两个战斗单位,其中 UnitA(200,50),UnitB(400,20)。我们假定双方的攻击速度皆为每 单位时间(或者回合)行动一次。那么战斗过程可能为:

  • 第一回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(180,50),UnitB(350,20)
  • 第二回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(160,50),UnitB(300,20)
  • 第三回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(140,50),UnitB(250,20)
  • 第四回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(120,50),UnitB(200,20)
  • 第五回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(100,50),UnitB(150,20)
  • 第六回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(80,50),UnitB(100,20)
  • 第七回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(60,50),UnitB(50,20)
  • 第八回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(40,50),UnitB(0,20)

  =====UnitB 战败======

  我们稍微调整一下 UnitB 的数值,UnitB(400,25),再模拟一次战斗过程,看看会有什么变 化。(由于先手机制造成战斗结果不公平,所以在同一回合内,任一方的 HP 先为 0 判定为该方 战败,若双方 HP 同时为 0,则判定平均)

  • 第一回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(175,50),UnitB(350,20)
  • 第二回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(150,50),UnitB(300,20)
  • 第三回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(125,50),UnitB(250,20)
  • 第四回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(100,50),UnitB(200,20)
  • 第五回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(75,50),UnitB(150,20)
  • 第六回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(50,50),UnitB(100,20)
  • 第七回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(25,50),UnitB(50,20)
  • 第八回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(0,50),UnitB(0,20)

  =====双方战平======

  我们再来为 UnitB 调整一下数值,UnitB(500,20),再模拟一次战斗过程。

  • 第一回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(180,50),UnitB(450,20)
  • 第二回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(160,50),UnitB(400,20)
  • 第三回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(140,50),UnitB(350,20)
  • 第四回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(120,50),UnitB(300,20)
  • 第五回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(100,50),UnitB(250,20)
  • 第六回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(80,50),UnitB(200,20)
  • 第七回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(60,50),UnitB(150,20)
  • 第八回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(40,50),UnitB(100,20)
  • 第九回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(20,50),UnitB(50,20)
  • 第十回合 UnitA 攻击 UnitB,UnitB 攻击 UnitA【结果为】UnitA(0,50),UnitB(0,20)

  =====双方战平=====

  从以上三个结果中,读者们可能会发现一些规律,现在我们将对这个模型进行数学抽象。

  在只有 HP、ATK 两个属性参与战斗计算的过程中,我们判定一方战败的依据是其 HP 为 0。 在一场双角色 A、B 对砍的战斗模型中,判定角色 A 胜利的依据是,谁坚挺的时间长(HP 最后 变为 0 的一方)谁获得胜利:

  即

  得

  由此我们得出,只有当一方角色单位的值 HP*ATK 大于另一方角色单位的值 HP*ATK 才能获得胜 利。

  因此我们将角色单位的值 HP*ATK 定义为战斗力。 我们回头根据上面的 3 场战斗来验证一下结论是否一致?

   一个战斗过程的简化运用

  两个战斗单位的战斗过程,就是双方战斗力相减的过程。举例:

  有两个单位 UnitA(200,50),UnitB(300,20),经过战斗力的计算,得 UnitA:10000,UnitB:6000。根据战斗力显示,UnitA 会获得明显的胜利。

这里有一个方法,可以直接简化战斗过程运算得出结果,我们将双方的战斗力相减,的UnitA的剩余战斗力为4000。按照之前的公式,将这个剩余战斗力除以UnitA的ATK属性,就会获得UnitA的HP属性。根据计算得,UnitA获胜,并且剩余HP为80。请读者自行验证。

  基于基础战斗模型引入 SPD(速度)值

  多数游戏对于速度值 SPD 的定义为,该角色单位时间的行动次数 times/time,或者定义为FQR(频率值)。(对于其他的速度值的定义请向此方向转换) 那么基于之前的结论,若角色 A 想要胜出,则:

  即

  得

  由此得出,只有一方角色单位的属性值 HP*ATK*SPD 大于另一方角色单位的属性值 HP*ATK*SPD 才能获得胜利。

  同样的我们将角色单位的值 HP*ATK*SPD 定义为该角色的战斗力。 由于模型同理,笔者将不在这里赘述验证过程,请读者自己验证。

  基于基础战斗模型引入 DEF(防御)值

  在这种情况下,模型变得有些复杂,因为战斗结果不再那么纯粹,一方的战斗力是受对方影响的,为 相对战斗力 。

  这里我们一伤害公式 ATK-DEF 为例进行证明,其他公式所得出的结果虽不同,但是同理。 若 A 胜出,则:

  即:

  得

  到这里,我们可以观察出,一方的战斗力是如何受对方影响的。

  在这种情况下,我们称,该角色的战斗力是 相对 的,而非 绝对 的。

   如何在相对中寻找绝对(适用环境局限,需待多方验证)

  从以上的分析中,我们可以看出,在有 DEF 属性参与战斗计算的时候,一方的战斗力不是 一个定值,并且,三个单位的战斗力也不具有传递性。例如:

  我们定义一个战斗单位,UnitName(HP,ATK,DEF,SPD)。

  有如下 3 个战斗单位,UnitA(200,30,10,1),UnitB(450,20,15,0.5),UnitC(200,20,5,3)。

  经过计算,我们发现三方的战斗力关系是,A>B,B>C,但却 C>A。

  这是由于,UnitC 的攻击与 UnitB 的防御的差值过小,以至于 UnitC 的每一份攻防差的收益 过低,造成了 UnitC 出乎意料的输给了 UnitB。

  这种现象不可避免。但是,通过多次试验以及分析函数图像得出,当攻击力远远大于防御 力的时候,这种现象发生的机会将会变少,并且有理由相信,在极限状态下,这种现象将不会存 在。

  因此,我们可以人为的在规划数值的时候,将攻防的差距尽量拉大。从而减少这种现象的 发生。

   不过,这种现象也是一种策略性的玩法,因为它符合石头剪刀布的封闭克制关系。

   塔防游戏中的战斗力计算模型

  笔者在之前的文章中已经较为系统的给出了塔防的数学模型,只是那篇文章写的较早,以 现在的眼光看来,比较杂乱无章,所以整理好思路,重新总结一遍。

  我们定义防御塔拥有三个属性,TowerName(ATK,FRQ,RGE),敌方单位 UnitName(HP, SPD)。已知,敌方单位总是穿过防御塔的攻击范围与路径的交集,在这里我们定义为 ELP(The Effective Length of Path)。

  若,我方防御塔刚好能够杀死敌方一个单位,则用数学表达式抽象为:

  由于,在多数情况下,ELP 的长度都与防御塔的范围半径相近,所以有

  得

 

  这样,我们得出了一个完美对称的等式,左边全都是敌方单位的属性,而右边全都是防御塔的属 性。因此我们定义一个值 SET 作为衡量双方的战斗力大小的值。对于防御塔来说,其战斗力为

  对于地方单位来说,其战斗力为

  当防御塔 ATK*FRQ*RGE 大于敌方单位 HP*SPD 时,则防御塔能够在无干扰的环境下轻松杀死敌 方一个单位;当防御塔 ATK*FRQ*RGE 等于敌方单位 HP*SPD 时,则防御塔能够在无干扰的环境 下刚好杀死一个单位;当防御塔 ATK*FRQ*RGE 小于敌方单位 HP*SPD 时,则防御塔很难杀死一 个敌方单位。

   多个防御塔攻击一个敌方单位

  在这种情况下,由于各个防御塔之间不互相干扰,所以所有防御塔可进行战斗力的加法运 算来衡量我方总战斗力是否能够杀死该敌方单位。

   多个防御塔攻击多个敌方单位

  在这种情况下,模型会变得稍微复杂,我们将不能简单的进行加法运算从而对比防御塔与 敌方单位战斗力的大小。

  这是因为,防御塔的“抬手效应”与敌方单位的队伍间隔会极大影响战斗结果,试想一种 极端情况下,10 个敌方单位聚集在一小块范围下移动,当防御塔击杀第一个敌方单位的时候, 再也无力击杀下一个单位。

  不过,为了考虑到设计游戏的实际操作性,我们通常会合理规划每个敌方单位的间隔距离, 从而使得方便计算。在这种理想状态下,该模型还是可以良好运行的。

   横向对比现有的游戏

  之前看到很多游戏都有计算过战斗单位的战斗力,但是几乎所有都采用同样的一种方法 -------加权多项式。

  这种方法原理是,游戏设计者评估一个战斗单位的每一项属性,并且把每一项属性顶一个 权值,最后以加法运算得出战斗力。如:

  但笔者认为这种计算方式利弊并存。坏处是,这种计算方式并不科学,不能较为可观的衡量该角 色的战斗能力。好处是,这种计算方式直观容易理解,并且对比笔者总结的模型有一个最大的好 处,就是数值小,并且数值增长幅度也小。

  所以笔者建议,以上数学模型适用于战斗平衡的调整以及数值规划。不建议让用户观看理 解。

   结束语

  至此,想要总结的模型都已结束。

  不知道大家有没有关心这样一件事情,从以上两个模型,我们都可以看出数学等式的一种 对称美,就好像,被人刻意安排一样。但我认为这并不是一种巧合,我有理由相信对于其他类型 的游戏来说,其战斗力的计算同样为因式的基本模型。

  其实游戏中的一些数学模型非常简单,只是大家很少去关注,去抽象,去总结。非常希望 有识之士能够一起来总结一些规律,一起来构建起这座大厦。为业内贡献一份力量。

  注:关于RPG角色数值模型,参考自网易游戏理论研究室的相关资料,但略有修改。

如何高效设计游戏——关于战斗力计算方式的总结相关推荐

  1. 如何高效设计游戏——游戏平衡:RTS显性平衡与隐形平衡

    前言 本文主要是针对即时战略游戏RTS的平衡设计的一些概念进行归类阐述.虽然题目是关于即时战略游戏RTS的,但是其中一些概念.思想也同样适合其它类型游戏:策略游戏STG.角色扮演类游戏RPG.战棋类游 ...

  2. 如何高效设计游戏——游戏伤害公式的量身定做

    自从开始写博文,已经一年之久了,其中受到很多读者的认可,也有很多读者发出许多不同意见,笔者全都感激. 这篇博文是应一位读者的要求而写.内容上可能会比较基础且坑长.但是就笔者观点,就算是资深游戏设计者, ...

  3. 如何高效设计游戏——塔防游戏设计方案

    前言 目前国内市场的游戏普遍为一些带有"快餐特色的RPG"游戏居多,并且这一类型的游戏的设计思路已经发展成为游戏开发者们"月经"一样的存在,有很多人" ...

  4. 如何高效设计游戏——游戏兵种平衡的技巧与思路

    距离上一次写博文,已经是一年多了,当时原计划是打算写一篇如何平衡兵种的心得体会,但是不料之后工作上各种忙碌,所以这篇博文也就延期了.现在终于有了自己的时间,可以整理一下今日的思绪,反思自己,也能有时间 ...

  5. 如何高效设计游戏——增强游戏体验游戏背景音乐无缝循环

    前言 有关于本文内容,作者想说的太多. 还记得小的时候玩<最终幻想>系列以及<Chrono Trigger>,第一印象就是哪美妙的背景音乐以及整体音效的流畅度.这种体验至关重要 ...

  6. 欧几里得最短距离公式_老师好,关于欧几里得距离计算,有没有什么更高效的计算方式?...

    自己老师布置的一个题目:在100W个100维的向量中,取出与给定的100维的向量,欧几里得距离最小的前K个向量. 我把这个问题分为了2部分,一个是计算部分,一个是统计部分.统计部分用到了索引堆,很好用 ...

  7. 【转】: 通俗讲义:游戏中战斗力计算方法那些事儿

    文无第一,武无第二,严格意义上来讲战力的评估说到底就是反应参评对象战斗胜率的一个指标,谁的赢面更大,那么他就应该拥有更加高的战斗力数值. 但是这个参考指标只能在一定程度下影响战斗的最后结果,而实际的结 ...

  8. Java基础-时间复杂度计算方式

    Java基础-时间复杂度计算方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境 ...

  9. 如何将高效设计应用于 DAO?

    去中心化是需要提高效率的. DAO 的操作者们已经感受到了协调.沟通和执行失败的痛苦.这就是我们想象的未来吗?我们真的在建设新的数字领域的道路上吗?许多经验丰富的操作者甚至都会指出 DAO 构造本质上 ...

最新文章

  1. 解密:依图如何一年实现语音识别指标超巨头玩家
  2. 一亿小目标成就_成就卓越的一种方式:自我选择
  3. WebDev.WebServer.exe遇到问题需要关闭
  4. Javascirpt 排障(一)
  5. HDU6380 degree
  6. 《纽约邮报》手机客户端推送系统被黑 黑客发送抒情诗
  7. 区块链 Fisco bcos 智能合约(12)-Solidity的基础特性
  8. Java中系统属性Properties介绍 System.getProperty()参数大全
  9. 设计模式 ( 六 ) 建造者模式
  10. 检索 COM 类工厂中 CLSID 为 {xxx} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。...
  11. ASCII码对照表(emoji表情符号)
  12. tomcat集群(小型项目)
  13. Java实现判断中文字符串长度
  14. 常用泰勒、微积分公式
  15. 【树莓派】基于树莓派的语音机器人
  16. 如何解决C盘实际空闲空间远大于可压缩卷空间
  17. 利用Joypy绘制嵴线图的案例
  18. Android X86更改屏幕分辨率
  19. 程序设计基础实训报告
  20. 新手焊接电路板_如何焊接电路板

热门文章

  1. 扔硬币先手获胜概率问题
  2. ftpClient读取文件流的偶尔会是空文件
  3. 花12个月做成功网站
  4. Asus Eee Pc,看起来很不错
  5. springboot 事件监听器
  6. springboot是如何实现配置文件自动加载的呢
  7. 130行代码实现海贼王漫画下载
  8. Python爬猫眼电影影评及可视化 Robin NJU
  9. 编译高博ORBSLAM2_with_pointcloud_map,用TUM数据集测试。
  10. php kingcms 模型调用,KingCMS 中模板、模块、模型区别