随机生成对象的算法

时间:2013-12-03 23:50:57

标签: 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 obst = rand()%obstsInBiome.size();
        obstsInBiome[obst].drawObstacle(xLoc, yLoc);
    }
}

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

1 个答案:

答案 0 :(得分:3)

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

修改

以下是根据您描述的方案我将使用的算法的描述:

我用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.
  4. 如果每个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.
    4. 详细说明步骤,我将举例:

           |--------------------------------------------------------------------------------
           |  
         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进行算法检查,具体取决于您设置游戏的方式)并相应地设置创建限制。

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