0

我假设这是一个逻辑错误,因为它不返回任何编译器或运行时错误。

我的职能:

function closetest() {
   tooclose=false;
   for (i=0; i<10; i++) {
    if (Math.abs(entry[0]-entry[i])<100) {
        tooclose=true;
     }
   }
}

function xassignment() {
  for (i=0; i<10; i++) {
    entry[i+1]=entry[i];
  }
  do {
      entry[0] = int(Math.random()*(stage.stageWidth - 30));
      closetest();
  } while (tooclose == false);
}

这里是调用函​​数的地方

mcMain.addEventListener(Event.ENTER_FRAME, moveChar);
function moveChar(event:Event):void {
if (gameOver == false) {
    if (enemyTime < enemyLimit) {
        enemyTime++;
    } else {
        var newEnemy = new Enemy();
        xassignment();
        newEnemy.y=-1*newEnemy.height;
        newEnemy.x=entry[0];
        addChild(newEnemy);
        enemyTime=0;
    }
}
}

我正在制作一个游戏,其中涉及从随机生成的 x 坐标中放置对象,我制作了这些函数以确保对象不会被放置得太近,但它似乎没有任何效果。

4

2 回答 2

0

你还没有描述你观察到的效果,但我注意到了这一点:

for (i=0; i<10; i++) {
    if (Math.abs(entry[0]-entry[i])<100) {
        tooclose=true;
    }
}

这将导致tooclose始终为真,因为您的循环从 0 开始,因此您entry[0]与自身进行比较。尝试从 1 开始循环。

于 2013-06-05T04:24:09.010 回答
0

您尚未tooclosexassignment. 相反,您应该返回一个从中closetest()查询的布尔值。另一个逻辑错误是,您将数组中的先前值提高 1,同时增加索引。所以你有 i=0,entry[1]=entry[0]。然后i递增,entry[2]=entry[1] - bam,entry[2] 也开始等于 entry[0]!依此类推,因此整个条目数组现在等于上一次尝试滚动的内容,而不是存储 10 个之前的值。也解决了这个问题。

function closetest():Boolean {
    for (var i:int=1; i<10; i++) {
        if (Math.abs(entry[0]-entry[i])<100) 
            return true;
    }
    return false;
}
function xassignment() {
    for (i=10; i>0; i--) entry[i]=entry[i-1];
    do {
        entry[0] = int(Math.random()*(stage.stageWidth - 30));
    } while(closetest());
}

但请注意,如果您的closetest实现将收到一个[X,100,300,500,700]数组,则循环将是无限的,因为没有 X 位置可以满足您的绝对差值 100 的范围。因此,使用以下方法修复它:

function xassignment() {
    for (i=10; i>0; i--) entry[i]=entry[i-1];
    var loops:int=10;
    do {
        entry[0] = int(Math.random()*(stage.stageWidth - 30));
        loops--;
    } while((loops>0)&&closetest());
}

如果我们尝试了 10 个随机数并且没有一个满意,这将强制退出该循环 - 最后一次尝试被返回。

于 2013-06-05T09:46:39.800 回答