定义
随机事件:主要是指游戏中有概率发生的事件,例如士气大振,士气低落,幸运一击,蛮牛发动死神之眼,蜥蜴发动石化效果等等。
现象
英雄无敌3的随机事件算法,经过多个版本的反复优化,有这么几个现象可以观察到。(小辉使用的是英雄无敌3死亡阴影高清重制版)
一、随机事件的出现次序,具有固定性。
在某次战斗中,不能简单的重打来改变随机事件。
最常见的,如果不做任何改变,反复重打,你会发现始终结果是一样的。甚至部队的攻击上限下限都一样,差别基本只有1,2点伤害!!!
也就是说,必须做点别的什么事,比如战斗中释放魔法,比如进战斗前访问神庙增加士气,才能改变随机的结果。
注意:实战观察到,圣龙的恐惧不遵循这个固定性规律。不改变任何条件,反复重打,圣龙的恐惧的对象有可能发生变化。
二、大数量下,随机事件的概率统计值,具有稳定性。
在很多次的战斗模拟中,你可以精确的发现随机事件的概率保持非常非常稳定的次数。
举个例子:
用2个防御特长的英雄(孟斐拉和泰泽),级别修改到200级。(这样,在测试中,所带部队的攻击都互相只能造成1点伤害。)
孟斐拉带25只巨蜥(20%概率石化,总生命1000),泰泽分别带1000生命的部队(100个戟兵,10个骑士、4个大天使、50个战斗矮人)
这样双方都是1000生命,一回合内,我方攻击1次,导致对方损失生命1,对方反击,导致我方损失生命1;然后对方攻击1次,导致我方损失生命1,我方反击,导致对方损失生命1。
也就是说,一回合内,双方各掉2点血,攻击2次。(即使对方被石化,敌方也掉血了,敌方的被攻击次数是没影响的)
因此最后统计我方石化出现次数,除以1000(因为敌人一共就1000次被攻击次数),就可以计算出来石化的概率了。
从修正结果上看,英雄无敌3的随机事件的宏观概率表现非常稳定。
三、大数量下,有可能有多次小概率事件连续出现。
虽然整体数据上石化的随机事件概率很稳定,但是在实际测试过程中,巨蜥连续3次出石化是常有的事,连续5次石化的极端情况也出现过;反过来,连续20几次不石化也非常常见。
这说明英雄无敌3的随机事件算法,还是比较接近真实随机事件。
由于每次石化发生都是独立计算概率的事件,只要是真实随机事件,就必然有这样的表现。
顺手提一下,手游中为了加强玩家的体验,往往会设置类似100抽必中ssr之类的设定,这就意味着抽卡并不是真实随机事件,被强行写入算法干预了。
原理
真实游戏里的随机事件算法,我们只有反编译才能看清楚,但是我们根据上面3个现象,已经可以推算出来大概的情形了。
1、在进入战斗的瞬间,程序随机生成了一长串随机数列。
英雄无敌3的电脑程序生成了针对本次战斗大概100个数字的随机数列(这个100的值不重要,随口说说,战斗中如果不够用就继续生成),每个数字在1-1000之间(这个值不重要,猜测,不过应该差不多),对于每个动作发生的时候,都按次序调用下一个随机值。
例如:进入战斗的时候,生成了800,700,200,914这样的随机数序列。
第一步我方部队移动,调用了800这个随机数,但是移动这个动作,不会造成任何随机效果,因此800这个数值调用了,但没产生作用。
第二步我方部队移动后攻击了敌人,轮到调用700这个随机数,那么根据攻防公式,计算攻击伤害计算完上限是100和下限是50后,50+(100-50)乘以700除以1000=85,也就是这次伤害打出了85点伤害,伤害上限是100,伤害下限是50。
第三步敌人反击,轮到调用200这个随机数。据攻防公式,计算反击伤害计算完上限是40和下限是30后,30+(40-30)*200除以1000=32
第四步我方部队部队士气2,行动后,有8.3%的机会2次移动。轮到调用914这个随机数,那么计算914是否落到1-1000区间的8.5%区间内,没落到。(如果落到应该是在915到1000以内的数字才行算落入8.5%的区间),那么不触发2次行动,结束。
大概就是这么一个工作机制,所以,可以观察到,如果什么都不改变,反复进入战斗,战斗过程中的随机事件触发,会一直是重复。
2、那些因素可以影响到进入战斗生成的随机数列。
战斗发生点的地图坐标,敌我双方的部队情况(分队、混编、站位、生命,数量、士气、运气等等),应该还有其他条件,但现象太少推测不出来了。
3、随机数列并不是永远一成不变,每次进入战斗依然存在随机浮动。
如果不改变任何条件,反复进入同一次战斗,随机数列有可能轻微变化,但不会变化太大,所以你会观察到每次部队的互相攻击的伤害变化都不大。。。运气好偶尔比如出现刚才的第四步,之前一直是随机数是914,偶尔有一次重新进入战斗,这个数值轻微变化到了915,就刚好触发了士气,一旦触发了士气,就意味着随机数的后面的调用次序发生了变化,那么后续战斗都将发生变化,也就是这次战斗结果很可能发生了巨大改变。