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 に答える