TICTACTOE游戏中的while循环无法正确执行

时间:2019-04-13 10:39:25

标签: java swing

我是Java编程的新手,并且正在开发一个使用Swing的简单单人TICTACTOE游戏。你是两节课。一个主要的TICTACTOE类,它使用XOButtton类来设置可以侦听单击事件的按钮。我首先创建该tictactoe类的对象,然后使用该对象调用一个名为initialCheckButton的方法,以查明是否已单击按钮3次。如果是,则调用另一种方法来确定X或O是否连续显示。如果是,则获胜。我计划对此进行进一步开发,但这只是一个模板。当GUI dsiplay播放时,单击按钮并显示连续的X或O不会显示JoptionPane的消息。有帮助吗?

public class TicTacToe extends JFrame {
    JPanel p = new JPanel();
    boolean done = false;
    XOButton buttons[] = new XOButton[9];

    public static void main(String args[]) {
        TicTacToe t = new TicTacToe();

        t.initialCheckButton();
    }

    public TicTacToe() {

        super("TicTacToe");

        setSize(400, 400);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        p.setLayout(new GridLayout(3, 3));
        for (int i = 0; i < 9; i++) {
            buttons[i] = new XOButton();
            p.add(buttons[i]);
        }
        add(p);

        setVisible(true);

    }

    public void initialCheckButton() {
        int sum = 0;

        while (sum <= 3) {

            for (int i = 0; i < 9; i++) {

                if (buttons[i].checkButtonO() == 1) {
                    sum++;
                }

                if (buttons[i].checkButtonX() == 1) {
                    sum++;
                }

            }

        }

        checkButtonFinal();

    }

    public void checkButtonFinal() {
        for (int i = 0; i < 9; i++)
            for (int j = i + 3; j < 9; j++) {
                for (int k = j + 3; k < 9; k++) {

                    if (buttons[i].checkButtonO() == buttons[j].checkButtonO() && buttons[k].checkButtonO() == 1)
                        JOptionPane.showMessageDialog(null, "Great, you won");

                    if (buttons[i].checkButtonX() == buttons[j].checkButtonX() && buttons[k].checkButtonX() == 1)
                        JOptionPane.showMessageDialog(null, "Great, you won");

                }

            }

        for (int i = 0; i < 9; i += 3) {
            if (buttons[i].checkButtonO() == buttons[i + 1].checkButtonO() && buttons[i + 2].checkButtonO() == 1)
                JOptionPane.showMessageDialog(null, "Great, you won");
            if (buttons[i].checkButtonX() == buttons[i + 1].checkButtonX() && buttons[i + 2].checkButtonX() == 1)
                JOptionPane.showMessageDialog(null, "Great, you won");

        }

        for (int i = 0; i < 9; i += 2) {
            for (int j = i + 2; j < 9; j += 2)
                for (int k = j + 2; k < 9; k += 2) {
                    if (buttons[i].checkButtonO() == buttons[j].checkButtonO() && buttons[k].checkButtonO() == 1)
                        JOptionPane.showMessageDialog(null, "Great, you won");

                    if (buttons[i].checkButtonX() == buttons[j].checkButtonX() && buttons[k].checkButtonX() == 1)
                        JOptionPane.showMessageDialog(null, "Great, you won");
                }

        }

        for (int i = 0; i < 9; i += 4) {
            for (int j = i + 4; j < 9; j += 4)
                for (int k = j + 4; k < 9; k += 4) {
                    if (buttons[i].checkButtonO() == buttons[j].checkButtonO() && buttons[k].checkButtonO() == 1)
                        JOptionPane.showMessageDialog(null, "Great, you won");
                    if (buttons[i].checkButtonX() == buttons[j].checkButtonX() && buttons[k].checkButtonX() == 1)
                        JOptionPane.showMessageDialog(null, "Great, you won");
                }

        }

    }

    public static class XOButton extends JButton implements ActionListener {
        public int buttonClicked = 0;
        public int buttonClickedX = 0;
        public int buttonClickedO = 0;

        ImageIcon X, O;
        byte value = 0;
        /*
         * 0:nothing 1:X 2:O
         */

        public XOButton() {
            X = new ImageIcon(this.getClass().getResource("X.png"));
            O = new ImageIcon(this.getClass().getResource("O.png"));
            this.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e) {

            value++;
            value %= 3;
            switch (value) {
            case 0:
                setIcon(null);
                buttonClicked = 0;
                break;
            case 1:
                setIcon(X);
                buttonClickedX = 1;
                break;
            case 2:
                setIcon(O);
                buttonClickedO = 1;
                break;
            }
        }

        public int checkButtonO() {
            return buttonClickedO;

        }

        public int checkButtonX() {
            return buttonClickedX;

        }
    }
}

1 个答案:

答案 0 :(得分:2)

以下是代码的重构版本,其中包括一些已记录的更改:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class TicTacToe extends JFrame {

    private static int ROW = 3, COLS = 3;
    private final JPanel p;
    private final XOButton buttons[];
    //static counter, so it has the same value for all button instances
    //used as a toggle between X and O
    private static int counter = 0;

    public static void main(String args[]) {
       new TicTacToe();
    }

    public TicTacToe() {

        super("TicTacToe");

        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        buttons = new XOButton[ROW*COLS];
        p = new JPanel();
        p.setLayout(new GridLayout(3, 3));
        initialize();
        add(p);
        pack();
        setVisible(true);
    }

    private void initialize(){
          for (int i = 0; i < 9; i++) {
              buttons[i] = new XOButton();
              p.add(buttons[i]);
          }
    }

    //restart game
    private void restart(){
        p.removeAll();
        initialize();
        revalidate();
    }

    private void checkButtons() {

        //many similar for loops are not easy to follow
        //refactor into methods
        XOButton[] winningButtons = checkRows();
        if( winningButtons != null) {
            won(winningButtons);
        }

        winningButtons = checkCols();
        if( winningButtons != null) {
            won(winningButtons);
        }

        winningButtons =  checkDIagonals();
        if( winningButtons != null) {
            won(winningButtons);
        }
    }

    //returns winning buttons, or null
    private XOButton[] checkRows() {

        for(int row = 0; row < buttons.length ; row +=3 ){
            int totalX = buttons[row].buttonClickedX + buttons[row+1].buttonClickedX+ buttons[row+2].buttonClickedX ;
            int totalO = buttons[row].buttonClickedO + buttons[row+1].buttonClickedO+ buttons[row+2].buttonClickedO ;
            if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[row], buttons[row+1], buttons[row+2]};
        }
        return null;
    }

    //returns winning buttons, or null
    private XOButton[] checkCols() {

        for(int col = 0; col < COLS ; col++ ){
            System.out.println(col+"-"+(col+3)+"-"+(col+6));
            int totalX = buttons[col].buttonClickedX + buttons[col+3].buttonClickedX+ buttons[col+6].buttonClickedX ;
            int totalO = buttons[col].buttonClickedO + buttons[col+3].buttonClickedO+ buttons[col+6].buttonClickedO ;
            if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[col], buttons[col+3], buttons[col+6]};
        }
        return null;
    }

    //returns winning buttons, or null
    private XOButton[] checkDIagonals() {

        int totalX = buttons[0].buttonClickedX + buttons[4].buttonClickedX+ buttons[8].buttonClickedX ;
        int totalO = buttons[0].buttonClickedO + buttons[4].buttonClickedO+ buttons[8].buttonClickedO ;
        if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[0], buttons[4], buttons[8]};

        totalX = buttons[2].buttonClickedX + buttons[4].buttonClickedX+ buttons[6].buttonClickedX ;
        totalO = buttons[2].buttonClickedO + buttons[4].buttonClickedO+ buttons[6].buttonClickedO ;
        if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[2], buttons[4], buttons[6]};

        return null;
    }

    //invoked when there is a winner
    private void won(XOButton[] winningButtons) {

        for(XOButton button : winningButtons){
            button.setBackground(Color.PINK);
        }

        JOptionPane.showMessageDialog(null, "Great, you won");
        restart(); //start new game
    }

    class XOButton extends JButton implements ActionListener {

        private int  buttonClicked = 0, buttonClickedX = 0,  buttonClickedO = 0;
        String X, O; //avoid using unavailable images when posting

        public XOButton() {
            X = "X";
            O = "O";
            this.addActionListener(this);
            setPreferredSize(new Dimension(40,40));
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            if(buttonClicked  > 0 ) return; //invoke only on first click
            buttonClicked ++;
            counter = (counter+1)%2;  //changes from 1 to 0 and back to 1

            switch (counter) {

                case 0:
                    setText(X);
                    buttonClickedX = 1;
                    break;
                case 1:
                    setText(O);
                    buttonClickedO = 1;
                    break;
            }

            checkButtons();//check buttons after every click
        }

        public int checkButtonO() {
            return buttonClickedO;
        }

        public int checkButtonX() {
            return buttonClickedX;
        }
    }
}

enter image description here