随机生成对象的算法

Algorithm to spawn objects randomly

本文关键字:算法 对象 随机      更新时间:2023-10-16

所以我正在制作一个单板滑雪游戏,当玩家骑行时,我希望地形随机生成。现在,我使用这个代码:

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);
    }
}

该功能选择生物群落中的随机障碍物,并在屏幕上的随机位置产生它,这基本上就是我想要的。然而,这会导致对象重叠等等,所以我只是想知道是否有人能帮我想出一个更好的算法来生成它们,这样它们就不会重叠?感谢

您可以预先计算出可以在不重叠的情况下生成新对象的区域,并使用该区域生成新对象位置。

编辑

以下是一个算法的描述,我会在你描述的场景中使用:

我正在用x-y地理来描绘这样的东西。其中o是有问题的对象。C创建范围

     |--------------------------------------------------------------------------------
     |     o         o
     |          o          o
     |o            o                        <-- Player moves this direction
  ^  |        o    o    o
  |  |  o               o
  y  |--------------------------------------------------------------------------------
     C   x-->

如果每个x位置只有一个对象,那么问题就相当微不足道了。在上图中,相邻的o是在y方向上具有大小的对象。

这是第二张清晰描绘单个对象的图:

     |--------------------------------------------------------------------------------
     |     7         3
     |          5          1
     |9            4                        <-- Player moves this direction
  ^  |        6    4    2
  |  |  8               2
  y  |--------------------------------------------------------------------------------
     C   x-->
  1. 生成您的第一个对象
  2. 在上一个对象未占用的区域中生成下一个对象
  3. 根据需要重复步骤2

如果每个x位置可以有多个对象,或者对象在x方向上有一定宽度:

     |--------------------------------------------------------------------------------
     |     o         o
     |            o          o
     |o         oooo                        <-- Player moves this direction
  ^  |        o       ooo
  |  |  o             ooo
  y  |--------------------------------------------------------------------------------
     C   x-->

     |--------------------------------------------------------------------------------
     |     7         3
     |     7      5          1
     |     7    4444                        <-- Player moves this direction
  ^  | 88     6       222
  |  | 88             222
  y  |--------------------------------------------------------------------------------
     C   x-->

你的重叠问题变得有点难以追踪,但它仍然可以控制。

  1. 生成您的第一个对象
  2. 检查对象,从上一个对象开始,直到第一个没有干扰或跨越创建范围C的维度的对象,并从创建新对象的位置选择池中消除它们占用的空间
  3. 重复步骤2

为了详细说明步骤,我将举一个例子:

     |--------------------------------------------------------------------------------
     |  
   11|1
   11|1                                     <-- Player moves this direction
  ^  |  
  |  |  
  y  |--------------------------------------------------------------------------------
     C   x-->

假设我们有这个场景,我们已经创建了object 1,这个对象只有三分之一在视图中,但我们可以看到,如果我们在这个对象进入视图之前创建另一个对象,这将是有问题的。为了避免重叠,我们可以选择一个随机的位置和宽度,该位置和宽度可以存在于object 1上方或下方的空间中。以下是一个有效的选择:

       |--------------------------------------------------------------------------------
       |  
      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-->

您可能不想将object 5放置在绘制object 4的位置,但对象321此时已不需要考虑。因此,您可以根据创建的最后一个对象4(可能还有3,这取决于您如何设置游戏)检查算法,并相应地设置创建限制。

当然,这是一个简化的版本控制,我想你会给自己更多的空间来创建这些对象。我希望这说明了一种算法,可以解决你遇到的问题。