小玉米图文教程No.1 - 关于随机数种子

最近发现很多人在群里面就问了,卧槽尼玛的!随机种子是个毛玩意?也有某些波导说这货根本就没什么用处,当时我就不乐意了。
0.jpg

嘛嘛,大神什么的,肯定是会这种东西的,反正大神我也教不了,我就说说新手向的东西好了。。。
这个随机种子,到底有什么用,我们先来看看GM8.0的教程原话:
1.jpg

其中,在random_set_seed这个函数中,说明文档表明,用来重复相同的随机序列。
这个东西其实不是很常用,因为大家在制作游戏的时候,随机的东西总是越乱越好,结果却忽视了随机种子的妙用。

相信玩过东方的人都知道,这款游戏不论哪一作都会有一个replay功能,那么如果想要实现这个功能,随机种子就是必不可少的。

好,现在,我来做一个演示:
现在我使用GM执行如下一段代码:

random_set_seed(250)
str = ""
repeat(7) {
    str += (string(irandom(50)) + ",")
}
show_message(str)

下面我们来看一下结果:
2.jpg

现在,你可以把上面的那一段代码,放入到你的GM中运行,看看是不是这个结果。

卧槽,奇迹发生了!我特么的用了这么多random函数,怎么每次返回的随机数结果都是一样的?而且不管重新启动多少次游戏,结果还是不变。

3.jpg
好的,那么我们现在讲“random_set_seed”这个函数去掉,保留下面的代码,再运行几遍游戏试试,

这里我又运行了三次游戏,发现得出的结果都是随机的,就是不一样。

所以,这里我们得出了结论,每次设定一次种子之后,接下来使用随机函数所得出的随机数结果,都是同一个序列。

对于某些飞行射击游戏,难免会遇到发♂射随机蛋的小兵,如果你想要做一个回放功能,在回放的时候依然使用随机函数,这样就会导致观看回放的时候子弹发射角度与玩的时候不一致。回放系统就制作失败了。残念ね。
而现在,我们拥有了设定随机数种子,可以在游戏开始的时候,用random_set_seedrandomize设定好一个随机数种子,之后用random_get_seed函数返回当前的随机种子,并把这个种子保存到文件中,使程序在进入回放阶段的时候读取这个种子,让回放时产生的随机数序列与游戏时产生的随机数序列相同。
这里我给出了一个游戏开始时候的伪代码,设定随机数种子储存在aaa.txt文件中

if(当前游戏模式是否是回放模式 == true)   //判断当前的游戏是否是回放模式,不是回放模式则是正常游戏模式
{
    var file,seed;  //设定需要用到的局部变量
    file = file_text_open_read("aaa.txt");  //打开储存文件
    seed = file_text_read_real(file);  //从文件中读取游戏时保存的随机数种子
    random_set_seed(seed);  //将回放模式的随机数种子设定为与游戏时一样的随机数种子,保证接下来生成的随机数与游戏时生成的随机数一致
}
else
{
    var file,seed;
    randomize();  //随便的设定一个随机数种子
    seed = random_get_seed();  //返回当前的随机数种子,并保存到变量
    file = file_text_open_write("aaa.txt");  
    file_text_write_real(file,seed);  //将当前的随机数种子保存到文件中,方便回放的时候读取
}

这里我有必要说明一下randomize函数,这个函数是让GM随机的设定一个种子,一般用于游戏的最开始,对于GMS,如果你使用random系列函数则一定要记得在游戏开始的时候使用这个函数来设定一个随机的种子,让每次游戏运行的时候都会得到不同的随机数序列,而对于GM8来说,游戏在开始的时候就已经自动执行了这个函数,不需要我们手动执行。

在使用GMS编写自己的游戏时,如果你的游戏中大量的使用了随机函数,别忘了使用randomize,一般情况下,随机种子这一系列函数并不是很常用,但是这个功能也必须要存在,满足需要的游戏设计者,一般情况下,随机数种子常用于带有回放模式的游戏。当然也还有更多其他的妙用,就等着你来开发咯~~~

附:【GML脚本】Mage Replay回放文件生成:https://www.magecorn.com/sources/100.shtml

分享:

支付宝

微信