我正在创建一个通过交换原始板上同一行中的两个相邻块获得的新板。问题是新版块覆盖了原版块的内容。
例如:
int[][] origBoard = { { 0, 4, 6 }, { 5, 3, 1 }, { 2, 8, 7 } };
int[][] twinBoard = { { 0, 6, 4 }, { 5, 3, 1 }, { 2, 8, 7 } };
发生的情况是,当我断言以下内容时,origBoard 与 twinBoard 相同:
Board B = new Board(origBoard);
Board b = B.twin();
assertFalse("Calling twin() modifies the original Board.", B.equals(b));
我的代码如下:
public class Board {
private int[][] goalBoard;
private final Node node;
private class Node {
private int[][] board;
private int move;
private Node next;
}
// construct a board from an N-by-N array of blocks
// (where blocks[i][j] = block in row i, column j)
public Board(int[][] blocks) {
int N = blocks.length;
goalBoard = new int[N][N];
for (int i = 0; i < dimension(); i++) {
for (int j = 0; j < dimension(); j++) {
if (i == N - 1 && j == N - 1) {
goalBoard[i][j] = 0;
} else {
goalBoard[i][j] = N * i + (j + 1);
}
}
}
// initial node
node = new Node();
node.board = blocks;
node.move = 0;
node.next = null;
}
// board dimension N
public int dimension() {
return goalBoard.length;
}
// a board obtained by exchanging two adjacent blocks in the same row
public Board twin() {
int[][] testBoardATwin = new int[dimension()][dimension()];
testBoardATwin = node.board;
int x = node.board[0][0];
int y = node.board[0][1];
// DEFAULT
if (x != 0 && y != 0) {
testBoardATwin[0][0] = y;
testBoardATwin[0][1] = x;
}
// 2x2
if (dimension() == 2 || y == 0) {
if (x == 0 || y == 0) {
x = node.board[1][0];
y = node.board[1][1];
testBoardATwin[1][1] = x;
testBoardATwin[1][0] = y;
}
} else {
if (x == 0) {
testBoardATwin[0][1] = node.board[0][2];
testBoardATwin[0][2] = y;
}
}
Board board = new Board(testBoardATwin);
return board;
}
// does this board equal y?
public boolean equals(Object y) {
Board testBoard = (Board) y;
if (testBoard == null) {
return false;
}
for (int i = 0; i < dimension(); i++) {
for (int j = 0; j < dimension(); j++) {
if (testBoard.node.board[i][j] != node.board[i][j]) {
return false;
}
}
}
return true;
}
}
我究竟做错了什么?请帮忙。谢谢你。