简体   繁体   中英

Java Chess, how to update board?

I am making Chess in Java, and right now, I am having problems updating the board whenever the user clicks to move a chess piece. My game logic is far from finished, I am just trying to make the GUI and mouseListener work the way I want them to first. The way I have designed my program is that the positions of the pieces are all stored in an 8 by 8 String matrix. The 64 is made up of 64 JPanel s. Every time the user clicks to move a piece, the String matrix should update and the GUI should read the matrix and update accordingly. Right now, the matrix is updating, but not the GUI. I don't know why this is happening, and I don't know how to fix it can someone please help me? Here is my code:

public class Chess extends JFrame implements MouseListener {
    private static final long serialVersionUID = 1L;

    private final BufferedImage whitePawnGUI = ImageIO.read(new File("img/WhitePawn.png"));
    private final BufferedImage whiteKnightGUI = ImageIO.read(new File("img/WhiteKnight.png"));
    private final BufferedImage whiteBishopGUI = ImageIO.read(new File("img/WhiteBishop.png"));
    private final BufferedImage whiteRookGUI = ImageIO.read(new File("img/WhiteRook.png"));
    private final BufferedImage whiteQueenGUI = ImageIO.read(new File("img/WhiteQueen.png"));
    private final BufferedImage whiteKingGUI = ImageIO.read(new File("img/WhiteKing.png"));
    private final BufferedImage blackPawnGUI = ImageIO.read(new File("img/BlackPawn.png"));
    private final BufferedImage blackKnightGUI = ImageIO.read(new File("img/BlackKnight.png"));
    private final BufferedImage blackBishopGUI = ImageIO.read(new File("img/BlackBishop.png"));
    private final BufferedImage blackRookGUI = ImageIO.read(new File("img/BlackRook.png"));
    private final BufferedImage blackQueenGUI = ImageIO.read(new File("img/BlackQueen.png"));
    private final BufferedImage blackKingGUI = ImageIO.read(new File("img/BlackKing.png"));

    private String[][] piecePositions = new String[8][8];
    private JPanel[][] boardTiles = new JPanel[8][8];
    private String lastSelected = "";
    private int lastSelectedRow = 0;
    private int lastSelectedCol = 0;

    public Chess() throws IOException {
        setTitle("Chess");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setLayout(new BorderLayout());
        getContentPane().setBackground(Color.white);

        // white pieces
        piecePositions[6][0] = "wp";
        piecePositions[6][1] = "wp";
        piecePositions[6][2] = "wp";
        piecePositions[6][3] = "wp";
        piecePositions[6][4] = "wp";
        piecePositions[6][5] = "wp";
        piecePositions[6][6] = "wp";
        piecePositions[6][7] = "wp";

        piecePositions[7][1] = "wn";
        piecePositions[7][6] = "wn";

        piecePositions[7][2] = "wb";
        piecePositions[7][5] = "wb";

        piecePositions[7][0] = "wr";
        piecePositions[7][7] = "wr";

        piecePositions[7][3] = "wq";
        piecePositions[7][4] = "wk";

        // black pieces
        piecePositions[1][0] = "bp";
        piecePositions[1][1] = "bp";
        piecePositions[1][2] = "bp";
        piecePositions[1][3] = "bp";
        piecePositions[1][4] = "bp";
        piecePositions[1][5] = "bp";
        piecePositions[1][6] = "bp";
        piecePositions[1][7] = "bp";

        piecePositions[0][1] = "bn";
        piecePositions[0][6] = "bn";

        piecePositions[0][2] = "bb";
        piecePositions[0][5] = "bb";

        piecePositions[0][0] = "br";
        piecePositions[0][7] = "br";

        piecePositions[0][3] = "bq";
        piecePositions[0][4] = "bk";

        System.out.println(printChessBoard(piecePositions));

        for (int row = 0; row < boardTiles.length; row++) {
            for (int col = 0; col < boardTiles[row].length; col++) {
                boardTiles[row][col] = new JPanel() {
                    private static final long serialVersionUID = 1L;

                    protected void paintComponent(Graphics g) {
                        super.paintComponent(g);
                        Graphics2D g2d = (Graphics2D) g;
                        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                }
            };
            if (row % 2 == 0) {
                if (col % 2 == 0) {
                    boardTiles[row][col].setBackground(new Color(240, 217, 181)); // light
                                                                                    // brown
                } else if (col % 2 != 0) {
                    boardTiles[row][col].setBackground(new Color(181, 136, 99)); // dark
                                                                                    // brown
                }
            } else if (row % 2 != 0) {
                if (col % 2 != 0) {
                    boardTiles[row][col].setBackground(new Color(240, 217, 181)); // light
                                                                                    // brown
                } else if (col % 2 == 0) {
                    boardTiles[row][col].setBackground(new Color(181, 136, 99)); // dark
                                                                                    // brown
                }
            }
            boardTiles[row][col].setLayout(new BorderLayout());
            final int tempRow = row;
            final int tempCol = col;
            boardTiles[row][col].addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    System.out.println("row : " + tempRow + ", col: " + tempCol);
                    if (piecePositions[tempRow][tempCol] == "wp") {
                        System.out.println("White pawn");
                        lastSelected = "wp";
                    } else if (piecePositions[tempRow][tempCol] == "wn") {
                        System.out.println("White knight");
                        lastSelected = "wn";
                    } else if (piecePositions[tempRow][tempCol] == "wb") {
                        System.out.println("White bishop");
                        lastSelected = "wb";
                    } else if (piecePositions[tempRow][tempCol] == "wr") {
                        System.out.println("White rook");
                        lastSelected = "wr";
                    } else if (piecePositions[tempRow][tempCol] == "wq") {
                        System.out.println("White queen");
                        lastSelected = "wq";
                    } else if (piecePositions[tempRow][tempCol] == "wk") {
                        System.out.println("White king");
                        lastSelected = "wk";
                    } else if (piecePositions[tempRow][tempCol] == "bp") {
                        System.out.println("Black pawn");
                        lastSelected = "bp";
                    } else if (piecePositions[tempRow][tempCol] == "bn") {
                        System.out.println("Black knight");
                        lastSelected = "bn";
                    } else if (piecePositions[tempRow][tempCol] == "bb") {
                        System.out.println("Black bishop");
                        lastSelected = "bb";
                    } else if (piecePositions[tempRow][tempCol] == "br") {
                        System.out.println("Black rook");
                        lastSelected = "br";
                    } else if (piecePositions[tempRow][tempCol] == "bq") {
                        System.out.println("Black queen");
                        lastSelected = "bq";
                    } else if (piecePositions[tempRow][tempCol] == "bk") {
                        System.out.println("Black king");
                        lastSelected = "bk";
                    } else {
                        System.out.println("Blank tile");
                        if (lastSelected != null) {
                            piecePositions[lastSelectedRow][lastSelectedCol] = null;
                            piecePositions[tempRow][tempCol] = lastSelected;
                        }
                    }
                    lastSelectedRow = tempRow;
                    lastSelectedCol = tempCol;
                    System.out.println(printChessBoard(piecePositions));
                    boardTiles[tempRow][tempCol].setBackground(new Color(255, 255, 255, 127));
                    boardTiles[tempRow][tempCol].repaint();
                }
            });
            JLabel piecePicLabel = new JLabel();
            if (piecePositions[row][col] == "wp") {
                piecePicLabel = new JLabel(new ImageIcon(whitePawnGUI));
            } else if (piecePositions[row][col] == "wn") {
                piecePicLabel = new JLabel(new ImageIcon(whiteKnightGUI));
            } else if (piecePositions[row][col] == "wb") {
                piecePicLabel = new JLabel(new ImageIcon(whiteBishopGUI));
            } else if (piecePositions[row][col] == "wr") {
                piecePicLabel = new JLabel(new ImageIcon(whiteRookGUI));
            } else if (piecePositions[row][col] == "wq") {
                piecePicLabel = new JLabel(new ImageIcon(whiteQueenGUI));
            } else if (piecePositions[row][col] == "wk") {
                piecePicLabel = new JLabel(new ImageIcon(whiteKingGUI));
            } else if (piecePositions[row][col] == "bp") {
                piecePicLabel = new JLabel(new ImageIcon(blackPawnGUI));
            } else if (piecePositions[row][col] == "bn") {
                piecePicLabel = new JLabel(new ImageIcon(blackKnightGUI));
            } else if (piecePositions[row][col] == "bb") {
                piecePicLabel = new JLabel(new ImageIcon(blackBishopGUI));
            } else if (piecePositions[row][col] == "br") {
                piecePicLabel = new JLabel(new ImageIcon(blackRookGUI));
            } else if (piecePositions[row][col] == "bq") {
                piecePicLabel = new JLabel(new ImageIcon(blackQueenGUI));
            } else if (piecePositions[row][col] == "bk") {
                piecePicLabel = new JLabel(new ImageIcon(blackKingGUI));
            }
            boardTiles[row][col].add(piecePicLabel);
            boardTiles[row][col].repaint();
        }
    }

    JPanel basePanel = new JPanel() {
        private static final long serialVersionUID = 1L;

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g; 
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            // draw the board
            g2d.drawRect(26, 0, 624, 624);
            for (int i = 0; i < 8; i++) {
                // numbers and letters labels
                g2d.setColor(Color.white);
                g2d.drawString("12345678".substring(i, i + 1), 10, i * 78 + 39);
                g2d.drawString("abcdefgh".substring(i, i + 1), i * 78 + 39 + 20, 640);
            }
        }
    };
    basePanel.setBackground(Color.black);
    basePanel.setLayout(new GridLayout(8, 8));
    basePanel.setPreferredSize(new Dimension(650, 650));
    for (int row = 0; row < boardTiles.length; row++) {
        for (int col = 0; col < boardTiles.length; col++) {
            basePanel.add(boardTiles[row][col]);
        }
    }

    getContentPane().add(basePanel);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                new Chess();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    });
}

Here is are pictures of the output:

棋盘的图片

输出到控制台的图片

Each of the 64 tiles in the chess board is a JPanel, and the images for the pieces are put in each JPanel. As you can see, when I try to move the pawn, it moves in the matrix, but not in the GUI. How do I fix this?

When you execute the move within the matrix you don't actually execute the move also within your graphical board ( JPanel[][] ).

So among other things:

// ...
} else {
    System.out.println("Blank tile");
    if (lastSelected != null) {
        piecePositions[lastSelectedRow][lastSelectedCol] = null;
        piecePositions[tempRow][tempCol] = lastSelected;
        //
        // HERE you miss something I guess <<<<<<<<<<<<<<<<<<<<<
        // Do something with boardTiles...
    }
}
// ...

Something important also: never use == or != when comparing strings or you might run into trouble (will be vicious). Instead and if you are afraid with null use the following construction:

    if("bn".equals(piecePositions[row][col])) {
         // you avoid NullPointerException that way
    }

Even more importanly we will assume this is some sandbox code.. otherwise it lacks a bunch of things:

  • Do object-oriented programming. Define at least Board , Piece and Move classes. It will make your life so great.
  • In the same time try and be able to distinguish GUI code from plain code. You could be able to debug your app easily that way and normally it must be testable in unit test and with console input/output without effort.
  • Clean your code, make methods, be happy.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM