标题: 英杰传:用GB4改变随机数的原理, 感谢孝直的算法解说
性别:未知-离线 SkyGrasper
(FX-550)


Rank: 4
组别 校尉
级别 忠义校尉
功绩 27
帖子 234
编号 419858
注册 2011-4-4


发表于 2011-12-13 23:33 资料 文集 短消息 看全部作者
英杰传:用GB4改变随机数的原理

这个事情挑战的前辈们不写,分析程序的也不写,那我就抛块砖,抛块砖...
其实费劲SL过的都知道,但是没打过的还真就未必知道

----------------------------------------------------------------------------------------------------------

多年以前,随着英杰传n99登上20大关,对玩家的细心和耐心要求越来越高
各关的打法变得精细繁复,战场上犯点错误也变得不可忽视了
于是GB4被用来做战斗中的存档(当然GB4能做很多事,但这就是另外的话题了)

初衷是防错,但GB4本身就是带来了一个SL的机能,于是用GB4做SL改变随机事件提高成绩(增加反击、烧火失败等)就成了大家的选择
然而大家很快发现,由于英杰传的随机数系统是程序内递推的伪随机数,读同一个GB4档后什么都不会变
只有改变我军的行动顺序或内容,需要的随机事件才可能变化

即使是这样的SL,也展现了不小的威力
不过也有很多人认为“只要无限SL下去,什么结果都能SL出来,也就起到了补丁的效果,至少能接近补丁”
其实不是这样的:某些项目上用GB4可以接近补丁,但是大多数时候会差很远,除非无数次地全军撤退重新初始化随机数序列
在此就简述一下用GB4做SL的原理,这里讲的是从经验中总结并回到实战验证的,有些细节可能不准确,希望分析程序的几位从底层程序给点支持和补充
(感谢孝直的算法解说)

----------------------------------------------------------------------------------------------------------

英杰传在开始每一关以及全军撤退时,会初始化随机数
在之后的全战中使用的所有随机数,都是由这第一个随机数确定性地递推出来的
每次产生需要随机数的事件,如天气、恢复、混乱及其恢复、反击、策略成败及其伤害值等,就会用掉相应的随机数;下次随机事件就用掉序列里下一个随机数

比如焦热,先计算伤害(不论后面是否命中都要算)用掉一个随机数,再计算命中用掉一个随机数,无论敌我,用一次焦热就是两个随机数
又比如假情报只判定一次是否混乱,消耗一个随机数;援助只计算一次援助量,消耗一个随机数
而大援助需要计算所有涉及的人的援助量,就是涉及几个人消耗几个随机数
其他的如决定天气、恢复兵力、降低士气时判断是否混乱、回合初判定是否从混乱恢复,都消耗一个随机数,具体的可以参考龙吟的程序分析

GB4的SL能改变的,就是通过采取不同的行动/顺序,让需要SL的随机事件换一个随机数
大体上分两类:我方回合和敌方回合

----------------------------------------------------------------------------------------------------------

我方回合的随机事件SL,典型的就是烧火
打比方说,魏延和其他9人出场,这9人都是普通兵种/军乐/运输
在某回合初,魏延有花五烧了,那么怎样尽可能多失败呢?

假设这时的随机数序列是r1,r2,r3,.......
注意,不回去改变上回合行动的话,这个随机数序列就是不变的
如果魏延第一个行动烧花五,那么决定各人是否失败的随机数就是r2,r4,r6,r8,r10

如果我们不满意这个结果,OK,让马谡激励一次消耗一个随机数,魏延第二个行动烧
这下,决定成败的随机数就变成了r3,r5,r7,r9,r11,结果就可能不同了(注意,仅仅是可能)

当然我们可以让更多人在魏延前面行动,换取不同的随机数组
但是遗憾的是并没有那么多变数
一方面其他人不损失经验的话就是一人消耗一个随机数,只有10种不同的随机数组
另一方面这些随机数组中的随机数可能部分重合,比如魏延第一个行动,和前面已经消耗两个随机数,就有r4,r6,r8,r10四个随机数重合

----------------------------------------------------------------------------------------------------------

敌方回合的随机事件SL,典型的就是反击
打比方说,赵何一个人反击三个敌人
由于反击发生在敌方回合,敌人的行动顺序是固定的,如果我军本回合结束时消耗掉相同个数的随机数,是否发生反击的结果就不会改变

这实际上经常意味着刘备需要休息或者用焦热/焦热书,以经验为代价换取赵何可能更多的反击
但是刘备自己也只能让随机数序列的消耗多一个或者少一个,多两次机会
如果有更多的人可以牺牲经验的话,就可能再多点选择
不过和上面的烧火例子一样地,这里也有不同随机数组部分内容重合的问题

在有些情况下可以有一些变通方案。
比如可以用假情报混乱掉一个敌人,那么判定反击前这个敌人的混乱恢复会消耗一个随机数,进而判定赵何反击时的三个随机数就比原来各后移一位了
这样可以不损失经验,但是对策略补给和兵力补给要求高,很受限制

----------------------------------------------------------------------------------------------------------

实战中还有一些小技巧,不过基本的情况就是如此
如果是一次SL个别随机事件,比如单点反击,就比较容易
但是一次SL多个随机事件,比如要求赵何三次都反击而且下回合下雨,或者要魏延烧花五时至少失败四个,就对多个随机数同时提出了要求,变得非常困难
即使没学过概率,从常识来讲也容易接受

而更严峻的一个现实是,靠GB4的SL,随机数可调整的余地太小了
比如单人烧火,其他人能给你调出来的就是那十几种可能的随机数组,还大量重合
多人烧火复杂一些,SL的效果平均到每个人就更小了
而敌军回合的所有事件都决定于不能大幅改变的回合结束时状态(一次性而且选择余地有限),SL多点反击就是个噩梦

GB4的SL就是这样一个有力但是很局限的手段
代替补丁?如果全军撤退无数次的话,是可以的,否则都被那个固定的随机数序列限制住了
这家伙边际效益递减很厉害的,你对它要求得越多,它对你越吝啬

[ 本帖最后由 SkyGrasper 于 2011-12-28 22:18 编辑 ]


顶部
性别:未知-离线 SkyGrasper
(FX-550)


Rank: 4
组别 校尉
级别 忠义校尉
功绩 27
帖子 234
编号 419858
注册 2011-4-4


发表于 2011-12-13 23:52 资料 文集 短消息 看全部作者
回复 #3 阿尔法孝直 的帖子

那就是说,我顶楼推测的
“开始战斗初始化一个随机数,后面的随机数都由其确定性地推出”
是对的了

放心了...没误导人......
多谢多谢


顶部
性别:未知-离线 SkyGrasper
(FX-550)


Rank: 4
组别 校尉
级别 忠义校尉
功绩 27
帖子 234
编号 419858
注册 2011-4-4


发表于 2011-12-14 00:22 资料 文集 短消息 看全部作者
回复 #5 edmund_liyc 的帖子

实验结果呢?

比如在兖州赵云单挑前存一个档
挑完用一个援助/激励/牵制
试几次看数值变不变

--------------------------------------------
ft,发出来发现同时已经发出来实验结果了......

[ 本帖最后由 SkyGrasper 于 2011-12-14 00:23 编辑 ]
顶部
性别:未知-离线 SkyGrasper
(FX-550)


Rank: 4
组别 校尉
级别 忠义校尉
功绩 27
帖子 234
编号 419858
注册 2011-4-4


发表于 2011-12-30 11:37 资料 文集 短消息 看全部作者
回复 #13 edmund_liyc 的帖子

嗯,同意,谢谢
顶楼只是一个简化例,实际打的时侯有很多情况会影响用的随机数

比如你说的敌人AI决策时用掉的随机数
比如士气低敌人受到伤害判定陷入混乱的随机数
比如对混乱敌人烧火失败,判定混乱恢复的随机数
......

这样的情况太多,有经验的话一看就明白,但是没经验的可能就要绕进去了
而它们都可以看作顶楼提到的简化情况的变体
所以我在顶楼省略了这些,而是说“实战中还有一些小技巧,不过基本的情况就是如此”

[ 本帖最后由 SkyGrasper 于 2011-12-30 11:39 编辑 ]
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-8-12 23:29
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.011078 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP