[英]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: 更重要的是,我们将假定这是一些沙箱代码..否则,它缺少很多东西:
Board
, Piece
and Move
classes. 至少定义Board
, Piece
和Move
类。 It will make your life so great. 它将使您的生活如此美好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.