0

これは私が持っていた以前の質問のフォローアップです。2 つのボードで戦艦ゲームをしています。ユーザーがコンピューター ボードをクリックすると、次の行に沿ってアクションが発生します。

public void mouseClicked(MouseEvent e)
// Get coordinates of mouse click

if (//Set contains cell) {
    /add Cell to set of attacked cells

//Determine if set contains attacked cell.
// If yes, hit, if no, miss.
checkForWinner();

checkForWinner メソッドは、ゲームがまだ勝ったかどうかを判断します。そうでない場合は、現在のターンを変更する nextTurn メソッドを呼び出します。currentTurn が Computer に設定されている場合、ComputerMove() メソッドが自動的に呼び出されます。
そのメソッドが終了すると、Winner を再度チェックし、ターンを変更して、ユーザーがグリッドをクリックしてサイクルを再開するのを待ちます。

理想的には、効果音、または少なくとも動作間の一時停止が必要です。しかし、Thread.sleep や TimerTask などをどのように使用しても、正しく機能させることはできません。

CheckforWinner メソッドまたは ComputerMove メソッドで単純な Thread.sleep(500) を使用すると、設定された時間だけ人間の移動が遅れるだけです。彼の動きが実行されるとすぐに、コンピューターの動きはすぐに完了します。

私はスレッドについてほとんど知りませんが、これは、メソッド間を行ったり来たりするすべての開始が、マウス リスナーのメソッドから始まるためだと思います。

私のシステムのセットアップを考えると、物事を根本的に変更せずに遅延を実装する方法はありますか?

編集:クラスを含めることもできます:

public void checkForWinner() {
    if (human.isDefeated())
        JOptionPane.showMessageDialog(null, computer.getName() + " wins!");
    else if (computer.isDefeated())
        JOptionPane.showMessageDialog(null, human.getName() + " wins!");
    else
        nextTurn();
}

public void nextTurn() {
    if (currentTurn == computer) {
        currentTurn = human;
    } else {
        currentTurn = computer;
        computerMove();
    }
}

public void computerMove() {

    if (UI.currentDifficulty == battleships.UI.difficulty.EASY)
        computerEasyMove();
    else
        computerHardMove();
}

public void computerEasyMove() {

    // Bunch of code to pick a square and determine if its a hit or not.
    checkForWinner();
}
4

1 に答える 1

1

理想的には、効果音、または少なくとも動作間の一時停止が必要です。しかし、Thread.sleep や TimerTask などをどのように使用しても、正しく機能させることはできません。

Swing Timer を使用する必要があります。何かのようなもの:

Timer timer = new Timer(1000, new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        currentTurn = computer;
        computerMove();
    }
});
timer.setRepeats(false);
timer.start();
于 2013-05-06T15:01:12.857 に答える