0

我正在开发一个用 C++ 编写的视频游戏,我正在尝试根据给定的半径创建怪物产卵,假设我定义了这样的位置:

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

该代码所做的是起点是位置,我想在起点周围放置(数量)怪物(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 回答