C++ 随机生成对象的算法
因此,我正在制作一个滑雪板游戏,当玩家骑下时,我希望随机生成地形。现在,我正在使用以下代码:C++ 随机生成对象的算法,c++,algorithm,random,overlap,C++,Algorithm,Random,Overlap,因此,我正在制作一个滑雪板游戏,当玩家骑下时,我希望随机生成地形。现在,我正在使用以下代码: void Biome::draw() { srand(seed); // seed is generated elsewhere for (int x = 0; x < maxObstAmount; x++) { int xLoc = rand() % 640; int yLoc = rand() % 480; int obs
void Biome::draw()
{
srand(seed); // seed is generated elsewhere
for (int x = 0; x < maxObstAmount; x++)
{
int xLoc = rand() % 640;
int yLoc = rand() % 480;
int obst = rand()%obstsInBiome.size();
obstsInBiome[obst].drawObstacle(xLoc, yLoc);
}
}
void Biome::draw()
{
srand(seed);//seed在别处生成
对于(int x=0;x
该函数选择生物群落中的随机障碍物,并在屏幕上的随机位置生成它,这基本上就是我想要的。然而,这会导致对象重叠等等,所以我想知道是否有人能帮我想出一个更好的算法来生成它们,这样它们就不会重叠了?感谢您可以计算可以生成新对象的区域,而无需事先重叠,并使用该范围生成新对象的位置 编辑: 以下是针对您描述的场景我将使用的算法的描述: 我正在用x-y地理来描绘这样的东西。其中,
o
是有问题的对象C
是创建范围
|--------------------------------------------------------------------------------
| o o
| o o
|o o <-- Player moves this direction
^ | o o o
| | o o
y |--------------------------------------------------------------------------------
C x-->
|--------------------------------------------------------------------------------
| o o
| o o
|o oooo <-- Player moves this direction
^ | o ooo
| | o ooo
y |--------------------------------------------------------------------------------
C x-->
假设我们有这个场景,我们创建了对象1
,这个对象只有三分之一在视图中,但是我们可以看到,如果我们在这个对象进入视图之前创建另一个对象,它将是有问题的。为了避免重叠,我们可以选择一个随机位置和宽度,该位置和宽度可以存在于对象1的上方或下方的空间中。以下是一个有效的选择:
|--------------------------------------------------------------------------------
|
1|11
1|11 <-- Player moves this direction
^ |
| 22 |
y |--------------------------------------------------------------------------------
C x-->
|--------------------------------------------------------------------------------
|
1|11
1|11
接下来的场景可能是这样的:
|--------------------------------------------------------------------------------
| 33
| 33 111
4|4 111 <-- Player moves this direction
^ 4|4 22
| |
y |--------------------------------------------------------------------------------
C x-->
|--------------------------------------------------------------------------------
| 33
| 33 111
4|4 111
您可能不想将对象5
放置在绘制对象4
的位置,但此时对象3
、2
和1
已经过时,不需要考虑。因此,您可以让您的算法检查创建的最后一个对象,4
,(可能还有3
,具体取决于您如何设置游戏),并相应地设置创建限制
假设这是一个简化的版本控制,我想你会给自己更多的空间来创建这些对象,我希望这说明了一个算法,可以解决你遇到的问题。你坚持什么?你不能在生成一个新的障碍物之前保留一个所有生成障碍物的列表并进行检查吗?我认为每次生成一个新的对象时循环100+次循环是没有效率的,不是吗?如果你在任何给定的时间屏幕上有100+个对象,在一个数组上循环将是你最不关心的事情。在一个包含100个对象的列表中循环100次甚至几百次将是闪电般的快。如果你愿意,你可以使用一个std::set
,这应该会快得多。嗯,好吧,我一直认为出于某种原因这是不好的,我想知道了这一点,我可以尝试更多的方法,看看它们是如何得到的。我唯一能想到的方法是每次生成一个数组时,在数组中存储一个对象位置,然后,当我生成一个新对象时,在已经使用过的位置数组中循环,但是每次生成一个新对象时循环100多次是否效率低下?@RyanMartin我认为如果你已经有了这些对象的引用,你不需要存储一个单独的数组,我假设您可以访问它们的位置和宽度,并快速计算它们。我不知道你的游戏是如何设置的,但我正在想象你有一些物体朝着一个正在下坡的滑雪板飞来。然后,您只会遇到与地平线上存在的对象重叠的情况,在那里您将生成新对象。然后你能不需要对所有100+个物体进行循环检查,而只检查靠近地平线的物体吗?我计划玩家实际上向下移动,然后障碍物生成,玩家刚好经过它们,然后在玩家到达它们之前,它们会根据需要在屏幕外生成。我想我也许能用这些想法解决一些问题,我会看看情况如何go@RyanMartin我在编辑中对我的评论做了更完整的描述。哦,我的天啊,你太棒了,这对很多人都有帮助,兄弟,我相信我现在能记住这一点。我很感谢你花时间在这篇文章上,它帮了我很多忙。谢谢
|--------------------------------------------------------------------------------
|
11|1
11|1 <-- Player moves this direction
^ |
| |
y |--------------------------------------------------------------------------------
C x-->
|--------------------------------------------------------------------------------
|
1|11
1|11 <-- Player moves this direction
^ |
| 22 |
y |--------------------------------------------------------------------------------
C x-->
|--------------------------------------------------------------------------------
| 33
| 33 111
4|4 111 <-- Player moves this direction
^ 4|4 22
| |
y |--------------------------------------------------------------------------------
C x-->