优化2D游戏中的游戏对象放置

时间:2013-11-19 23:50:42

标签: algorithm embedded

我正在克隆蜈蚣游戏,但现在我正在PC上写它。

我想将蘑菇放在屏幕上随意放置,但它们不应相互重叠。

这样做的最坏情况是O(N ^ 3)算法,您可以检查每个蘑菇的蘑菇,然后检查距离或交叉点,然后采取另一个最佳随机位置。 伪代码在这里使用Actionscript:

   for (var i:int = 0; i < m_bricks.length - 1; i++)
            {
                for (var j:int = 1; j < m_bricks.length; j++)
                {
                    if (i != j)
                    {
                        while (m_bricks[i].hitTestObject(m_bricks[j]))
                        {
                            m_bricks[i].x = int((Math.random() * 200) + 45);
                            m_bricks[i].y = int((Math.random() * 200) + 45);

                        }
                    }
                }
            }

这当然是在PC上很好,但我要把它移植到一个小功率微控制器的游戏机上。

我知道解决方案是使用tilemap,但是有更好的策略来实现吗?

1 个答案:

答案 0 :(得分:3)

您可以使用linear congruential generator(LCG)执行此操作,这是在有限范围内生成长序列的明显随机数的简单方法。

基本公式为 x n +1 =( a · x n + c )mod m

已经表明,只要满足certain conditions,该过程将生成包括从0到 m -1的每个数字的序列( c m 是相对素数, a -1可被 m 的所有素因子整除,如果 m 是4的倍数,那么 a -1也必须是4的倍数。

如果你使 m 等于游戏区域的大小(宽度×高度),那么这将为你提供一系列坐标,这些坐标在整个可能性集合之前不会重复覆盖。这意味着检查与其他蘑菇的碰撞是完全没有必要的。您可以通过使用不同的“种子”值 x 0 (0≤ x 0 <启动LCG来随机化游戏玩法/ sub>&lt; m )。

例如,如果你的游戏区域包含200×200个单元格,你可以设置 m = 40000, a = 14081和 c = 15207。在C中,您的代码看起来像这样:

/** LCG parameters for m = 40000: **/
#define LCG_MODULUS    40000  /* m */
#define LCG_MULTIPLIER 14081  /* a */
#define LCG_INCREMENT  15207  /* c */

int lcg(int arg) {
  static int x = 0;
  if (!arg) return x;      /* arg=0: return last value */
  if (arg < 0) x = -arg;   /* arg=-n: seed with value of n */
  x = (LCG_MULTIPLIER * x + LCG_INCREMENT) % LCG_MODULUS;
  return x;
}

  :

/* Get new random coordinates */
r = lcg(1);
x = r % 200;
y = r / 200;