0

私はいくつかの基本を学ぼうとしている小さなプロジェクトに取り組んでおり、スペースインベーダーのクローンを作ろうとしています. 私はあまり経験がありません (これが私がこれを行っている理由です) と、これまで問題を抱えたことのない問題に遭遇しました。

私の問題はループにあります。基本的なループを使用しましたが、現在はネストされたループを使用しており、いくつかの問題が発生しています。これが私のプロジェクトを壊すコードです

    public void moveLevel(int l, ArrayList ms){
    switch(l){
    case 1:{
        centerX = 60;
        centerY = 35;
        alienArray = ms;
        moveRight = true;
        while(moveRight == true){
            x += 1;
            }
        }
    case 2:{    
        }
    }
}

役立つと思われる場合は、さらにコードを示すことができますが、基本的に、このブロックはレベル番号 (l) と、約 15 個の「エイリアン」オブジェクトを保持する配列リストを取得します。行 'x+=1' がエイリアンを動かします (各エイリアンの位置は x です)。このコードは、スイング タイマーから常に呼び出される別の関数から呼び出されます。

何が起こっているかというと、コードがこのポイントに到達すると、プログラムがフリーズしたように見えます。JPanel に反応しないボタンがあり、反応しないアプリケーションを閉じるためのホットキーがあり、マウスでアプリケーションを終了しても何も起こりません (JFrame に DefaultCloseOperation(EXIT_ON_CLOSE) を含めました)。この while ループがなくても動作します)。

以下のように、「while」という単語を「if」に置き換えると、コードは正常に機能します。

    public void moveLevel(int l, ArrayList ms){
    switch(l){
    case 1:{
        centerX = 60;
        centerY = 35;
        alienArray = ms;
        moveRight = true;
        if(moveRight == true){
            x += 1;
            }
        }
    case 2:{    
        }
    }
}

do、while ループも試しました。

問題が何であるかはわかりません。論理エラーだと思いますが、私にはかなり簡単に思えます。繰り返しますが、誰かが残りのコードを見たい場合は、投稿できます。そうでなければ、誰かが何か提案があれば、私はそれをいただければ幸いです。コードの効率性に関する具体的なアドバイスや一般的なアドバイスをお待ちしています。ありがとう

答え

以下にコメントしてくれた Ted Hopp のおかげで、コードを前進させることができました。case ステートメント内で無限ループが実行されていたようです。

これが好奇心旺盛な人のための私の修正です。元の投稿から関数を呼び出す関数を含めました。

    public void move(int l, ArrayList ms){
    level = l;
    alienArray = ms;
    moveLevel(level, alienArray);

    centerX += horizontal;
    centerY += vertical;
    x += horizontal;
    y += vertical;
    if(moveRight == true){
        horizontal = 1;
        vertical = 0;
        System.out.println(centerX);
    }
    else x -= 1;
}
public void moveLevel(int l, ArrayList ms){
    switch(l){
    case 1:{
        alienArray = ms;
        moveRight = true;
        if(moveRight == true){
            if (centerX > 300){
                moveRight = false;  
            }
        if(moveRight == false){
            if(centerX < 100){
            }
        }
        }
        }
    break;
    case 2:{

    }
    }
}

これは基本的に、すべてのエイリアンを右に移動してここまで停止するだけですが、元の問題を過ぎてしまいました。

4

2 に答える 2

4

無限ループがあります:

moveRight = true;
while(moveRight == true){
    x += 1;
}

なぜならmoveRightとしてループに入り、を繰り返し実行するtrueことで になることはありません。falsex += 1;

連続した動きを右にアニメートするために何かを取得しようとしているようです。ただし、ループではコードの他の部分 (レンダリングを含む) を実行できないため、これは実行する方法ではありません。コード構造について詳しく知らなければ、具体的なアドバイスを提供することは困難ですが、アニメーション ループについて読むことをお勧めします。Web 上には、このテーマに関するチュートリアル リソースがたくさんあります。Java swing animation loopなどを探します。

break;また、各ケースの最後にステートメントが必要なようです。

于 2013-08-07T00:57:04.040 に答える
1

あなたloopは、現在の状態では無限です。boolean変数moveRightが に設定される条件が必要ですfalse

于 2013-08-07T01:09:00.310 に答える