这是我的代码:
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
没有改变。
发生这种情况是因为您的数据结构是一个数组的数组-它实际上是一个引用数组。您的克隆是一个浅副本,因此克隆包含原始数组。下面的示例代码演示了它。
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()
。