0

我的代码中有(恕我直言)一个奇怪的行为。我目前正在为井字游戏实现极小极大算法。在我的“继任者”方法中,我想确定所有可能的动作。这是代码:

private ArrayList<TicTacToeState[][]> successor(final TicTacToeState[][] field, TicTacToeState s) {
    ArrayList<TicTacToeState[][]> returnList = new ArrayList<TicTacToeState[][]>();
    for (int i = 0; i < TicTacToeGame.FIELDSIZE; i++) {
        for (int j = 0; j < TicTacToeGame.FIELDSIZE; j++) {
            if (field[i][j] == TicTacToeState.Empty) {
                TicTacToeState[][] currentCopy = new TicTacToeState[TicTacToeGame.FIELDSIZE][TicTacToeGame.FIELDSIZE];
                System.arraycopy(field, 0, currentCopy, 0, field.length);
                currentCopy[i][j] = s; // <- field seems to be referenced?!
                returnList.add(currentCopy);
            }
        }
    }
    return returnList;
}

如您所见,我想获取所有可能的移动并将它们保存到数组列表中。不幸的是,在“currentCopy”中设置值时,“字段”也发生了变化。但是该字段不应该被引用,因为我复制了数组。错误在哪里?我已经尝试在二维数组上使用 clone() 方法 - >同样的问题。

感谢您的任何帮助。

(仅供参考,TicTacToeState 是一个包括“Player1”、“Player2”和“Empty”的枚举)

4

2 回答 2

2

Java 使用浅拷贝。也就是说,你得到一个副本,但它不是你想要的。你想要一个深拷贝。尝试手动将每个元素复制到 returnList 中,看看会发生什么。

解决此问题的另一种方法是进行移动,递归,然后取消移动。然后你根本不需要复制数组。

于 2012-04-22T15:04:22.300 回答
0

您正在使用二维数组,但仅在系统数组副本中复制数组的第一维。我建议不要做所有的复制。也许用别的东西来描述可能的动作。另请注意,您不是复制数组的内容,而是复制数组。

于 2012-04-22T15:07:56.253 回答