我目前正在用Java创建一个Chess程序,试图在其中实现撤消按钮。我目前的做法是创建一个名为boardInstance的对象的数组列表,该对象存储我正在用作板的2D数组(一块2D数组的块对象)以及其他变量,例如两位国王和一个布尔值,确定当前是否是怀特的回合。每次有效移动后,都会创建一个新的boardInstance对象,并将其添加到arrayList(boardHistory)中,然后将moveCount变量(我用作索引变量)增加。按下Z键时,我的代码应该从一开始就将当前的板卡和变量更新为boardInstance中这些变量的副本,但是,在测试时,我只能观察到布尔变量已更改为与之前的举动,但董事会和其他变量似乎保持不变。
我试图使boardInstance类中的每个变量和方法都保持静态,这似乎对该问题没有任何影响,并且尝试将变量从public转换为private,反之亦然。
这是我的全部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方法中,我基于Boolean变量打印出当前的玩家回合,并使用打印命令来打印当前的movecount,这是我可以辨别出代码的那些部分是否有效的方法,但是除了该板外,whiteKingPosition和backKingPosition似乎都没有变化,没有错误消息产生。