私はスペース、XまたはOのいずれかが入力された6 * 7 2D char配列のConnect Four "ボード"を持っています。 4つのXまたは4つのOsを縦方向、横方向または斜め方向に一列に並べる。投げずに、Java:対角線をチェックする方法Connect 4が2D配列で勝利
private char CheckVerticalWinner(char[][] currentBoard) {
// check vertical (move down one row, same column)
char vWinner = ' ';
for (int col=0; col<7; col++) {
int vCount = 0;
for (int row=0; row<5; row++) {
if (currentBoard[row][col]!=' ' &&
currentBoard[row][col] == currentBoard[row+1][col]) {
vCount++;
System.out.println("VERT "+vCount); //test
} else {
vCount = 1;
}
if (vCount>=4) {
vWinner = currentBoard[row][col];
}
}
}
return vWinner;
}
private char CheckHorizontalWinner(char[][] currentBoard) {
// check horizontal (move across one column, same row)
char hWinner = ' ';
for (int row=0; row<6; row++) {
int hCount = 0;
for (int col=0; col<6; col++) {
if (currentBoard[row][col]!=' ' &&
currentBoard[row][col] == currentBoard[row][col+1]) {
hCount++;
System.out.println("HORIZ "+hCount); //test
} else {
hCount = 1;
}
if (hCount>= 4) {
hWinner = currentBoard[row][col];
}
}
}
return hWinner;
}
私はちょうど対角線の勝利のためにチェックする方法にこだわって:私は勝利条件が勝利charは以下のようにいくつかのメソッドによって返される場合、垂直方向と水平方向のため、正常にチェックを得ることができましたArrayIndexOutOfBoundsException
Diagonals to be checked diagram基本的に
、どのようになります:私は、私は下の図のように、4つの正方形長いか以上ある後方対角線に一度、前方対角線用と1回、2回、2次元配列を反復処理する必要があります知っています私は勝利のチャーを返すためにこのメソッドを記入しますか?
private char CheckDiagonalWinner(char[][] currentBoard) {
// some iteration here
return dWinner;
}
ご協力いただければ幸いです。
はそれがボードの範囲を超えてから自分を防止する簡単な問題ではないですか? N x M板の場合、右対角線の場合は '(0,0)'の部分行列を '(N-4、M-4)'とみなし、左から右下。 –
推奨として、グリッドの開始行と列を受け入れ、少なくとも4つの値に対して特定の方向に「スキャン」するメソッドを作成することをお勧めします。行に4つの値がある場合のブール値を返すことができます。 –
ヒント:より意味のある抽象を思いついてみてください:文字の2次元配列を使うことは、あなたの目的にとって非常に低レベルの抽象です。代わりに、列挙型を使用してボード内のセルを表すことができます。言い換えれば、行列が2次元配列でなければならないという「即時」の考え方には向かないでください。あなたの細胞を整理する別の形が他のことをはるかに容易にするかもしれないと思ったら、少し時間を費やしていました。 – GhostCat