2048 изменить метод проверки Java - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь написать игру 2048 на Java.Я пытаюсь сделать так, чтобы он проверял, была ли изменена доска, и если она была изменена, она добавится к счетчику ходов и добавит число к доске.Иначе это не должно ничего делать.Я сталкиваюсь с ошибкой, когда метод, который проверяет, был ли он изменен, каждый раз возвращает 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, представляющий игровую доску.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Проверьте исправленную функцию.Вы возвращаете false, если соответствующие значения не равны.На самом деле это означает, что вы возвращаете false, если доска не изменилась.

Или просто сделайте это: if (copy [i] [j] == orij [i] [j]) // здесь я только что заменил «! =« На «==« return false;

Также как @Talik сказал использовать глубокую копию

0 голосов
/ 25 февраля 2019

попробуйте использовать:

Arrays.copyOf (..)

Я думаю, что клон просто копирует ссылку на массивы платы в новый массив.Таким образом, каждый раз, когда вы меняете доску, вы меняете клон

, другие варианты, как показано здесь: Как клонировать многомерный массив в 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;

}

и клонирование каждой строки в массиве вручную

...