3

我正在尝试用 java 编写一个 2048 游戏。我正在尝试使它检查板是否已更改,如果已更改,它将添加到移动计数器并在板上添加一个数字。否则它不应该做任何事情。我遇到了一个错误,检查它是否已更改的方法每次都返回 true,我似乎无法弄清楚原因。

这是我的 isChecked 方法,如果电路板已更改,则该方法应返回 true,否则返回 false。

public boolean isChanged(int [][]copy,int [][]orig){
        if(copy.length!=orig.length){
            System.out.print("INVALID MOVE");
            return false;
        }
        for(int i=0;i<copy.length;i++){
            for(int j=0;j<copy[i].length;j++){
                if(copy[i][j]!=orig[i][j]) {
                    System.out.print("INVLAID MOVE");
                    return false;
                }
            }
        }
        System.out.println("VALID MOVE");
        moves++;
        return true;
    }

下面是处理左移、组合等的方法。上下左右基本相同,只是稍微改变了方向,所以我决定不将它们包含在这篇文章中,因为我觉得它们没有必要

public void shiftLeft() {
        for (int x = 0; x < board.length; x++) {
            for (int y = board[x].length-1; y>0; y--) {
                if (board[x][y -1] == 0 && board[x][y] != 0) {
                    board[x][y - 1] = board[x][y];
                    board[x][y] = 0;
                    if(y!=board[x].length-1)
                        y+=1;
                }
            }

        }
    }
    public void combineLeft() {
        for (int x = 0; x < board.length; x++) {
            for (int y =board[x].length-2; y >=0; y--) {
                if(board[x][y]==board[x][y+1]){
                    board[x][y]*=2;
                    board[x][y+1]=0;
                }
            }
        }
    }
 public void left(){
    int [][] copy=board.clone();
    shiftLeft();
    shiftLeft();
    combineLeft();
    shiftLeft();
    if(isChanged(copy,board)==true)
        addNum();
}

addNum() 只是一个将数字添加到棋盘上随机空位置的函数。board 是类变量(它们都在同一个类中),它是一个代表游戏板的 2d int 数组。

4

2 回答 2

0

检查 ischanged 函数。如果相应的值不相等,则返回 false。实际上,这意味着如果板没有更改,您将返回 false。

或者直接这样做: if(copy[i][j]==orij[i][j]) //这里我只是用“==”替换了“!=” return false;

也像@Talik 说的使用深拷贝

于 2019-02-25T18:41:24.237 回答
-1

尝试使用:

Arrays.copyOf(..)

我认为克隆只是将板阵列上的引用复制到一个新阵列中。所以每次换板子就换克隆

其他选项如下所示: How to clone a multidimensional array in java?

深拷贝方法

public static int[][] deepCopyIntMatrix(int[][] input) {
if (input == null)
    return null;
int[][] result = new int[input.length][];
for (int r = 0; r < input.length; r++) {
    result[r] = input[r].clone();
}
return result;

}

并手动克隆数组中的每一行

于 2019-02-25T18:22:30.117 回答