游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6797|回复: 12

[原创] 关于公式的一些思路:目的比手段更重要。

[复制链接]

2

主题

39

帖子

289

积分

中级会员

Rank: 3Rank: 3

积分
289
QQ
发表于 2017-1-5 16:19:48 | 显示全部楼层 |阅读模式
         最近关于数值公式的文章挺多的,我也随笔分享一点东西,仅代表个人见解,不喜勿喷。

         坊间流传的反推数值,应该指的是从一款游戏的数据和系统中猜想公式、推到验证、分析设计意图、进而学习设计思想的过程。这个过程很有必要,因为在没有参考资料的情况下,这是最有效且可执行的手段。不过值得注意的是,普遍情况下,完成这个过程并不是终点,自认为洞悉了作者的设计思路,也许并非如此。我们往往从结果得到的是另外一个结果,其实我们需要的是原因,也就是为什么会出现这个结果。

         今天主要谈的是暴雪的防御公式:

         减伤 = 护甲 / (护甲 + flv))
         这个公式在WOW的60时代,实际数据是:

         减伤 = 护甲 / (护甲 + 400 + 85×攻击者等级)
         关于暴雪的这套东西有太多的推导和分析了,比较典型的是1点护甲价值恒定、成长线性、有效控制减伤比上限等等,再高端一些的也有用高等数学知识进行演绎的。其实说的都对,得到的结论也很正确,不过暴雪在最初是通过反推设计出这个公式的么?这个公式为什么是这样? 为什么是400、85,怎么得到的?在完成反推之后,要继续追溯结果的上层,进行正推。

         下面尝试性地“正推”一下暴雪的减伤公式,试图还原“正常”的思路:

         假设A、B是对战双方,使用  HP×DPS/1 - 减伤)来表示某一方的战斗能力,

         其中 HP / (1 - 减伤) 表示生存能力,用大众说法它叫有效生命。(不考虑招架、闪避等高级属性)

         用EHP(effective)表示有效生命,即:

         EHP = HP × 1/1 – 减伤) = HP×f(护甲)
         对于EHP,设计者会想,护甲变化带来的收益效率是恒定的,也就是增加1点护甲,EHP变化是常数。(如果体验需求是护甲的收益效率先递增到某个值之后再衰减,怎么办?)

         解决连续变化的最好工具就是微分方程,这里用最简单的一阶微分方程应该就可以求解,试一下。

         设定 dEHP/d(护甲) = a×HP, 含义是护甲每变化单位量,EHP增加a×HP,其中a是个常数。

         解这个一阶微分方程,很容易得到  
EHP =HP×(a×护甲 +C (C是常数)
         即:
减伤 = 1 – 1/a×护甲 + C
         由于初值 护甲 =0时,减伤必然为0,所以得到C = 1
         于是无意间地得到了这样一个东西 :
             减伤 = 1 – 1/a×护甲+1
         至此,完成第一个设计目标:护甲变化对EHP的影响是效率恒定的。

         不过游戏中存在等级的设定,而且希望玩家在面对高等级敌人的时候,要想达到相同的减伤效果,需要积累更高的护甲,这样一来,既能保证玩家在一个等级的横向维度上有良好的成长感受,同时也能保证纵向维度的数值追求,最关键的是为了自然合理,低等级的角色就应该经不住高等级怪物的碾压。

         为了让攻击者的等级能影响减伤效果,常识性地把用f(lv)来替换a ,(f(lv)是关于lv的函数,lv是攻击者等级)。

         于是有:减伤 = 1-1/flv)×护甲+1因为护甲每增加单位量,EHP变化 = HP×flv

         按常理推测,f(lv)一定是小于1的值,除非我们希望护甲增加1点EHP就翻倍。前面提到过,我们希望攻击者等级高的时候,EHP的变化效率要降低,也就是说lv增加时,f(lv)要减少,前期降低明显,后期趋于稳定。那么什么函数模型会满足这个假设呢?

         对的,是  fx=1/x
         构造通式得到 :flv = 1/a×lv+b
         如何求式中的a和b呢? 这个就是开篇提到的400、85如何获取的问题。

         任何游戏都要设定版本的数值目标,WOW也不例外,因为是60级版本,所以我们设定2个极值:

         (1,A)(60,B),A和B是版本内玩家在某种状态下的天花板数值,通过 减伤 = 1-1/(f(lv)×护甲+1 来假设玩家状态和天花板数值, 比如当 flv)×护甲 =1 时,减伤 =50%,当玩家在这个状态下,假定面对60级攻击者时,需要5500点护甲,那么f(60)=5500;假定面对0级攻击者时,需要400点护甲,那么f(0)=400;很容易得到a=85,b=400 。

         至此,得到 :

         1.png

         综上,用到了一些简单的数学知识,哪怕是微积分部分,也是最简单的一阶微分方程,看来暴雪设计师的数学水平也没高深到哪里(开个玩笑,据说平均是斯坦福的理工科硕士),不过可以确定的是,如果想做好数值,还是应该掌握一些数学知识的,可以不专,但是很多人宣扬的“小学数学“肯定是不行的。

         上面的正推过程也许距离这个经典的减伤公式的诞生之路更贴近一些,从中我们也能汲取更多的思想,手段并不重要,重要的是设计目的,想清楚要给玩家什么样的节奏和体验


102

主题

2443

帖子

7639

积分

论坛元老

Rank: 8Rank: 8

积分
7639
发表于 2017-1-5 17:47:02 来自手机 | 显示全部楼层
不会就抄,谢谢。

2

主题

39

帖子

289

积分

中级会员

Rank: 3Rank: 3

积分
289
QQ
 楼主| 发表于 2017-1-5 19:10:14 | 显示全部楼层
herosone 发表于 2017-1-5 17:47
不会就抄,谢谢。

抄这种模仿行为是人的基础天赋,难在后天训练知道如何理性的抄。
你给的建议小学生都明白,不知道如何谢你啊,大神

102

主题

2443

帖子

7639

积分

论坛元老

Rank: 8Rank: 8

积分
7639
发表于 2017-1-5 22:38:22 | 显示全部楼层
ssaimixiu 发表于 2017-1-5 19:10
抄这种模仿行为是人的基础天赋,难在后天训练知道如何理性的抄。
你给的建议小学生都明白,不知道如何谢 ...

我不知道谁没经历过学习过程马上就成为大师的,这已经超凡入圣了,你的圣人之言太厉害我这个小学生真的不能理解。
另外你这个文章根本就是上次腾讯数值设计的视频里的东西。

2

主题

39

帖子

289

积分

中级会员

Rank: 3Rank: 3

积分
289
QQ
 楼主| 发表于 2017-1-6 02:29:23 来自手机 | 显示全部楼层
herosone 发表于 2017-1-5 22:38
我不知道谁没经历过学习过程马上就成为大师的,这已经超凡入圣了,你的圣人之言太厉害我这个小学生真的不 ...

跟腾讯视频一样,我咋不知道哩?你这人,呵呵,真心希望你能不断进步,功成名就,不然的真委屈你了

1

主题

85

帖子

558

积分

高级会员

Rank: 4

积分
558
发表于 2017-1-6 09:44:54 | 显示全部楼层
深入浅出,谢谢分享!

2

主题

39

帖子

289

积分

中级会员

Rank: 3Rank: 3

积分
289
QQ
 楼主| 发表于 2017-1-6 09:50:39 | 显示全部楼层
herosone 发表于 2017-1-5 22:38
我不知道谁没经历过学习过程马上就成为大师的,这已经超凡入圣了,你的圣人之言太厉害我这个小学生真的不 ...

真心希望你能成为一代大师,否则真的屈才了~

1

主题

85

帖子

558

积分

高级会员

Rank: 4

积分
558
发表于 2017-1-6 09:53:16 | 显示全部楼层
骗人布 发表于 2017-1-6 09:44
深入浅出,谢谢分享!

又认真看了一遍:ehp = hp * f(护甲),如果想要护甲收益效率恒定的话,f只能是一个关于护甲的线性函数吧?所以是不是没必要用到下面的   高等数学  来推到?  我是数学渣渣,如果理解错了,请大神更正。

2

主题

39

帖子

289

积分

中级会员

Rank: 3Rank: 3

积分
289
QQ
 楼主| 发表于 2017-1-6 10:04:47 | 显示全部楼层
骗人布 发表于 2017-1-6 09:53
又认真看了一遍:ehp = hp * f(护甲),如果想要护甲收益效率恒定的话,f只能是一个关于护甲的线性函数吧 ...

一语中的,有道理!
不过如果想让护甲在某个值之前收益递减,之后收益递增,该怎么办呢?还是从变化率入手比较有普遍性,以不变应万变。

1

主题

85

帖子

558

积分

高级会员

Rank: 4

积分
558
发表于 2017-1-6 10:12:07 | 显示全部楼层
骗人布 发表于 2017-1-6 09:53
又认真看了一遍:ehp = hp * f(护甲),如果想要护甲收益效率恒定的话,f只能是一个关于护甲的线性函数吧 ...

最后部分有点复杂,我觉得可以这样理解:
1. 设计师希望玩家的免伤不超过50%,最好维持在35%左右(数据是我假设的)
2. 设计师希望这个版本玩家的护甲不超过5500,而且每提升1个等级,护甲能涨100(数据也是我假设的)

这样,减伤公式自然而然就出来了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-4-29 21:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表