iT邦幫忙

0

Day29 | 遊戲開發(八)

  • 分享至 

  • xImage
  •  

今天要設定平手的情況。


  • 新增回合計數器:turns 變數
    首先,我們在類別屬性區塊中新增一個 turns 變數來計算總下棋步數:
int turns = 0; // 記錄目前總共下了幾步(最大為 9)

接著,在玩家每次點擊成功、成功填入棋子時,將 turns 進行遞增(turns++):

if (tile.getText() == ""){
    tile.setText(currentPlayer);
    turns++; // 每下一子,回合數 +1
    
    checkWinner(); // 檢查是否有贏家或平手
    
    if (!gameOver){
        currentPlayer = currentPlayer == playerX ? playerO : playerX;
        textLabel.setText(currentPlayer + "'s turn.");
    }
}
  • 擴充 checkWinner():實作平局判定與 setTie()
    在 checkWinner() 方法的最底部,如果前面所有勝負條件(水平、垂直、對角線)都沒有成立,我們就檢查 turns == 9。若步數達到 9 步代表棋盤已滿且無人獲勝,便觸發平手特效:
// 如果 9 格全滿且沒有人獲勝,判定為平手 (Tie)
if (turns == 9) {
    for (int r = 0; r < 3; r++) {
        for (int c = 0; c < 3; c++) {
            setTie(board[r][c]); // 遍歷所有格子套用平手樣式
        }
    }
    gameOver = true; // 鎖定遊戲
}
  • 設定平手專屬的樣子:
    仿照前面獲勝的 setWinner(),我們設計了一個專屬的 setTie() 函式,讓平手時全體棋子展現出不同的視覺風格(例如橘色字體搭配灰色背景):
void setTie(JButton tile) {
    tile.setForeground(Color.orange); // 將平局棋子字體設為橘色
    tile.setBackground(Color.gray);    // 背景設為灰色高亮
    textLabel.setText("Tie!");         // 頂部標題顯示平手
}
  • 全部程式碼:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TicTacToe {
    int boardWidth = 600;
    int boardHeight = 650; //50px for the text panel on top

    JFrame frame = new JFrame("Tic-Tac-Toe");
    JLabel textLabel = new JLabel();
    JPanel textPanel = new JPanel();
    JPanel boardPanel = new JPanel();

    JButton[][] board = new JButton[3][3];
    String playerX = "X";
    String playerO = "O";
    String currentPlayer = playerX;

    boolean gameOver = false;
    int turns = 0;

    TicTacToe(){
        frame.setVisible(true);
        frame.setSize(boardWidth, boardHeight);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        textLabel.setBackground(Color.darkGray);
        textLabel.setForeground(Color.white);
        textLabel.setFont(new Font("Arial", Font.BOLD, 50));
        textLabel.setHorizontalAlignment(JLabel.CENTER);
        textLabel.setText("Tic-Tac-Toe");
        textLabel.setOpaque(true);

        textPanel.setLayout(new BorderLayout());
        textPanel.add(textLabel);
        frame.add(textPanel, BorderLayout.NORTH);

        boardPanel.setLayout(new GridLayout(3, 3));
        boardPanel.setBackground(Color.darkGray);
        frame.add(boardPanel);

        for (int r = 0; r < 3; r++){
            for (int c = 0; c < 3; c++){
                JButton tile = new JButton();
                board[r][c] = tile;
                boardPanel.add(tile);

                tile.setBackground(Color.darkGray);
                tile.setForeground(Color.white);
                tile.setFont(new Font("Arial", Font.BOLD, 120));
                tile.setFocusable(false);

                tile.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e){
                        if (gameOver) return;
                        JButton tile = (JButton)e.getSource();
                        if (tile.getText() == ""){
                            tile.setText(currentPlayer);
                            turns++;
                            checkWinner();
                            if (!gameOver){
                                currentPlayer = currentPlayer == playerX ? playerO : playerX;
                                textLabel.setText(currentPlayer + "'s turn.");
                            }
                        }
                    }
                });
            }
        }
    }
    void checkWinner() {
        //horizontal
        for (int r = 0; r < 3; r++) {
            if (board[r][0].getText() == "") continue;

            if (board[r][0].getText() == board[r][1].getText() && 
                board[r][1].getText() == board[r][2].getText()){
                    for (int i = 0; i < 3; i++) {
                        setWinner(board[r][i]);
                    }
                    gameOver = true;
                    return;
                }
        }

        //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()){
                for (int i = 0; i < 3; i++){
                    setWinner(board[i][c]);
                }
                gameOver = true;
                return;
                }
        }

        //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;
        }

        if (turns == 9) {
            for (int r = 0; r < 3; r++) {
                for (int c = 0; c < 3; c++) {
                    setTie(board[r][c]);
                }
            }
            gameOver = true;
        }
    }

    void setWinner(JButton tile) {
        tile.setForeground(Color.green);
        tile.setBackground(Color.gray);
        textLabel.setText(currentPlayer + " is the winner!");
    }

    void setTie(JButton tile) {
        tile.setForeground(Color.orange);
        tile.setBackground(Color.gray);
        textLabel.setText("Tie!");
    }
}

  • 平手長這樣:
    https://ithelp.ithome.com.tw/upload/images/20261018/20184397ukQ7OhFnpB.png

  • 參考教學影片:https://youtu.be/Nc77ymnm8Ss?si=6zTKNG1CXbCS-grI


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言