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;
    }
}

ループは 0 から始まるため、これはtooclose常に true になるため、それ自体と比較entry[0]します。代わりに 1 からループを開始してみてください。

于 2013-06-05T04:24:09.010 に答える
0

tooclose内で宣言または変更していませんxassignmentclosetest()代わりに、照会元のブール値を返す必要があります。別の論理エラーは、インデックスをインクリメントしながら、配列内の以前の値を 1 進めていることです。つまり、i=0、entry[1]=entry[0] です。その後i、インクリメントされます。entry[2]=entry[1] - バム、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]、絶対差の範囲 100 を満たす X 位置がないため、ループは無限になります。したがって、次のように修正します。

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 に答える