这是函数定义:
/**
* @param {number} x The x-coordinate (can be positive or negative)
* @param {number} y The y-coordinate (can be positive or negative)
* @param {number} tileCount The number of available tiles
* @return {number} The selected tile index
*/
function getRandomTileIndex(x, y, tileCount) {
// Fill in code here
}
我可以,例如return x * y % tileCount
,但我想引入随机性。我可以做return Math.round(Math.random() * (tileCount-1))
,但那时每次都会返回不同的图块索引。
我希望此函数是确定性的,因此当使用相同的输入(x, y, tileCount)
时,将始终发生相同的输出。但我也希望它(尽可能地)出现随机均匀分布 - 随机性的质量不一定是完美的。
这个随机磁贴生成器的目的是用于具有(几乎)无限网格的游戏 - 用户从中间(x,y) = (0,0)
开始并且将以他想要的任何方向向外移动 - 我将只有固定数量的"地面" - 我希望它能让每次加载游戏时世界看起来都一样。
答案 0 :(得分:2)
如果你想引入“可预测的随机性”,那么听起来你想要一个哈希。可预测的随机性是一种矛盾,因为真正的随机性是不可预测的,所以我们称之为未知但确定性。
算法如下所示:
(x*Y)
对我来说听起来不错(但是这会
引入一些对称性 - (1,1)
地图与(-1 -1)
sum(bits of hash) % tileCount
为解决对称性问题,您可以在x和y上添加一个大数字,以便对称性发生在几乎不可能的遥远位置。这样:
hashVal = hash((x+53562345)*(y-235734093))
tileType = sum(hashVal bits) % tileCount
或者你可以使用sum(hash(x)+ hash(y))来消除对称性,但是太多的哈希算法会变得缓慢而笨重。
答案 1 :(得分:0)
我建议你使用一个动态创建图块的函数,然后将它们保存在一个对象中。 因此,每次调用该函数时,它都将从创建的对象返回值。 要保存对象,如果要创建HTML5游戏,还可以使用HTML5本地存储来保持持久性。
提案将是:
/**
* @param {number} x The x-coordinate (can be positive or negative)
* @param {number} y The y-coordinate (can be positive or negative)
* @param {number} tileCount The number of available tiles
* @return {number} The selected tile index
*/
var tiles = {};
function getRandomTileIndex(x, y, tileCount) {
var tile;
if(tiles[x][y]) {
tile = tiles[x][y];
}
else {
tile = Math.round(Math.random() * (tileCount));
tiles[x][y] = tile;
}
return tile;
}