簡體   English   中英

為什么布爾值沒有切換?

[英]Why doesn't boolean value switch?

首先,我要感謝任何幫助。 我對Java編程比較陌生。 我構建了一個簡單的TicTacToe游戲,我遇到了一些麻煩。

每隔一段時間“X”或“O”將連續播放兩次。 我有一個布爾變量,當每個玩家轉彎時,它應該從true切換到false以將“X”改為“O”,但由於某種原因它不會隨機切換。

我認為這可能是Eclipse或其他什么問題,因為我不明白為什么它會這樣做。

以下是游戲的代碼:

public class gameMain {

    Boolean player = true;
    JPanel gameBoard;
    JButton[] b = new JButton[10];
    Font font = new Font("Arial", Font.BOLD, 99);
    ListenForButtons lfb = new ListenForButtons();

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new gameMain();
            }
        });
    }

    public gameMain() {
        JFrame j = new JFrame("TicTacToe");
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        j.setLocationRelativeTo(null);
        j.setSize(400, 400);

        gameBoard = new JPanel();
        gameBoard.setLayout(new GridLayout(3, 3));

        b[1] = new JButton("");
        b[1].addActionListener(lfb);
        b[1].setContentAreaFilled(false);
        b[1].setFont(font);
        b[1].setBorder(BorderFactory.createMatteBorder(0, 0, 2, 2, Color.BLACK));
        b[2] = new JButton("");
        b[2].addActionListener(lfb);
        b[2].setContentAreaFilled(false);
        b[2].setFont(font);
        b[2].setBorder(BorderFactory.createMatteBorder(0, 0, 2, 0, Color.BLACK));
        b[3] = new JButton("");
        b[3].addActionListener(lfb);
        b[3].setContentAreaFilled(false);
        b[3].setFont(font);
        b[3].setBorder(BorderFactory.createMatteBorder(0, 2, 2, 0, Color.BLACK));
        b[4] = new JButton("");
        b[4].addActionListener(lfb);
        b[4].setContentAreaFilled(false);
        b[4].setFont(font);
        b[4].setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, Color.BLACK));
        b[5] = new JButton("");
        b[5].addActionListener(lfb);
        b[5].setContentAreaFilled(false);
        b[5].setFont(font);
        b[5].setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, Color.BLACK));
        b[6] = new JButton("");
        b[6].addActionListener(lfb);
        b[6].setContentAreaFilled(false);
        b[6].setFont(font);
        b[6].setBorder(BorderFactory.createMatteBorder(0, 2, 0, 0, Color.BLACK));
        b[7] = new JButton("");
        b[7].addActionListener(lfb);
        b[7].setContentAreaFilled(false);
        b[7].setFont(font);
        b[7].setBorder(BorderFactory.createMatteBorder(2, 0, 0, 2, Color.BLACK));
        b[8] = new JButton("");
        b[8].addActionListener(lfb);
        b[8].setContentAreaFilled(false);
        b[8].setFont(font);
        b[8].setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, Color.BLACK));
        b[9] = new JButton("");
        b[9].addActionListener(lfb);
        b[9].setContentAreaFilled(false);
        b[9].setFont(font);
        b[9].setBorder(BorderFactory.createMatteBorder(2, 2, 0, 0, Color.BLACK));

        gameBoard.add(b[1]);
        gameBoard.add(b[2]);
        gameBoard.add(b[3]);
        gameBoard.add(b[4]);
        gameBoard.add(b[5]);
        gameBoard.add(b[6]);
        gameBoard.add(b[7]);
        gameBoard.add(b[8]);
        gameBoard.add(b[9]);

        j.add(gameBoard);
        j.setVisible(true);
    }

    public class ListenForButtons implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == b[1]) {
                setSquare(b[1]);
            }
            if (e.getSource() == b[2]) {
                setSquare(b[2]);
            }
            if (e.getSource() == b[3]) {
                setSquare(b[3]);
            }
            if (e.getSource() == b[4]) {
                setSquare(b[4]);
            }
            if (e.getSource() == b[5]) {
                setSquare(b[5]);
            }
            if (e.getSource() == b[6]) {
                setSquare(b[6]);
            }
            if (e.getSource() == b[7]) {
                setSquare(b[7]);
            }
            if (e.getSource() == b[8]) {
                setSquare(b[8]);
            }
            if (e.getSource() == b[9]) {
                setSquare(b[9]);
            }
            checkForWin();
        }
    }

    public void setSquare(JButton button) {
        if (player) {
            button.setText("X");
            player = false;
            button.removeActionListener(lfb);
        } else {
            button.setText("O");
            player = true;
            button.removeActionListener(lfb);
        }
    }

    public void checkForWin() {
        if ((b[1].getText().equals("X") && b[2].getText().equals("X") && b[3].getText().equals("X"))
                || (b[4].getText().equals("X") && b[5].getText().equals("X") && b[6].getText().equals("X"))
                || (b[7].getText().equals("X") && b[8].getText().equals("X") && b[9].getText().equals("X"))
                || (b[1].getText().equals("X") && b[4].getText().equals("X") && b[7].getText().equals("X"))
                || (b[2].getText().equals("X") && b[5].getText().equals("X") && b[8].getText().equals("X"))
                || (b[3].getText().equals("X") && b[6].getText().equals("X") && b[9].getText().equals("X"))
                || (b[1].getText().equals("X") && b[5].getText().equals("X") && b[9].getText().equals("X"))
                || (b[3].getText().equals("X") && b[5].getText().equals("X") && b[7].getText().equals("X"))) {
            JOptionPane.showMessageDialog(null, "X WINS THE GAME!", "", JOptionPane.INFORMATION_MESSAGE);
            resetBoard();
        } else if ((b[1].getText().equals("O") && b[2].getText().equals("O") && b[3].getText().equals("O"))
                || (b[4].getText().equals("O") && b[5].getText().equals("O") && b[6].getText().equals("O"))
                || (b[7].getText().equals("O") && b[8].getText().equals("O") && b[9].getText().equals("O"))
                || (b[1].getText().equals("O") && b[4].getText().equals("O") && b[7].getText().equals("O"))
                || (b[2].getText().equals("O") && b[5].getText().equals("O") && b[8].getText().equals("O"))
                || (b[3].getText().equals("O") && b[6].getText().equals("O") && b[9].getText().equals("O"))
                || (b[1].getText().equals("O") && b[5].getText().equals("O") && b[9].getText().equals("O"))
                || (b[3].getText().equals("O") && b[5].getText().equals("O") && b[7].getText().equals("O"))) {

            JOptionPane.showMessageDialog(null, "O WINS THE GAME!", "", JOptionPane.INFORMATION_MESSAGE);
            resetBoard();
        } else if (!b[1].getText().equals("") && !b[2].getText().equals("") && !b[3].getText().equals("")
                && !b[4].getText().equals("") && !b[5].getText().equals("") && !b[6].getText().equals("")
                && !b[7].getText().equals("") && !b[8].getText().equals("") && !b[9].getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Cats Game!", "", JOptionPane.INFORMATION_MESSAGE);
            resetBoard();
        }
    }

    public void resetBoard() {
        for (int i = 1; i <= b.length - 1; i++) {
            b[i].setText("");
        }
        for (int i = 1; i <= b.length - 1; i++) {
            b[i].addActionListener(lfb);
        }
        player = true;
    }
 }

ResetBoard()而不是按下每個按鈕時,最終ResetBoard()多個ActionListeners分配給那些未使用的按鈕。

這是一個示例resetBoard()方法:

    public void resetBoard() {
        // Fixed the loop index. Was: (int i = 1; i <= b.length - 1; i++)
        for (int i = 0; i < b.length; i++) {
            b[i].setText("");
            // Adding a listener only if there isn't one already
            if (b[i].getActionListeners().length < 1) 
                b[i].addActionListener(lfb);
        }
        player = true;
    }

正如@MadProgrammer建議我重構了setSquare()方法:

    public void setSquare(JButton button) {
        if (player) {
            button.setText("X");
        } else {
            button.setText("O");
        }
        button.removeActionListener(lfb);
        player = !player;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM