在JS中预生成伪随机地形
Pre-generating pseudo-random terrain in JS
我正在开发一款简单的JS/画布游戏。在这个游戏中,我希望用户能够导航一个由客户端每次根据相同种子生成的世界。因此,尽管世界是随机的,但每个用户都会得到相同的结果。
因此,我正在寻找一种方法来做到以下几点:
var some_seed = "abcdefg" // For instance
function get_world_rect(ab, cd) { ... }
get_world_rect([0,0], [9,9])
// Yields the following:
[[0, 0, 0, 0, 0, 0, "some_feature", 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, "rock", 0, 0, "bush", 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, "bush", 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, "bush", 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, "rare_flower", 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
这里的两个重要部分是,我希望能够在每个客户端上每次生成相同的"地图",并控制某些功能的"稀有性"。所以我可以说,这张地图有X次产卵"bush"的机会,Y次产卵"rare_flower"的机会。
我使用了一个自定义的随机数生成器。然后我给它一个种子加上一些基于瓦片的x和y的计算。
不确定这是否是我能做的最好的,但它有效。
下面显示一个片段。
generate_map = function(chunk_x, chunk_y) {
// The MersenneTwister object is from code this link: https://gist.github.com/banksean/300494
// this.base seed is some int.
// a "map chunk" is a square of tile containing this.map_chunk_size tiles.
// chunk_x and chunk_y are that chunk's X and Y.
g = new MersenneTwister(this.base_seed + chunk_x*1000000 + chunk_y)
tiles = []
for(var x = 0; x < this.map_chunk_size; x++) {
for(var y = 0; y < this.map_chunk_size; y++) {
var k = g.random()
/*
Objects:
0 - empty
1 - something 1
2 - something 2
*/
var obj = 0
if (k < 0.001) {
// Something rare
obj = 2
} else if (k < 0.1) {
obj = 1
}
tiles.push(obj)
}
}
return tiles
}
这样,它在浏览器和操作系统之间是可预测的(据我所知),而且我不必在服务器上生成并保存大量数据。
据我所知,对性能的影响微乎其微。
相关文章:
- 使用JS按顺序显示图像,而不是随机显示
- 使用JS将页面中的每个字母设置为随机颜色.为什么在页面的每个打开标记之前总是有一组额外的span标记
- dust.js是随机用户上传的模板,可以安全地在服务器端执行
- HTML JS在DIV中附加随机图像
- 使用速度.js随机值每个循环
- JS随机函数和砖石导致问题
- JS生成随机布尔值
- js体随机背景图像
- 使用随机用户生成器创建具有angular.js的轮廓
- 如何在JS中随机化backgroundPosition而不使用鼠标移动来制作万花筒的动画
- 试图用随机选择的单词填充html中的ul.JS
- Node.js随机调度
- 如何使用history.js随机第一状态
- 如何通过html id将两个随机数传递给JS中的一个函数
- 我正在尝试在 JS 中制作这个随机名称生成器.数组返回未定义
- 使用 JS 生成具有特定登录的随机字符串
- 使用 Node.js,如何将随机字符串路径重定向到主页
- 将 d3.js 代码与未显示的随机数据以及在定义之前显示的多个 SVG 混淆
- 使用 Node.JS 设计机器人,这些机器人以随机超时和通用例程运行
- d3 js - 如何在没有频闪效果的情况下,在fillStyle()和fillRect()上使用随机不透明度来模拟距离/