2

Java で A* アルゴリズムを使用してパックマン ゲームを実行しています。たくさんの質問を検索しました。私は一歩のための解決策を見つけました。しかし、whileブロックでテーブルをリフレッシュしたいのですが、私の解決策は、while(計算されたすべてのステップ)の最後のステップ(結果を表示するだけ)に従ってJTableをリフレッシュすることです。しかし、ブロック中にパックマンの場所(場所)を段階的に更新して表示したい。パックマンが動いているように見える必要があります。しかし、私はできませんでした。私のコードは以下の通りです:

btnStartGame.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        //randomly placement of Pacmans
        table_1.setValueAt(yellowPacman, locationyellowX, locationyellowY);
        ...calculating heuristics
        //after calculation
        newXYellow =locationyellowX;
        newYYellow =locationyellowY+1;
        nodeYellow = 10 * newXYellow + newYYellow;
        while(heuristics != zero){  
            ...enemy pacmans' movement
            //after enemy pacmans' movement calculating yellow pacman's movement            
            if((newXYellow>=0 && newXYellow<10 && newYYellow>=0 && newYYellow<10) &&  !wallList.contains(nodeYellow)){
                //calculate heuristic again
                manhattanDistance[0][0] = Math.abs(newXYellow-locationblackX[0])+
                              Math.abs(newYYellow-locationblackX[0]);
                manhattanDistance[0][1] = Math.abs(newXYellow-locationblackX[1])+
                              Math.abs(newYYellow-locationblackX[1]);
                manhattanDistance[0][2] = Math.abs(newXYellow-locationblackX[2])+
                              Math.abs(newYYellow-locationblackX[2]);
                fyellow[0] = manhattanDistance[0][0] + manhattanDistance[0][1] + manhattanDistance[0][2];
                selectedNodeXYellow = newXYellow;
                selectedNodeYYellow = newYYellow;
                timer2.start();//updated    
                while(delay != 0)
                    delay--;
                delay = 4000; 
                locationyellowX = selectedNodeXYellow;
                locationyellowY = selectedNodeYYellow;
                nodeYellow = 10 * selectedNodeXYellow+ selectedNodeYYellow;
                timer3.start();//updated
                while(delay != 0)
                    delay--;
                delay = 10000; 
            }//ending if
        }//ending while
    }
}//ending action    
timer2 = new Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        table_1.setValueAt(null, locationyellowX, locationyellowY);//I wanted to delete old moves                
        timer2.stop();
    }    
});
timer3 = new Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        table_1.setValueAt(yellowIcon, locationyellowX, locationyellowY);//here I want to show each moves step by step in while block                
        timer3.stop();
    }    
});

更新 1: 遅延は単なるアイデアでした。アルゴリズムの計算が速すぎて、タイマーを起動できない可能性があります。しかし、それはうまくいきませんでしたし、タイマーは1秒ごとに発射されるとは思いませんか? それでも、JTable の最後の値を見てきました。

4

1 に答える 1

1

ここでの主な問題は、Java GUI アプリケーションのさまざまなスレッドがどのように機能するかを理解する必要があることだと思います。具体的には、イベント ディスパッチ スレッドでコードを実行している場合、そのコードの実行中に UI が更新されることはありません。あなたの場合、JTableに複数の更新を行ってから、最後の値を表示するディスプレイに制御を戻しています。

ここでの解決策は、タイマーの各ティックでアルゴリズムの各ステップを実行し、コントロールを返して結果を表示するタイマー要素を導入することです。詳細については、javax.swing.Timer クラスを確認してください。また、Java チュートリアルのセクション「Swing での同時実行」と「Swing タイマーの使用方法」を読むことをお勧めします。

于 2014-12-17T03:55:57.927 に答える