Java克隆棋盘游戏
虽然还有很多关于克隆的问题,但我一直在阅读他们的答案,据我所知,我似乎已经做了人们所说的大部分事情 在我的Chequers Java游戏中,棋盘状态表示为包含Chequer类对象的2D数组。为了实现MiniMax AI,您需要创建一个搜索树,以便遍历可能的游戏状态并对其进行评估。由于某种原因,我的克隆技术没有起作用 当前发生的情况是,MiniMax算法在主游戏数组中不断移动棋盘,因此一旦它决定了要进行的最佳移动,棋盘就不再存在,并抛出空指针错误 我想知道你们中是否有人可以看看我的克隆并告诉我哪里出了问题: 游戏板构造器:Java克隆棋盘游戏,java,artificial-intelligence,clone,minimax,cloning,Java,Artificial Intelligence,Clone,Minimax,Cloning,虽然还有很多关于克隆的问题,但我一直在阅读他们的答案,据我所知,我似乎已经做了人们所说的大部分事情 在我的Chequers Java游戏中,棋盘状态表示为包含Chequer类对象的2D数组。为了实现MiniMax AI,您需要创建一个搜索树,以便遍历可能的游戏状态并对其进行评估。由于某种原因,我的克隆技术没有起作用 当前发生的情况是,MiniMax算法在主游戏数组中不断移动棋盘,因此一旦它决定了要进行的最佳移动,棋盘就不再存在,并抛出空指针错误 我想知道你们中是否有人可以看看我的克隆并告诉我哪里
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;
}
提前非常感谢!
如果我能提供更多信息,请告诉我
干杯,
Louis您没有复制二维数组。您必须记住,Java中的数组是对象,数组的数组只包含对数组对象的引用,它们可以包含对同一数组的引用 所以基本上你有两个
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];
for(int y=0;y
你能在你认为它将“克隆”某个东西的地方进行eleborate吗?在你的构造函数中,你覆盖了参数的值;您完全可以不传入参数。在你的setState
方法中,你将state
中的引用复制到一个局部变量中,然后将其丢弃。而且我认为这可能使你能够自己修复错误。由于你的反馈,编辑过程中出现了细微的差异:1)chequerBoard=newBoard;在设置状态下添加。2) 构造函数更改为只调用setState方法。尽管如此,目前的董事会正在改变,而不是一个潜在的克隆董事会在极小极大搜索。。。谢谢你迄今为止的帮助!谢谢!现在一切都好了,斯塔克又开始营救了
for (int y = 0; y < state.length; y++)
for (int x = 0; x < state[y].length; x++)
newBoard[y][x] = state[y][x];