計算時間の面では、各勝者の位置を直接チェックすることです。もちろん、ラウンドを修正することでこれをスピードアップし、ユーザーがこのラウンドにマークを置いた位置を含む勝者の位置のみをチェックすることができます。ここで
すべての勝ち位置や加工方法されています
public boolean hasWinner() {
return
(board[0] != null && board[0] == board[1] && board[0] == board[2])
||(board[3] != null && board[3] == board[4] && board[3] == board[5])
||(board[6] != null && board[6] == board[7] && board[6] == board[8])
||(board[0] != null && board[0] == board[3] && board[0] == board[6])
||(board[1] != null && board[1] == board[4] && board[1] == board[7])
||(board[2] != null && board[2] == board[5] && board[2] == board[8])
||(board[0] != null && board[0] == board[4] && board[0] == board[8])
||(board[2] != null && board[2] == board[4] && board[2] == board[6]);
}
指標としてボードを識別する:
0 1 2
3 4 5
6 7 8
としてはそれがある(プレイヤーがboard[4]
でそのマークを配置した場合、言いましたあなたがチェックする必要があるでしょう:
(board[3] != null && board[3] == board[4] && board[3] == board[5])
||(board[1] != null && board[1] == board[4] && board[1] == board[7])
||(board[0] != null && board[0] == board[4] && board[0] == board[8])
||(board[2] != null && board[2] == board[4] && board[2] == board[6])
それは2つのstrai ghtと2つの対角の勝利シナリオ。その他の勝利シナリオはboard[4]
の影響を受けず、このラウンドでは勝利を収めることはできません。
Map<Index, Set<WinningScenarios>>
を使用すると、インデックスなどを確認してすべてのシナリオにアクセスできます。あなたのボードが大きい場合は、チェックする必要のある他のポジションを直接計算することもできます。
ゲームが停止し、両方が緩んでいるかどうかを確認するために、配置されたマーク(またはラウンド)の数を覚えて、毎回増加させることができます。カウンタがboard.length
に達すると、すべてのフィールドが設定されます。
これには2種類の回答があります。最初は実装ベースです。どのような実装を使用していますか? 2番目は一般的な答えです。私はあなたが少なくとも1回は各ブロックを横断しなければならないと思います –