未知的逻辑错误

时间:2013-06-05 04:20:14

标签: actionscript-3 flash

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

我的职能:

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坐标中删除对象的游戏,我制作了这些函数以确保对象不会彼此太靠近但它似乎没有任何效果

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您尚未在tooclose内声明或更改xassignment。您应该从closetest()返回一个将被查询的布尔值。另一个逻辑错误是,您在数组中将先前的值提前1,同时递增索引。所以你有i = 0,条目[1] =条目[0]。然后i递增,条目[2] =条目[1] - bam,条目[2]也开始重新等于条目[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个randoms并且没有满足,则会强制退出该循环 - 返回最后一次尝试。