0

这是函数定义:

/**
 * @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)并将朝他想要的任何方向向外移动 - 我将只有固定数量的背景图块用于“地面” -我希望它每次加载游戏时世界看起来都一样。

4

2 回答 2

2

如果你想引入“可预测的随机性”,那么听起来你想要一个哈希。可预测的随机性是矛盾的,因为真正的随机性是不可预测的,所以我们称它为未知但确定性。

该算法如下所示:

  1. 使用算法(SHA-256、md5等)为给定位置散列一些唯一值对(x*Y)我来说听起来不错(但这会引入一些对称性——(1,1)映射到与(-1 -1)
  2. 使用返回值的某些属性返回一个 tileCount 数
    • 也许sum(bits of hash) % tileCount

为了解决对称性问题,您可以在 x 和 y 中添加一个大数,以便对称发生在几乎不可能遥远的位置。所以:

hashVal = hash((x+53562345)*(y-235734093))
tileType = sum(hashVal bits) % tileCount

或者您可以使用 sum(hash(x)+hash(y)) 来消除对称性,但是太多的哈希算法会变得缓慢而笨重。

于 2013-05-17T20:37:23.907 回答
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;
 }
于 2013-05-17T20:44:46.740 回答