这是我的代码:
public Move makeMove(int[][] board)
(...更多代码......)
int[][] nextMove = board.clone();
nextMove[i][j] = 1;
int nextMaxMove = maxMove( nextMove );
System.out.println( next max move: " + nextMaxMove + " " + maxMove( board ) );
int[][] board
是一个8x8的棋盘,我试图计算棋盘游戏中的最佳动作。
当我找到一个平等好的动作列表时,我想检查一下对手给出了我可以做的不同动作的可能性。所以我clone()
board
,编辑克隆nextMove[i][j] = 1
并在新主板上调用maxMove
函数。
println用于调试,我得到maxMove( nextMove );
和maxMove( board )
的相同结果,这是错误的..似乎nextMove
保持不变..
答案 0 :(得分:2)
这是因为您的数据结构是一个数组数组 - 在引擎盖下,它是一个引用数组。您的克隆是浅副本,因此克隆包含原始数组。 此示例代码演示了它。
int[][] x = new int[][] { { 1,3 }, { 5,7 } };
int[][] copyOfX = x.clone( );
copyOfX[1][1]=13;
for ( int i = 0; i < 2; i++ )
{
System.out.println(x[i] + "/" + copyOfX[i]);
for ( int j = 0; j < 2; j++ )
{
System.out.println(x[i][j] + "/" + copyOfX[i][j]);
}
}
解决方案是明确复制二维数组的内容,而不是使用.clone()
。