简体   繁体   English

Java Chess,如何更新板子?

[英]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. 我正在用Java制作国际象棋,现在,每当用户单击移动棋子时,我在更新棋盘时都会遇到问题。 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. 我的游戏逻辑还远远没有完成,我只是想让GUI和mouseListener以我希望它们首先使用的方式工作。 The way I have designed my program is that the positions of the pieces are all stored in an 8 by 8 String matrix. 我设计程序的方式是将片段的位置全部存储在8 x 8字符串矩阵中。 The 64 is made up of 64 JPanel s. 64个由64个JPanel Every time the user clicks to move a piece, the String matrix should update and the GUI should read the matrix and update accordingly. 每次用户单击移动一块时,String矩阵应更新,GUI应读取该矩阵并进行相应更新。 Right now, the matrix is updating, but not the GUI. 目前,矩阵正在更新,而不是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. 棋盘上的64个图块中的每个图块都是一个JPanel,并且棋子的图像放置在每个JPanel中。 As you can see, when I try to move the pawn, it moves in the matrix, but not in the GUI. 如您所见,当我尝试移动pawn时,它会在矩阵中移动,但不会在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[][] ). 当您在矩阵内执行移动时,实际上也不会在图形JPanel[][]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: 相反,如果您担心使用null使用以下构造:

    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. 至少定义BoardPieceMove类。 It will make your life so great. 它将使您的生活如此美好。
  • In the same time try and be able to distinguish GUI code from plain code. 同时尝试并能够将GUI代码与纯代码区分开。 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. 清理代码,创建方法,开心一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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