二次元配列の基本
二次元配列は、一次元配列を要素として持つ配列であり、表形式のデータ構造として扱われます。行と列の概念を持ち、行列演算やゲームボードの管理など、複数の応用シーンで利用されます。
二次元配列の宣言方法
以下のようにして二次元配列を宣言および初期化できます。
// 行と列のサイズを指定
int[][] data = new int[3][4];
// 行ごとに列を個別に割り当て
int[][] data = new int[3][];
data[0] = new int[4];
data[1] = new int[4];
data[2] = new int[4];
// 初期値を直接代入
int[][] data = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
五目並べにおける応用例
五目並べのボードは、二次元配列を使って表現するのが自然です。各マスに置かれた石の状態を記録することで、重複配置のチェックや勝敗判定を行うことができます。
public int[][] board = new int[size][size];
// sizeはボードの縦横のマス数
// 初期値は0で、1は黒石、2は白石を示す
// chessXとchessYはクリック座標から算出された位置
if (board[chessY][chessX] != 0) {
JOptionPane.showMessageDialog(null, "すでに石が置かれています");
return;
}
勝敗判定の実装
横方向と斜め方向を調べて、同一色の石が5つ連続しているかを確認します。縦方向や他の斜め方向の判定は同様のロジックで実装可能です。
public void mouseClick(MouseEvent e) {
int moveCount = 0;
int x = e.getX();
int y = e.getY();
if (moveCount % 2 == 0) {
stoneColor = Color.BLACK;
board[gridY][gridX] = 1;
} else {
stoneColor = Color.WHITE;
board[gridY][gridX] = 2;
}
moveCount++;
}
左右方向のチェック
以下は、現在の石を中心に左右方向に連続する石を確認する処理です。
public int checkHorizontal() {
int count = 0;
// 左方向を確認
for (int i = gridX; i >= 0; i--) {
if (board[gridY][i] == board[gridY][gridX]) {
count++;
} else {
break;
}
}
// 右方向を確認
for (int i = gridX + 1; i < board.length; i++) {
if (board[gridY][i] == board[gridY][gridX]) {
count++;
} else {
break;
}
}
return count;
}
斜め方向のチェック
斜め方向のチェックでは、XとY座標の両方を同時に変化させます。
public int checkDiagonal() {
int count = 0;
// 左上方向を確認
for (int i = gridY, j = gridX; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == board[gridY][gridX]) {
count++;
} else {
break;
}
}
// 右下方向を確認
for (int i = gridY + 1, j = gridX + 1; i < board.length && j < board.length; i++, j++) {
if (board[i][j] == board[gridY][gridX]) {
count++;
} else {
break;
}
}
return count;
}