我有一个2d字符数组,表示类似于俄罗斯方块的游戏板。当连续三个或更多时,我从电路板上移除块。现在,我想基本上删除块之间的空格。所以我想从右下角开始,然后向上移动每一列,然后移动到下一列。当我到达空白时,'。我需要把一切都拆掉。
以下是我尝试使用
的方法public void boardGravity() {
for (int j = c - 1; j > 0; j--) {
for (int i = r - 1; i > 0; i--) {
if (board[i][j] != '.') {
int count = 0;
while(isEmpty(i + count + 1, j)) {
count++;
}
board[i + count][c] = board[r][c];
board[r][c] = '.';
}
}
}
}
public boolean isEmpty(int row, int col) {
if (row >= 0 && col >= 0 && board[row][col] == '.') {
return true;
}
return false;
}
我很难绕过这个逻辑!我也找不到类似的东西。
编辑:以下是输出示例:
New Board Created!
.....
.....
.....
.....
.....
.....
.....
.....
.....
a....
a....
a....
a....
c....
b....
a....
a....
a....
a....
c....
b....
.....
.....
.....
a....
c....
b....
.....
.....
.....
在最后一次打印时,我需要将左上角的字符移到底部。
答案 0 :(得分:0)
实际上你不需要检测空行,它更容易做到:
public void boardGravity() {
for (int i = r - 1; i > 0; i--)
System.arraycopy(board[i - 1], 0, board[i], 0, c);
Arrays.fill(board[0], '.');
}
答案 1 :(得分:0)
您还没有显示足够的代码来提供具体答案(我们也不会为您编写代码!)但我可以为您提供一般解决方案。
你需要两个指针,一个是"写"指针,一个是"读"指针。指针很可能只是一个整数值,说明用数据索引索引的内容。
Start with both at 0.
Loop until read pointer reaches top of column
Increment the read pointer
If you find a match
Copy the value to the write pointer
Increment the write pointer.
Loop until write pointer reaches top of column
Increment the write pointer
Write a blank space
你需要计算出你自己的代码才能算作匹配 - 一个空的空间。如果你想限制读指针和写指针之间的差异(所以一切都在最多X空格中移动),或者只是想把所有东西都移到底部,你还需要弄清楚。
答案 2 :(得分:0)
通过将其分解为名称清晰的方法,您可以更轻松地完成任务。
void boardGravity(int[][] board) {
for(int column = 0; column < board.length; column++) {
columnGravity(board[column]);
}
}
void columnGravity(int[] column) {
for(int row = 0; row < column.length; column ++) {
if(isEmpty(column[row]) {
dropCells(column, row + 1);
}
}
}
......等等。
这假设你的&#34;董事会&#34;是一个列数组,您的列是底部为0的单元格数组。但是它可以适应。
如果您将数组隐藏在Board
类中并使用适合抽象的方法名与其进行交互,那么您的代码将变得更容易理解。