Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java克隆棋盘游戏_Java_Artificial Intelligence_Clone_Minimax_Cloning - Fatal编程技术网

Java克隆棋盘游戏

Java克隆棋盘游戏,java,artificial-intelligence,clone,minimax,cloning,Java,Artificial Intelligence,Clone,Minimax,Cloning,虽然还有很多关于克隆的问题,但我一直在阅读他们的答案,据我所知,我似乎已经做了人们所说的大部分事情 在我的Chequers Java游戏中,棋盘状态表示为包含Chequer类对象的2D数组。为了实现MiniMax AI,您需要创建一个搜索树,以便遍历可能的游戏状态并对其进行评估。由于某种原因,我的克隆技术没有起作用 当前发生的情况是,MiniMax算法在主游戏数组中不断移动棋盘,因此一旦它决定了要进行的最佳移动,棋盘就不再存在,并抛出空指针错误 我想知道你们中是否有人可以看看我的克隆并告诉我哪里

虽然还有很多关于克隆的问题,但我一直在阅读他们的答案,据我所知,我似乎已经做了人们所说的大部分事情

在我的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];