【问题标题】:How can I efficiently shift everything in a 2d array down by a given amount?如何有效地将二维数组中的所有内容向下移动给定数量?
【发布时间】:2017-04-26 15:55:01
【问题描述】:

我有一个 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....
.....
.....
.....

在最后一张板印中,我需要将左上角的字符移到底部。

【问题讨论】:

  • 你能举一个板子的例子,你期望发生什么,以及当你运行你的代码时实际发生了什么?
  • 当然!好的,我添加了管理器的示例输出。我需要像俄罗斯方块一样向下移动游戏部分。
  • 二维数组甚至是最好的数据(最直观的)结构吗? deque 在添加第一行的同时删除最后一行应该足够简单吗?
  • 我可能在底行有一些不需要删除的部分。我是一个初学者程序员,所以我不知道 char 数组是否是最好的方法,但它是目前所有东西都使用的,也是我的 TA 推荐的。

标签: java arrays gravity shift


【解决方案1】:

其实你不需要检测空行,它更容易做到:

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], '.');
}

【讨论】:

    【解决方案2】:

    您没有显示足够的代码来给出具体的答案(而且我们也不是来为您编写代码的!)但我可以为您提供通用解决方案。

    你需要两个指针,一个是“写”指针,一个是“读”指针。指针很可能只是一个整数值,表示用什么索引数组。

    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 个空格)或者只是想将所有内容移动到底部,您还需要确定。

    【讨论】:

      【解决方案3】:

      您可以通过将任务分解为名称清晰的方法来简化任务。

       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);
                }
            }
       }
      

      ...等等。

      这假设您的“板”是一个列数组,而您的列是底部为 0 的单元格数组。但是它可以适应。

      如果您将数组隐藏在 Board 类中并使用适合抽象的方法名称与之交互,您的代码将变得更容易理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-10
        • 2013-01-26
        • 2021-06-20
        • 2019-06-17
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多