java - 制作一个 java 2048 游戏,滑动时它会比应有的循环次数更多,并命中已更改的测试/更改数字

标签 java loops multidimensional-array 2048

所以我有一个可靠的滑动功能,问题是(这很难解释!)它遍历了所有可能性,包括已经添加在一起的二维数组中的空格:假设有一个像这样的设置:4,4,8,2 ---向右滑动一次后,它最终会像这样:,_,16,2。然而在实际游戏中,向右滑动一次后,它应该看起来像这样:___,8,2。

基本上,我该如何解决这个问题?您不需要告诉我代码,这是我的期末项目,但我想得到一些关于为什么会发生这种情况的解释。

我尝试从右到左循环数组,但这导致数字甚至没有移动。

   processUserChoice(String i) {
    if (i.equals("d")) {
     while ((slideRight())) {
      moveRight();
     }
    }
    printBoard();
   }

   public boolean slideRight() {
    for (int i = 0; i < board.length; i++) {
     for (int j = 0; j < board[i].length - 1; j++) {
      if (board[i][j + 1] == 0 && board[i][j] != 0) {
       return true;
      } else if (board[i][j + 1] == board[i][j] && board[i][j] != 0) {
       return true;
      }
     }
    }
    return false;
   }
   public void moveRight() {
    for (int i = 0; i < board.length; i++) {
     for (int j = 0; j < board[i].length - 1; j++) {
      if (board[i][j + 1] == 0 && board[i][j] != 0) {
       board[i][j + 1] = board[i][j];
       board[i][j] = 0;
      } else if (board[i][j + 1] == board[i][j] && board[i][j] != 0) {
       board[i][j + 1] = board[i][j + 1] + board[i][j];
       board[i][j] = 0;
      }
     }
    }
    //checkLose();
   }

向右滑动一次后,它应该如下所示:“___,8,2”(来自之前的示例)。

最佳答案

我过去也做过类似的事情。我会以与您目前几乎相同的方式执行此操作,但添加一个 boolean 数组来检查图 block 是否发生碰撞,并且仅合并尚未碰撞的图 block 。

class Tile {
    public int value;
    public Boolean collided;

    public Tile(int value) {
        this.value = value;
        collided = false;
    }

    public Tile attemptMerge(Tile target) {
        if (target.value == value) {
            Tile t = new Tile(value * 2);
            t.collided = true;
            return t;
        } else {
            return null;
        }
    }

    public void reset() {
        value = 0;
        collided = false;
    }
}

主更新循环中的某个位置:

void slideRight() {
    for (int row = 0; row < 4; row++) {
        for (int column = 3; column >= 0; column--) {
            Tile current = board[row][column];

            if (current.value == 0) continue;

            for (int slot = column + 1; slot < 3; slot++) {
                Tile target = board[row][slot];

                if (target.value == 0) {
                    target.value = current.value;
                    current = target;
                    board[row][slot - 1].reset();
                } else if (target.value == current.value) {
                    Tile product = target.merge(current);

                    if (!target.collided && !current.collided) {
                        current = product;
                        board[row][slot - 1].reset();
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            }
        }
    }
}

我相信类似的事情应该有效。抱歉,如果逻辑有点错误。

关于java - 制作一个 java 2048 游戏,滑动时它会比应有的循环次数更多,并命中已更改的测试/更改数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56516294/

相关文章:

java - Java中线程或进程的内存使用

Java递归循环

JQuery 子级数

PHP函数解析多维数组?

php - 代码分离悖论 : Create HTML Tree from Multi-Dimensional Array AND Keep the HTML Outside of the Recursive Function

java - 谁能帮我解决一个算法? (设置一个大范围值的权重)

java - Java 中的 AWS Lambda 字节流客户端

java - JPA-- 访问策略

r - 使用 r 中的 `for loop` 函数将 `map` 翻译成 purrr

php - 从多级数组中获取数据