0

私は C++ で書かれたビデオ ゲームに取り組んでおり、特定の半径に基づいてモンスターのスポーンを作成しようとしています。たとえば、次のような位置を定義するとします。

Position ( X, Y, Z ) Amount ( Value )

そのコードが行うことは、開始点が位置であり、開始点の周りに (Amount) モンスターを配置したい (X = X-Amount、Y = Y-Amount、X = X+Amount、Y = Y+Amount)、スポーンごとに最大 9 匹のモンスターが出現します。

私が今使っているコードはかなり初心者です:

// 1000 tries because I'm using random numbers
for (int i = 0; i < 1000; i++)
{
    toPlace = centerPos;

    toPlace.x = uniform_random(centerPos.x-monsterAmount, centerPos.x+monsterAmount);
    toPlace.y = uniform_random(centerPos.y-monsterAmount, centerPos.y+monsterAmount);

    if (Monster->CanSpawnAt(toPlace))
    {
        Monster->Spawn();
        break;
    }
}

位置計算はmonsterAmount(ユーザーが定義したモンスターの数)を使用しているため、モンスターが3体の場合、後ろに-3、前に+3の位置になります。

ランダムな値を使用しているため、1000 の for ループ内にいるのは悪いことです。モンスターが指定された位置にスポーンできないことがあるためです。

また、モンスターが隣り合ってスポーンすることもありますが、私は本当にそれを望んでいません。この種のタスクに使用する必要がある数学的アルゴリズムを教えてください。

4

1 に答える 1

0

個別の適格なスポーン位置のセットがある場合 (中心位置から小さな整数を加算および減算していることを考えると、そうであると推測しています)、次のようなアルゴリズムを使用できます。

  1. すべての適格なスポーン位置のリストAを作成し、そのリスト内の各位置に隣接する適格なスポーン位置のリストを作成します。
  2. リストからスポーン位置をランダムに選択しますA
  3. 選択したスポーン位置とそれに隣接するすべての位置を list から削除しますA。(これにより、以前にスポーンしたモンスターに隣接する位置にモンスターがスポーンするのを防ぎます)
  4. ステップ 2 から、すべてのモンスターがスポーンするか、スポーン位置がなくなるまで (つまり、リストの長さAがゼロになるまで) 繰り返します。

これは貯水池サンプリングの一種です。最初に事前計算を行うことで、スポーン位置を見つけるための試行錯誤のアプローチを回避します。したがって、試行錯誤を行うか、この方法 (または他の方法) を使用するかは、試行錯誤のアプローチがどれだけ満足できるか、不十分であるかによって異なります。

于 2013-10-16T03:41:33.047 に答える