数值碎碎念(八)——说说属性平衡

发表于2018-07-02
评论10 6.6k浏览

好久不发文章好愧疚,来篇干货吧,这篇文章的节奏有点快,因为跟“说起来容易做起来难”的方法论比起来,我个人觉得推导更偏向“做起来容易说起来难”,看不懂的朋友可以去网盘下载Excel一起读,会容易一些。

 

Excel下载链接:https://pan.baidu.com/s/1IvAd_ZVvVkWpdX7PlVWsmQ 密码:1sqc

 

在之前的文章里提到过,MMORPG职业之间的平衡其实是经济上的平衡,即除非故意设计,否则每个职业应该按照投入和收益做平衡;在考虑职业平衡的时候,技能也是我们考虑的一个重要因素;

但是实际设计中,总会有纯属性的平衡需求;什么是纯属性的平衡呢?简单来说,N个职业,两两之间互相打,最后同时阵亡。这种需求总是会有的,而网上讨论这个的文章貌似很少,而我确实也收到过一些朋友关于这方面的求助,所以这里我打算谈谈这个。

 

绝大多数的游戏,伤害公式可以分为下列三种来讨论:一种减法公式,两种(乘)除法公式;

为什么(乘)除法公式是两种呢?我们用字母AD分别表示攻击类属性和防御类属性,那么,一种是F(A)/G(D),另一种是F(A,D)/G(A,D),这两种有什么区别呢?下面我们分别探讨,以下会用到市面游戏里真实使用的一些例子,为了方便讨论,我们不谈具体数字,有些不得不讨论的我会把它设成1,实际上如果大家有兴趣完全可以在公式的每一项前乘以不同的常数自己推一遍,这个计算起来并没有什么难度。

 

先从最简单的F(A)/G(D)类公式说起吧;有些朋友会把这一类公式叫“乘法公式”,用以和另一类乘除法公式区别;这一类公式里典型的如Dam=Atk*(1-Def/(C1+C2*Def)),有些朋友可能一看到这个公式就猜到我指的是哪个游戏了,具体游戏跟我们要讨论的东西没关系,这类公式可以化成F(A)/G(A)的形式即可;令C1=C2=1Dam就可以化简成Atk/1+Def)了;令AB双方属性分别为h1,h2,a1,a2,d1,d2,双方同时战死有h1/(a2/(1+d1))=h2/(a1/(1+d2)),那么可以推出,只要h1*a1*(1+d1)=h2*a2*(1+d2)即可保证同时死亡了,假设二者都等于K,而且很容易推出,此时引入一个新职业C,那么只要C的属性也满足h3*a3*(1+d3)=K就没问题了,而且这三个职业之间必然是两两平衡的;如果想要将某一个职业的强度变为其他职业的X倍,只要令这个结果等于X*K即可;引入命中暴击等概念后也同理,只要保证攻击类属性都在分子上、防御类属性都在分母上即可;这个情况实在太简单了,因此我们就不讨论了,有兴趣的朋友可以自己推一下。

 

然后说说减法公式吧;简单减法公式伤害=Atk-Def;假设AB双方属性分别为h1,h2,a1,a2,d1,d2,其中a1=k1*a,a2=k2*a,d1=m1*d,d2=m2*d, h1=n1*h,h2=n2*h;双方PK同时战死有h1/(a2-d1)=h2/(a1-d2),即n1*h/(k2*a-m1*d)=n2*h/(k1*a-m2*d)h不为0可以直接约掉,所以k2*n2*a-n2*m1*d=k1*n1*a-n1*m2*d

我们希望达到的效果是仅设定下标相同的数值保证这个等式恒成立;到这里有太多做法了,我们选最简单的一种(这里要注意,我是为了快速得出结论用了很暴力的设定,实际设计的时候一般不会用这么粗暴的方式来做),即令m1=n1,m2=n2,也就是说让每个职业的防御和血量同比增减;那么上述式子就可以变成k2*m2*a=k1*m1*a,即k1/k2=m2/m1;同理可知,第3人加入时,需同时保证k3/k1=m1/m3,且k3/k2=m2/m3;这里依然有无数解,我们依然用最简单粗暴的方式,当m1=k2*k3,m2=k1*k3,m3=k1*k2时可以保证上述等式成立;同理可证,当mi=PI(1 to n)(ki)/kimj=PI(1 to n)(kj)/kj,ni=mi,nj=mj时,无论ij取何值,hi/(aj-di)=hj/(ai-dj)必然成立。

 

最后,讨论相对来讲比较复杂的形式,除法公式,就用经典公式Dam=Atk*Atk/(Atk+Def)好了;假设AB双方属性分别为h1,h2,a1,a2,d1,d2,其中a1=k1*a,a2=k2*a,d1=m1*d,d2=m2*d, h1=n1*h,h2=n2*h;双方PK同时战死有n2*h/((k1*a)^2/(k1*a+m2*d))= n1*h/((k2*a)^2/(k2*a+m1*d)),其中had均不为0,那么这个式子化简并展开后是这样的(展开过程略):k2^2*n2*k1*a+k2^2*n2*m2*d= k1^2*n1*k2*a+k1^2*n1*m1*d,我们试图复制减法公式的上述操作时会发现,这个让任意两个系数相等都无法化简,这里要如何处理呢?(剧透预警)(预警完毕)其实也很简单,让k2*n2=k1*n1等于一个常数就行了,老规矩我们让这个常数等于1,于是。上述式子就变成了k1*m1*d=k2*m2*d,恩,好眼熟啊……总之,同理当mi=PI(1 to n)(ki)/kimj=PI(1 to n)(kj)/kj,ni=1/ki,nj=1/kj时,无论ij取何值,hi/(aj-di)=hj/(ai-dj)必然成立。

 

这样,我们就很奇妙地得到了两两之间的职业平衡……那如何保证这些职业与标准职业平衡呢?

乘法公式很简单,上面已经证明了,乘积就是强度对比;对于另外两个公式,由于我们上述推导过程是基于攻击力的系数k推导的,而我们刚刚又证明了每个职业强度相等,所以其实最终每个职业的强度就相当于average(PI(1 to n)(ki)),因此只要保证所有k的乘积等于1就跟标准人物平衡了……实际上朋友们可以在我的例子里发现,减法公式和除法公式例子下最后一个职业就是干这个的。

 

这样,我们就实现了任意两个职业之间属性的完全“平衡”,果然是做起来容易说起来难啊……这里还是要多说一句,我们在实际操作中,这一步往往只是个基础,往往是为了下一步设定做准备的,远不能作为结果来使用;因为一般游戏会让玩家有一定的自由度,也就是说玩家不一定按照我们设定的比例去分配属性;还是之前的那句话,游戏内的真实设计,一定要建立在经济平衡的基础上,把技能效果考虑进去之后,再来讨论属性平衡,单纯的属性平衡意义并不大。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引