2

私はJavaでチェスゲームをプログラミングしており、現時点では基本的なインターフェイスを構築しています。これは、ウィンドウに表示されるボタンの8x8配列にすぎません。これらのボタンをコーディングし、ボードが正しく表示されるようにしました。ただし、これをゲームの残りの部分に接続すると、実行時にゲームウィンドウがクラッシュし、Javaアプリケーションを強制終了する必要があります。これは私のコードです:

package Chess_Game; 
import javax.swing.SwingUtilities;
import Chess_Interface.Iboard;

public class Game_Tester 
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                    Game G = new Game();
                    Iboard I = new Iboard(G.getBoard().getArray(), G.getSides());
                    I.setVisible(true);
                    while(!(G.isGameOver()))
                    {
                        boolean redo = true;
                        while(redo)
                        {
                            int row = 0; 
                            int col = 0; 
                            int nRow = 0; 
                            int nCol = 0;
                            System.out.println("Click the piece you want to move.");
                            while(!(I.getBool())){}
                            if(I.getBool())
                            {
                                row = I.getRow();
                                col = I.getCol();
                                I.setBool(false);
                            }
                            System.out.println("Click the place you want to move to.");
                            while(!(I.getBool())){}
                            if(I.getBool())
                            {
                                nRow = I.getRow();
                                nCol = I.getCol();
                                I.setBool(false);
                            }
                            if(G.canMove(row, col, nRow, nCol))
                            {
                                G.move(row, col, nRow, nCol, I);
                                redo = false;
                            }
                            else
                            {
                                System.out.println("You cant move there! Try again!");
                            }
                        }
                        I.updateBoard(G.getBoard().getArray(), G.getSides());
                    }
            }
        });
    }
}

メインのwhileループ(およびその中のすべて)をコメントアウトすると、ボードは正しく表示されます。問題はその中のどこかにあると思いますが、見つけることができませんでした。私も同様のゲームループの問題をオンラインで探しましたが、それらはすべて、フレームレートとJavaスイングフレームを横切る動きを伴うゲームに関するものでした。これは私のコードにはありません。

どんな助けでも大歓迎です。

4

1 に答える 1

4

次のようないくつかのループがあります

while(!(I.getBool())){}

I期待どおりに応答しない場合、これは永久に実行される可能性があります。これらのループ内、および次のブロック内で何かを印刷してif(I.getBool()){...}、アプリケーションがスタックするポイントを確認することから始めることができます。

このようなループでユーザーインターフェイスをチェックすることは良い習慣ではありません。ユーザーインターフェイスに応答するには、リスナーを使用することをお勧めします。

SwingUtilities.invokeLater(new Runnable()また、別のスレッドからGUIを更新するという潜在的な問題を回避できても、を使用してSwingスレッドでメインアプリケーションを実行していません。

実際、このようにSwingスレッド(GUIの実行に使用されるスレッド)でメインアプリケーションループを実行すると、GUIが正しく応答できなくなる可能性があるため、これが根本的な問題である可能性があります。タスク(ゲーム全体)をGUIのキューに入れていますが、そのタスクが完了することはありませんwhile(!(G.isGameOver()))

于 2012-09-20T22:52:05.847 に答える