【问题标题】:Why is my ArrayList not returning its stored values?为什么我的 ArrayList 不返回其存储的值?
【发布时间】: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/…,我回答了一个类似的问题。

标签: java arraylist chess


【解决方案1】:

实际上,早在 1997 年,我在卡内基梅隆大学攻读第三个博士学位时就解决了同样的问题,你应该感到羞耻。尝试查看这个(相当基本的)算法,看看你是否能够理解哪里出错了:https://en.wikipedia.org/wiki/Cox%E2%80%93Zucker_machine

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2018-07-06
  • 2016-06-19
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多