数学面积位置数半径扩散
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 循环中,因为有时怪物无法在给定位置生成。
有时怪物会彼此相邻生成,我真的不希望这样。我想知道你们是否可以帮助我,告诉我我应该用于此类任务的数学算法是什么?
如果你有一组离散的合格生成位置(我猜你会这样做,因为你正在从中心位置加减小整数),那么你可以使用这样的算法:
- 列出所有符合条件的生成位置
A
列表,并为该列表中的每个位置列出相邻的合格生成位置。 - 从列表中随机选择一个生成位置
A
。 - 从列表
A
中删除选定的生成位置及其所有相邻位置。(这将防止怪物在与任何先前生成的怪物相邻的位置生成) - 从步骤 2 开始重复,直到所有怪物都生成或直到没有剩余的合格生成位置(即列表
A
的长度为零)。
这是水库采样的一种形式。它避免了通过先进行一些预计算来查找生成位置的试错方法。因此,是使用试错法还是这种方法(或其他方法)将取决于试错法的满意或不令人满意。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序