【问题标题】:Java Cloning Chequers Game BoardJava 克隆跳棋游戏板
【发布时间】:2015-11-17 14:40:28
【问题描述】:

虽然还有许多其他关于克隆的问题,但我一直在阅读他们的答案,据我所知,我似乎已经完成了人们所说的大部分内容。

在我的 Checkers Java 游戏中,棋盘状态表示为包含 Checker 类对象的 2D 数组。为了实现 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());

提前非常感谢您! 如果我能提供更多信息,请告诉我。

干杯, 路易斯

【问题讨论】:

  • 您能否详细说明您认为它将“克隆”某些东西的地方?
  • 在您的构造函数中,您将覆盖参数的值;您也可以根本不传递参数。在您的setState 方法中,您将state 中的引用复制到一个局部变量中,然后该变量被丢弃。
  • 我也认为a read through this 可能会让你自己修复错误。
  • 感谢您的反馈,在编辑中产生了细微的差异:1) chequerBoard = newBoard;以设置状态添加。 2) 构造函数改为简单地调用 setState 方法。尽管如此,在 MiniMax 搜索期间,当前的板正在更改,而不是预期的克隆板......感谢您迄今为止的帮助!

标签: java artificial-intelligence clone minimax cloning


【解决方案1】:

您没有复制二维数组。您必须记住,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];

【讨论】:

  • 非常感谢!现在一切都整理好了,stackoverflow 又来救援了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多