关于克隆还有很多其他问题,我一直在阅读他们的答案,据我所知,我似乎已经做了大多数人在说的事情。
在我的Checkers Java游戏中,棋盘状态表示为2D Array,其中包含Checker类的对象。为了实现MiniMax AI,您需要创建搜索树以遍历可能的游戏状态并对其进行评估。由于某种原因,我的克隆技术无效。
当前发生的情况是,MiniMax算法使Checkers始终围绕主要游戏数组移动,因此一旦确定了要做出的最佳移动,Checker就不再移动了,并且会引发空指针错误。
我想知道你们中的任何人是否可以看一下我的克隆并告诉我哪里出了问题:
游戏板构造器:
public PlaySpace(Chequer[][] chequerBoard)
{
setState(chequerBoard);
}
设置状态方法:
public void setState(Chequer[][] state)
{
Chequer[][] newBoard = new Chequer[8][8];
for(int i = 0; i < state.length; i++){
newBoard[i] = state[i];
}
chequerBoard = newBoard;
}
创建一个新的游戏板并为其克隆当前状态的值:
PlaySpace child = new PlaySpace(board.returnState());
child.setState(board.returnState());
child.moveChequer(move.returnCurrentX(),move.returnCurrentY(),move.returnDestX(),move.returnDestY());
提前非常感谢您!
请让我知道是否能提供更多信息。
干杯,
路易
最佳答案
您没有在复制二维数组。您必须记住,Java中的数组是对象,数组的数组仅包含对数组对象的引用,它们可以包含对同一数组的引用。
因此,基本上有2个Chequer[][]
数组(newBoard
和state
)都包含Chequer[]
数组。但是您不是要复制Chequer[]
数组,而是将它们从一个Chequer[][]
数组分配到另一个。
这是发生的情况的示例:
Chequer[] array = new Chequer[8];
Chequer[][] arrayOfArrays1 = new Chequer[8][];
// Assign element 0 of arrayOfArrays1 with array
arrayOfArrays1[0] = array;
Chequer[][] arrayOfArrays2 = new Chequer[8][];
// Assign element 0 of arrayOfArrays2 with arrayOfArrays1[0] == array
arrayOfArrays2[0] = arrayOfArrays1[0];
现在,
arrayOfArrays1[0]
和arrayOfArrays2[0]
都引用相同的array
对象,并且修改array
将在两个二维数组中对其进行更改。您要做的是使用二维循环访问内部数组中的元素:
for (int y = 0; y < state.length; y++)
for (int x = 0; x < state[y].length; x++)
newBoard[y][x] = state[y][x];