我正在克隆蜈蚣游戏,但现在我正在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,但是有更好的策略来实现吗?
答案 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;