数学面积位置数半径扩散

Mathematical Area Position Number Radius Spread

本文关键字:位置      更新时间:2023-10-16

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

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

该代码所做的是起点是位置,我想在起点周围放置(数量)怪物(X = X 数量,Y = Y 数量,X = X+数量,Y = Y+数量),每个生成最多有 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 循环中,因为有时怪物无法在给定位置生成。

有时怪物会彼此相邻生成,我真的不希望这样。我想知道你们是否可以帮助我,告诉我我应该用于此类任务的数学算法是什么?

如果你有一组离散的合格生成位置(我猜你会这样做,因为你正在从中心位置加减小整数),那么你可以使用这样的算法:

  1. 列出所有符合条件的生成位置A列表,并为该列表中的每个位置列出相邻的合格生成位置。
  2. 从列表中随机选择一个生成位置A
  3. 从列表A中删除选定的生成位置及其所有相邻位置。(这将防止怪物在与任何先前生成的怪物相邻的位置生成)
  4. 从步骤 2 开始重复,直到所有怪物都生成或直到没有剩余的合格生成位置(即列表A的长度为零)。

这是水库采样的一种形式。它避免了通过先进行一些预计算来查找生成位置的试错方法。因此,是使用试错法还是这种方法(或其他方法)将取决于试错法的满意或不令人满意。