我试图创建一个遍历方形二维数组的方法,该数组接受一个参数,该参数指定方向,向上,向下,向左或向右。我已经能够将任务分成两个独立的方法;一个用于垂直穿越,一个用于水平穿越:
private void concatHorizontal(boolean left) {
int rowIndex, columnIndex, index;
for (int i=0; i<board.size(); i++) {
index = (left) ? 0 : board.get(0).size()-1;
for (int j=0; j<board.get(0).size(); j++) {
if (left) {
rowIndex = i;
columnIndex = j;
} else {
rowIndex = board.size() - 1 - i;
columnIndex = board.get(0).size() - 1 - j;
}
int val = board.get(rowIndex).get(columnIndex).getValue();
if (val != 0) {
board.get(rowIndex).get(index).setValue(val);
if (columnIndex != index) {
board.get(rowIndex).get(columnIndex).setValue(0);
}
index = (left) ? index+1 : index-1;
}
}
}
}
private void concatVertical(boolean up) {
int rowIndex, columnIndex, index;
for (int i=0; i<board.get(0).size(); i++) {
index = (up) ? 0 : board.size()-1;
for (int j=0; j<board.size(); j++) {
if (up) {
columnIndex = i;
rowIndex = j;
} else {
columnIndex = board.get(0).size() - 1 - i;
rowIndex = board.size() - 1 - j;
}
int val = board.get(rowIndex).get(columnIndex).getValue();
if (val != 0) {
board.get(index).get(columnIndex).setValue(val);
if (rowIndex != index) {
board.get(rowIndex).get(columnIndex).setValue(0);
}
index = (up) ? index+1 : index-1;
}
}
}
}
这些方法将数组中不等于0的所有值在给定的方向上尽可能地移动,就像在游戏2048中一样,但不会合并具有相同值的邻居。
正如您所看到的,我的代码既不直观也不紧凑,如果可能的话,我希望将上面的两个方法合并为一个。换句话说,它应该像下面的for循环一样,根据给定的方向遍历数组列表。
for (int i=0; i<board.size(); i++) {
for (int j=0; j<board.get(0).size(); j++) {
// Traverse to the right
}
}
for (int i=0; i<board.size(); i++) {
for (int j=board.get(0).size()-1; j>=0; j--) {
// Traverse to the left
}
}
for (int i=0; i<board.get(0).size(); i++) {
for (int j=0; j<board.size(); j++) {
// Traverse downwards
}
}
for (int i=0; i<board.get(0).size(); i++) {
for (int j=board.size()-1; j>=0; j--) {
// Traverse upwards
}
}
这是解决方案的一步(简化了对元素值的访问):
private void concatHori(boolean left) {
if( left ){
concatHori( 0, 0, 1 );
} else {
concatHori( board.size()-1, board.get(0).size()-1, -1 );
}
}
private void concatHori(int rowstart, int colstart, int inc ) {
for (int i=0; i<board.size(); i++) {
int index = colstart;
for (int j=0; j<board.get(0).size(); j++) {
int rowIndex = rowstart + inc*i;
int colIndex = colstart + inc*j;
int val = board.get(rowIndex).get(colIndex);
if (val != 0) {
board.get(rowIndex).set(index, val);
if (colIndex != index) {
board.get(rowIndex).set(colIndex, 0);
}
index += inc;
}
}
}
}
"vertical"方法也可以用同样的方式进行转换。
第二步是Horizontal和Vertical的并集,这可以通过为- then - single方法提供访问函数来完成。但是我认为结果代码会比现在多行,而且不那么直观,因此我没有添加第2步。