類似連連看/五子棋判邏輯,在二維數字陣列中尋找連續 3 個以上的相同數字。本文提供橫向、縱向、左斜 (/)、右斜 (\) 四個方向的檢測函數,採用座標映射與陣列索引技巧,適合遊戲邏輯、圖像識別預處理等場景。
$data = [
['01','02','18','29','31','32'],
['02','09','11','22','24','27'],
['07','16','26','27','29','31'],
['04','05','07','10','13','25'],
['02','04','05','08','19','22'],
['03','04','15','25','26','30'],
['01','03','06','12','16','32'],
['01','05','14','17','22'],
];
$h = $v = $l = $r = [];
checkAll($data);
print_r(compact('h','v','l','r'));
function checkAll($grid) {
$rows = count($grid);
for ($r = 0; $r < $rows; $r++) {
checkHorizontal($grid[$r], $r);
if ($r > 0) {
checkVertical($grid, $r);
checkDiagL($grid, $r); // /
checkDiagR($grid, $r); // \
}
}
}
// 橫向 (同一行)
function checkHorizontal($row, $rowIdx) {
global $h;
$found = false;
for ($c = 2; $c < count($row); $c++) {
if ($row[$c] - $row[$c-2] == 2 && $row[$c] - $row[$c-1] == 1) { // 連續遞增 1
if (!$found) { $h[$rowIdx] = [$row[$c-2], $row[$c-1], $row[$c]]; $found = true; }
else { $h[$rowIdx][] = $row[$c]; }
}
}
}
// 縱向 (同一列)
function checkVertical($grid, $rowIdx) {
global $v;
$cols = count($grid[0]);
for ($c = 0; $c < $cols; $c++) {
$val = $grid[$rowIdx][$c];
if (isset($grid[$rowIdx-1][$c]) && $grid[$rowIdx-1][$c] == $val &&
isset($grid[$rowIdx+1][$c]) && $grid[$rowIdx+1][$c] == $val) {
$key = "$rowIdx-$c";
if (!isset($v[$key])) {
$v[$key] = [[$rowIdx-1,$val], [$rowIdx,$val], [$rowIdx+1,$val]];
} else {
$v[$key][] = [$rowIdx+1,$val];
}
// 繼續向下檢查更長序列
for ($r = $rowIdx+2; $r < count($grid); $r++) {
if (isset($grid[$r][$c]) && $grid[$r][$c] == $val) $v[$key][] = [$r,$val];
else break;
}
}
}
}
// 左斜 / (右上到左下)
function checkDiagL($grid, $rowIdx) {
global $l;
// 以 (rowIdx, c) 為中點,檢查 (rowIdx-1, c+1) 和 (rowIdx+1, c-1)
// 實作略,邏輯同縱向,座標變換為 row±1, col∓1
}
// 右斜 \ (左上到右下)
function checkDiagR($grid, $rowIdx) {
global $r;
// 座標變換 row±1, col±1
}
"$row-$col" 唯一標識一條線,避免重複記錄。$arr[$i] - $arr[$i-2] == 2 等價於連續三數。isset($grid[$r][$c]) 防止不規則陣列越界。function findSequences(array $grid, $minLen = 3, $directions = ['h','v','l','r']) {
// 返回 [方向 => [序列1, 序列2...]],序列為 [[row,col,val], ...]
// 使用統一的向量遍歷:[0,1] 橫、[1,0] 縱、[1,1] 右斜、[1,-1] 左斜
// 適合任意大小、任意數值類型 (支援字串比較)
}
完整通用版代碼較長,建議參考開源專案如 php-connect-four、tic-tac-toe-php 的判邏輯模組。