先前做了水平判定,今天要來做垂直判定和對角線判定。
Part 1.垂直判定
// 垂直方向檢查 (Vertical)
for (int c = 0; c < 3; c++){
// 效能優化:如果該行的第一格是空的,代表這行不可能連線,直接跳過
if (board[0][c].getText() == "") continue;
// 檢查該行的第一格、第二格與第三格內容是否完全相同
if (board[0][c].getText() == board[1][c].getText() &&
board[1][c].getText() == board[2][c].getText()){
// 若垂直連線成立,遍歷該行的 3 個按鈕並套用獲勝高亮
for (int i = 0; i < 3; i++){
setWinner(board[i][c]);
}
gameOver = true; // 鎖定遊戲狀態
return;
}
}
說明:
1. 矩陣座標思考的轉換:
* 在水平檢查中,外層迴圈控制的是列(Row),內層固定行。
* 而在垂直檢查中,外層迴圈改為控制行(Column)c,並在內部比對固定行的三個不同列(board[0][c]、board[1][c]、board[2][c])。
2. 陣列索引邊界(Index Out Of Bounds)小提醒:
* 寫程式時要特別注意,因為 3x3 陣列的索引範圍是 0 到 2,千萬不要不小心寫成 board[3][c],否則執行時會吃下紅字報錯!
3. 共用setWinner():
* 因為我們在上一篇就把變色與宣告獲勝者的邏輯封裝成 setWinner() 函式,這裡只要直接呼叫它,就能無縫套用亮綠色字體與灰色高亮背景,程式碼非常乾淨俐落(Clean Code)。
Part 2.對角線判定
// 主對角線檢查 (Diagonally)
if (board[0][0].getText() == board[1][1].getText() &&
board[1][1].getText() == board[2][2].getText() &&
board[0][0].getText() != "") {
// 若連線成立,透過迴圈將對角線的三個按鈕套用勝利高亮
for (int i = 0; i < 3; i++){
setWinner(board[i][i]);
}
gameOver = true;
return;
}
// 反對角線檢查 (Anti-diagonally)
if (board[0][2].getText() == board[1][1].getText() &&
board[1][1].getText() == board[2][0].getText() &&
board[0][2].getText() != "") {
// 依序對反對角線的三個按鈕套用高亮特效
setWinner(board[0][2]);
setWinner(board[1][1]);
setWinner(board[2][0]);
gameOver = true;
return;
}
說明:
1. 防呆檢查 != "" 的重要性:
在比對對角線時,因為遊戲剛開始棋盤全部都是空白(""),如果不加上 board[0][0].getText() != "" 的限制,遊戲一開場就會誤判「全都是空白等於連線」而直接宣告勝利!因此確保格子「不是空的」是斜線檢查的關鍵防呆。
2. 複用 setWinner():
不管是哪一種連線方式,只要一經確認,我們都能立刻呼叫共用的 setWinner() 方法,將字體轉為亮綠色、背景轉為灰色,並在頂端標題精準秀出贏家宣告。
跑出來長這樣:

參考教學影片:https://youtu.be/Nc77ymnm8Ss?si=8hG1DdqmX_lk7frl