算法(algorithm)是构建游戏基本规则的基础,玩家在游戏中做任何事情几乎都要用到各种各样的算法,比如打怪时的伤害计算、怪物死亡时掉宝计算、合成和强化装备时的成功率计算等等。不管什么算法,其实在经过变形、整合或简化之后都可以化成一个基础算法,基础算法会影响到全局规则,而本文所要讲的便是对基础算法的一个研究。

 

在D&D规则中有一个很基础的算法,就是投骰子算法,它可以写为ydx,d代表投骰(骰子的英文是dice),x代表骰子的面数,y代表投骰的次数,整个公式的完整意思就是投掷y次x面骰,将所有的结果相加。那么它有什么意义呢?这需要用到高中课本的组合知识,由于组合的原因,出现中间值的几率会比取到两边值的几率要大,我不是数学老师,因此在这里就不多做解释了。懂程序的朋友可以编个计算器来进行验证,不懂程序的朋友也没关系,可以通过强大的EXCEL来验证,只不过使用EXCEL会非常占用你的内存和CPU资源,如果你的电脑不够强大的话……总之,我们不需要通过手工去计算就是了,因为这实在太麻烦,既然有先进的计算机技术,干嘛不拿来用呢?通过1d10、2d10、3d10、4d10、5d10各30W次的计算结果分布概率图大家应该就能很直观地知道D&D算法的作用了:

 

D&D算法的优势就在于:既能在总体上保证数值的可预见性,又能在一定程度上保证戏剧性,在二者之间达到平衡。比如说一把武器的伤害是3~30,如果采用通常算法在各个数值之间平均取值,那么一次攻击所造成的伤害运气成分就相当大;如果一把武器的伤害是16.5,虽然伤害是稳定了,但是却没有任何意外的产生,整个过程就像你看本故事书一开始就知道结局一样无聊;而如果采用3d10的算法,那么则能将2者的优势很好地结合起来,既有一定的稳定性也有一定的随机性。由于该算法的优越性,无数的游戏都在采用,其中不乏欧美的重量级作品。

 

如果把D&D的这个算法进行大幅度的扩充以后便可以得到这个算法:ydxes(a)el(b)其中y>(a+b),所有变量均为自然数。它非常之复杂,姑且叫它火星算法好了,简称AK(Mars Algorithm)……我不是故意的……囧……

 

算法解释:

x代表骰子的面数,它由(m,n)构成;

m代表随机数的起始值;

n代表随机数的末尾值;

x=n-m+1,如果未加特别说明,m通常取1;

e代表排除(eliminate);

s代表较小的(small);

第一个括号内的a表示排除较小值的个数,如果是1则排除最小值,是2则排除最小值和次小值,依此类推;

l代表较大的(large);

第二个括号内的b表示排除较大值的个数;

整个公式的含义就是投掷y次x面骰,排除a个较小值、b个较大值,然后将剩余数值相加。

例:8d10es(2)el(3)

在某次计算中投出8个数值:1、3、8、5、6、10、3、9,那么排除2个较小值1和3,3个较大值10、9、8以后将剩余数值相加可得3+5+6=14,即这次计算的结果为14。

 

算法缩写:

当y=1时可省略不写;

当m=1时,(m,n)由x代替;

当x=10时可省略不写;

当a=0时es(a)可省略不写;

当a≠0时d可省略不写;

当a=1时(a)可省略不写;

当b=0时el(b)可省略不写;

当b≠0时d可省略不写;

当b=1时(b)可省略不写;

最简形式不得低于1个数字+1个字母。

例:1d=1d(1,10)es(0)el(0)

    2el=2d(1,10)es(0)el(1)

    2es=2d(1,10)es(1)el(0)

    3esel=3d(1,10)es(1)el(1)

 

特别情况:

当m=0,n=1,a=b=0时,整个表达式可缩写为yR,R表示rand。

yR=yd(0,1)es(0)el(0)

为何要对它作特殊的表示方法呢,因为这个表达式一次计算仅返回0或1,是最简形式。

 

―――――――――――――――――――――――――――――

算法延伸:

 

加减骰:增加投骰的次数,记为±dz(c),z的含义是骰子的面数,如果没有特别标注它的面数与被加骰的对象面数相同,若被加骰的对象没有使用投骰算法则默认为10,当z=10时可省略z;(c)表示加投的次数,当c=1时可省略(c)。

运算法则:当z≠x时,ydxes(a)el(b)±dz(c)= ydxes(a)el(b)±dz(c)

          当z=x时,ydxes(a)el(b)±dz(c)=(y+c)dxes(a)el(b)

例:1d6+d=2d6,取值范围为2~12

    2d6+d(2)=4d6,取值范围为4~24

    5d6es+d9(2)取值范围为6~42

 

替换骰:替换es和el的数字,记为|e,它会将a和b互换位置,所得的结果取值范围都一样,并且在各个值之间的取值概率正好相对,后面会解释。

运算法则:ydxes(a)el(b)|e=ydxes(b)el(a)

例:7des(3)el(1)|e=7des(1)el(3),取值范围都是3~30

 

变化骰:共有4种:增大、增小、减大、减小,分别记作+el(k)、+es(k)、-el(k)、-es(k),k的含义和基础火星算法中的a和b相同,表示较大值或较小值,如果k=1则(k)可省略,使用变化骰后会改变原公式中a或b的值。

运算法则:ydxes(a)el(b)±es(k)=ydxes(a±k)el(b)

          ydxes(a)el(b)±el(k)=ydxes(a)el(b±k)

例:7d6es(2)el+el(2)=7d6es(2)el(3)

    7d6es(2)el+es(3)=7d6es(5)el

    7d6es(2)el-es=7d6esel

    7d6es(2)el-el=7d6es(2)

请注意:使用变化骰以后会改变取值范围

 

恒变化骰:也是4种:增大、增小、减大、减小,分别记作+!el(k)、+!es(k)、-!el(k)、-!es(k),它的作用与变化骰类似,不同点在于:它不仅改变原公式中a或b的值,而且会等量地改变y的值,所以它不会改变取值范围。

运算法则:ydxes(a)el(b)±!es(k)=(y±k) dxes(a±k)el(b)

          ydxes(a)el(b)±!el(k)=(y±k) dxes(a)el(b±k)

例:7d6es(2)el+el(2)=9d6es(2)el(3)

    7d6es(2)el+es(3)=10d6es(5)el

    7d6es(2)el-es=6d6esel

    7d6es(2)el-el=6d6es(2)

 

延伸算法过于复杂,暂不讨论。

――――――――――――――――――――――――――――

 

那么esel能给整个概率分布图带来什么呢?以4el、3d10、4es、5esel为例来说明这个问题,看图:

 

从以上4图可以看出来,el会让图的重心向左移,es会让图的重心向右移,3d10和5esel是左右对称的分布。为了更好地说明,将4图整合到一块:

 

从上面可以看出来,4el和4es是关于中线对称的,而3d10和5esel的区别在于5esel的坡度更大,看起来比3d10更为陡峭。

 

接下来研究(a)和(b)能带给我们什么。以6es(2)、7es(3)、7es(2)el、8es(2)el(2)、9es(3)el(2)、10es(3)el(3)来说明,由于相同个数的el和es是完全对称的,因此像7el(3)这类的就没必要再说了。为了节省版面,就只发整合以后的图了,请看:

 

从上图可以看出,如果一个括号内的数字保持较低不变,另一个括号内的数字越大,分布图的重心就越向相应方向移,曲线的上部越弯曲,顶端也越高,相对的另一头也越平缓;如果另一个括号内的数字也变大,则分布图的重心又会被拉回中线;在两边括号内的数字相等的情况下,数值越大,曲线的顶部越高,坡度也越大。

 

看到这里我想很多学过高数的会跳起来了:这不就是正态分布嘛!嗯,没错……不过这种高端的东西不便于人民群众所理解,我也不想把这篇文章变成高数的研究贴,所以就此打住。

 

 

研究它有什么用?

准确地说,我也不知道有什么用,汗!其实这个问题也像是在问那些成天研究尖端数学有什么意义的数学家一样,他们也不能马上回答你。

 

当然,如果说研究它完全没意义那也不是,所以来说说它在游戏中的应用吧。

 

通过该算法我们可以控制极品的产出(宠物、装备等等),比如设计某个宠物的成长率变化为80~120,如果不对生成概率加以控制的话那么几乎所有的玩家都可以得到满成长的极品宠;如果使用火星算法79+5d41es(2)el(2),那么玩家得到极品宠物的几率就相当的低了,极品才会因为稀有而显示出它的价值,如果改变公式为5d41el(4),则不仅极品率大大降低,良品率也大大降低了,垃圾率则大大提高了,如果改变公式为5d41es(4),结果便恰恰相反。也就是说我们会很容易地控制极品产出率。

 

除了控制概率事件,它一样可以用于战斗。比如一把伤害20~32的武器,通常情况下玩家打出各个数值的几率相同,那么这把武器所造成的伤害RP成分就很大了;如果使用火星算法16+4d4则会大大降低运气成分。如果想更有变化点使用16+6d4el(2)和16+6d4es(2),结果又会不一样,前者的伤害会偏低,后者的伤害会偏高,而玩家们是不会知道的,除非告诉他们算法让他们去研究——不管告不告诉他们,都会使得游戏的研究价值得到提高。

 

甚至在设定BOSS的攻击时也可以使用这种算法,比如在初始阶段使用最基本的火星算法,在第二阶段加上某种延伸算法,第三阶段换成另一种延伸算法,从而让BOSS充满变化性。当然,变化可以由很多产生,而算法只是其中的一种。

 

火星算法所存在的优点和缺陷

 

既然它如此的火星,就必然地会有自己的优点和缺陷。优点就在于它可以人为地控制概率分布的趋势,给游戏带来更多的变化性因素。缺陷主要在于两条:

一,它的计算过程过于复杂。

虽然是通过计算机来进行计算,但一长串的公式的确会把人看晕,过于复杂的后果就是出错率增加,一旦某个地方使用错了一个数字要检查起来是非常非常可怕的一件事。

二,均值难以确定。

如果用纯数学方法来进行计算,可以得出准确的计算结果,但是计算的时间实在过长;如果使用计算机穷举法来进行计算,虽然速度会很快但是只能得到精确值而不能得到准确值。难以确定的均值会给数值调整带来很高的难度,同时降低了效率。

 

关于本算法的一些结论:

基本模型:ydxes(a)el(b)

其中y>(a+b),所有变量都是自然数。

 

当y=1时,它在各个区间取值的概率是相同的;

当y=2时,取中间值的概率最高,两边的最低,从两边到中间的概率为等量增加,整个图形是两条相交的直线;

当y>=3时,仍然是取中间值的概率最高,两边的最低,但由直线变成曲线,y越大整个曲线越平滑,坡度越小;

x只影响曲线的平滑程度;

a越大,整个图像的重心越向左偏移;

b越大,整个图像的重心越向右偏移;

当a=b时,它的均值=(理论最小值+理论最大值)/2;

当a≠b时,它的均值很难以计算;

ydxes(a)el(b)和ydxes(b)el(a)关于中线对称,并且它们的均值和等于理论最小值+理论最大值。

注:最新研究发现,蓝色下划线部分存在不确定性因素,这部分的结论有待进一步的研究验证。 

 

所以说,它只是一个基础理论,还处于基础阶段,暂时不够成熟,谢谢观赏!

 

有兴趣的朋友可以继续研究下去^_^