【问题标题】:Mathematical Area Position Number Radius Spread数学区域位置数半径扩展
【发布时间】:2013-10-16 03:19:19
【问题描述】:

我正在开发一个用 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 循环中,因为有时怪物无法在给定位置生成。

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

【问题讨论】:

  • 你问的是如何将一些怪物散布成一个圆圈?位置周围有 2*pi 弧度。将其除以 2*monsters+1,让您在该位置周围获得相等的分布。至于它们无法在某些区域生成,我想您将不得不为此使用碰撞检测和解决方案。
  • 我不明白 2*pi 弧度是什么意思,
  • 一个圆有 360 度或 2 倍 pi (3.14...) 弧度。我说弧度是因为大多数三角函数依赖于弧度而不是度数。
  • 问题是我没有使用圆形,我使用的是多种形状的地图、正方形、圆形等……每个生成点(X、Y)都不同。
  • 哦,这就是我问的原因。你说你试图在某个半径附近产卵。半径是圆的长度的一半。这就是为什么我将它与一个圆圈联系起来。

标签: c++ position spread


【解决方案1】:

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

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

这是reservoir sampling 的一种形式。它通过首先进行一些预计算来避免尝试和错误的方法来找到生成位置。因此,是使用试错法还是这种方法(或其他方法)将取决于试错法的满意度。

【讨论】:

  • 我现在正在获取每个怪物生成的合格位置列表,但是我不知道从给定位置获取相邻位置的最简单方法是什么。
  • 如何最好地找到相邻位置将取决于您的几何形状,但鉴于您说sometimes monsters spawn next to each other, and I really don't want that,您似乎能够确定哪些位置是next to 其他位置。因此,每个位置的相邻位置列表将只是满足next to 标准的位置列表。
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2019-02-15
相关资源
最近更新 更多