数学区位置数半径扩展

时间:2013-10-16 03:19:19

标签: c++ position spread

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

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

该代码的作用是起点是位置,我想在起点附近放置(数量)怪物(X = X-Amount,Y = Y-Amount,X = X + Amount,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 个答案:

答案 0 :(得分:0)

如果你有一组离散的符合条件的产卵位置(考虑到你要从中心位置添加和减去小整数,我猜你做了),那么你可以使用这样的算法:

  1. 列出所有符合条件的产卵位置的清单A,并列出该清单中每个位置的相邻合格产卵位置。
  2. 从列表A中随机选择一个产卵位置。
  3. 从列表A中删除所选的生成位置及其所有相邻位置。 (这将防止怪物在任何先前产生的怪物附近的位置产卵)
  4. 从步骤2开始重复,直到所有怪物都产生或者没有剩余的合格产卵位置(即列表A的长度为零)。
  5. 这是reservoir sampling的一种形式。它通过先进行一些预先计算来避免尝试找错生成位置的试错方法。因此,是否使用反复试验或这种方法(或其他方法)将取决于试错方法的满意程度或不满意程度。