赞 | 75 |
VIP | 0 |
好人卡 | 0 |
积分 | 140 |
经验 | 0 |
最后登录 | 2024-4-21 |
在线时间 | 2070 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 14048
- 在线时间
- 2070 小时
- 注册时间
- 2016-9-20
- 帖子
- 844
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 ppspssss 于 2023-1-29 12:33 编辑
随机数种子用预生成实现每周挑战慨念
以下 仅个人理解到最低慨念 ,观点 , 不可作为参考用途
在一些沙盒游戏如我的世界, 魔方世界 等游戏, 都有一个随机数种子, 虽然不同电脑 , 在输入同一个随机数种子, 都可获得一样的随机世界, 只要复制记录下一串数字便可以, 这个我本来不在意, 但当我玩了"兽人必须死2" 的塔防游戏 , 发现虽然是单机游戏也有一个"每周挑战", 我一直想不到这个"每周"是怎么形成 , 因为网游的话可以通过发布热更新进行更改, 单机游戏可是没网络的, 然后这几天想了可能就是用随机数种子实现, 通过时间来组合一个数, 由于每台电脑都有一个本地时间, 当时间不同, 生成的数字不同, 结合之前论坛上看过老式游戏的随机数也是用伪随机数列表形成, 那么要是预先生成多个列表, 再用不同时间节点生成一个数字编号, 再用对应的列表进行生成事物 ,
在rpgmaker xp里, 按F1 搜Time 时间的类。可以看到一些获取本地时间的方法
p Time.now.year #通过这个获取年份
p Time.now.strftime("%U") 或者 p Time.now.strftime("%W") #通过这个获取年份 以第一个星期天作为第一周的开始 或 以第一个星期一作为第一周的开始 获得(0-53) 是指今年第几周份
事先生成每个周份的挑战, 比如大慨每年52个周, 你打算游戏十年, 就弄52 * 10 = 520个随机数表 , 至于怎么批量生成随机表这个贴子就不提 ,这个就用天气打比如, $随机数表[0]="天晴", $随机数表[31]="阴天" , $随机数表[70]="雨天"
以发贴时刻当例子, 是2022/8/3 Time.now.year 得到是2022 , Time.now.strftime("%U") 得到31 (是指今年第31周)
假如以 2022/1/1 是游戏中的第1个每周挑战 , 年份 2022 减去 2022 得到0 查询第几周 得到第0周 因此得到 0 * 52 + 0 = 1 , 该周使用第0个数组内的随机数作为每周挑战值
那么该日得到的值为 "天晴"
假如以 2022/8/3 是游戏中每周挑战 , 年份 2022 减去 2022 得到0 查询第几周 得到第31周 因此得到 0 * 52 + 31 = 32 , 该周使用第31个数组内的随机数作为每周挑战值
那么该日得到的值为 "阴天"
假如以 2023/5/3 是游戏中每周挑战 , 年份 2023 减去 2022 得到1 查询第几周 得到第18周 因此得到 1 * 52 + 18 = 70 , 该周使用第70个数组内的随机数作为每周挑战值
那么该日得到的值为 "雨天"
由于此列表是要在游戏内是不会变, 因而玩家在不同电脑上只要是本地时间一样, 游戏内得到的隨機值就一样, 让时间获取得到一个数字, 这个数字代表几个组, 对应游戏内要随机的值 进行赋值, 再产生对应的效果, 我觉得要是使用得当或许可以造出虽是单机游戏, 也有部分网游单机的感觉 , 考虑到现在都是碎片时间多, 或许时间作为参考的话是不好,不想使用时间作为参照的话, 直接随机一个数字编号 , 或输入一个种子, 进行和预生成的随机组进行随机
=======2023/1/29
rmxp vx va 也有ruby自带的随机种子函数srand()
默设使用rand时会调用一次srand() , 因此设定过比如srand(2023) , 后如果再恢复使用普通随机数, 要再使用一次srand() 不然此后所有随机数都为固定数
|
|