【发布时间】:2019-05-29 18:12:17
【问题描述】:
我目前正在用 Java 创建一个国际象棋程序,我正在尝试实现一个撤消按钮。我目前的方法是创建一个名为 boardInstance 的对象的数组列表,它存储我用作板的 2D 数组(一块对象的 2D 数组),以及其他变量,例如位置两个国王和一个布尔值确定当前是否轮到白方。每次有效移动后,都会创建一个新的 boardInstance 对象并将其添加到 arrayList (boardHistory) 中,并且 moveCount 变量(我将其用作索引变量)递增。当按下 Z 键时,我的代码应该将当前板和变量更新为从前一步开始的 boardInstance 中这些变量的副本,但是在测试时我只能观察到布尔变量正在更改以匹配以前的动作,但棋盘和其他变量似乎保持不变。
我尝试将 boardInstance 类中的每个变量和方法设为静态,这似乎对问题没有任何影响,以及将变量从公共转换为私有,反之亦然。
这是我的 boardInstance 类的全部内容:
public class boardInstance {
private static piece[][] boardCopy;
private boolean isWhiteTurn;
private String whiteKingPos, blackKingPos;
public boardInstance() {
}
public boardInstance(piece[][] tempBoard, boolean isWhitePlayerTurn, String whiteKingCoords, String blackKingCoords) {
boardCopy = tempBoard;
isWhiteTurn = isWhitePlayerTurn;
whiteKingPos = whiteKingCoords;
blackKingPos = blackKingCoords;
}
public static piece[][] getBoardCopy(){
return boardCopy;
}
public boolean isWhiteTurn() {
return isWhiteTurn;
}
public String getWhiteKingPos() {
return whiteKingPos;
}
public String getBlackKingPos() {
return blackKingPos;
}
}
这是在我的主类中实例化的相关变量。
ArrayList<boardInstance> boardHistory = new ArrayList<boardInstance>();
private static piece[][] board;
private static int moveCount = 0;
private static String whiteKingPosition, blackKingPosition;
这是每次有效移动后运行的代码:
moveCount++;
boardHistory.add(new boardInstance(board, isWhitesTurn, whiteKingPosition, blackKingPosition));
这是每次按下 Z 键时运行的代码:
if (e.getKeyCode()==KeyEvent.VK_Z) {
if (moveCount>0) {
moveCount--;
for (int r=0; r<board.length;r++) {
for (int c=0; c<board[0].length;c++) {
board[r][c]=boardHistory.get(moveCount).getBoardCopy()[r][c];
}
}
isWhitesTurn = boardHistory.get(moveCount).isWhiteTurn();
whiteKingPosition = boardHistory.get(moveCount).getWhiteKingPos();
blackKingPosition = boardHistory.get(moveCount).getBlackKingPos();
repaint();
}
}
我在我的paint方法中有它可以根据布尔变量打印出当前玩家回合,以及打印当前移动计数的打印命令,这是我可以辨别代码的那些部分正在工作的方式,但是除了那个板子,whiteKingPosition 和 backKingPosition 似乎没有发生变化,也没有产生错误消息。
【问题讨论】:
-
boardHistory.add(new boardInstance如果你每次都做一个新棋盘,这个棋盘如何记住它之前的棋子和位置?我认为您应该重复使用旧板。 -
向对象添加 byte[][] 不会创建副本。您需要创建对象的新实例并复制其内容。
-
检查stackoverflow.com/questions/56209975/…,我回答了一个类似的问题。