在前面的單元中,我們成功讓棋盤具備了互動與輪流下棋的功能。今天我們要讓連成一線時(橫向)停止遊戲。
boolean gameOver = false; // 預設遊戲未結束tile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if (gameOver) return; // 遊戲若已結束,直接攔截點擊
JButton tile = (JButton)e.getSource();
if (tile.getText() == ""){
tile.setText(currentPlayer);
checkWinner(); // 檢查是否有玩家獲勝
// 只有在遊戲尚未結束時,才切換到下一位玩家
if (!gameOver){
currentPlayer = currentPlayer == playerX ? playerO : playerX;
textLabel.setText(currentPlayer + "'s turn.");
}
}
}
});
void checkWinner() {
// 水平方向檢查 (Horizontal)
for (int r = 0; r < 3; r++) {
// 1. 若該列第一個格子是空的,代表這列不可能連線,直接跳過 (continue)
if (board[r][0].getText() == "") continue;
// 2. 檢查該列的第一格、第二格與第三格內容是否完全相同
if (board[r][0].getText() == board[r][1].getText() &&
board[r][1].getText() == board[r][2].getText()){
gameOver = true; // 判定有玩家獲勝,鎖定遊戲
return;
}
}
}
說明:
* if (board[r][0].getText() == "") continue;:這是一個很聰明的效能優化!如果第一格是空的,就不用去比較後面的格子,直接跳下一列檢查。
* getText() 連續相等比較:透過 board[r][0] == board[r][1] && board[r][1] == board[r][2] 遞移律,確定三個格子填入的是同一個玩家的符號(X 或 O)。
* 成功鎖定狀態:一旦發現三連線,立即將 gameOver 設為 true 並退出方法。
void setWinner(JButton tile) {
tile.setForeground(Color.green); // 將字體顏色改為亮綠色
tile.setBackground(Color.gray); // 將按鈕背景改為灰色
textLabel.setText(currentPlayer + " is the winner!"); // 在頂端標題宣告獲勝者
}
跑出來長這樣:
*說明:X連成橫向一直線了,所以遊戲停止,並宣告獲勝者。
參考教學影片:https://youtu.be/Nc77ymnm8Ss?si=tvWAj3hiuhb38JPx