これは私が持っていた以前の質問のフォローアップです。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();
}