我正在开发一个简单的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机会产生“灌木丛”和Y机会产生“rare_flower”。
答案 0 :(得分:0)
我使用了自定义随机数生成器。然后我给它喂了种子加上一些基于瓷砖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
}
这种方式可以跨浏览器和操作系统预测(到目前为止我可以说)并且我不必在服务器上生成并保留大量数据。
对我的表现的影响很小。