Сделал, через два ArrayList. Метод boolean compressRow(int[] row) проверял, он делает то, что нужно с любыми вариантами цифр. Почему валидатор не принимает 2-й пункт?
private boolean compressRow(int[] row) {
ArrayList<Integer> listRow = new ArrayList<>();
for (int i = 0; i < row.length; i++) {
listRow.add(row[i]);
}
ArrayList<Integer> copy = new ArrayList<>(listRow);
Iterator<Integer> itr = copy.iterator();
while (itr.hasNext()) {
if (itr.next() == 0) {
itr.remove();
}
}
if (copy.size() != listRow.size()) {
int difference = listRow.size() - copy.size();
for (int i = 0; i < difference; i++) {
copy.add(0);
}
}
return !listRow.equals(copy);
}package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
import java.util.ArrayList;
import java.util.Iterator;
public class Game2048 extends Game {
private static final int SIDE = 4;
private int[][] gameField = new int[SIDE][SIDE];
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
private boolean compressRow(int[] row) {
ArrayList<Integer> listRow = new ArrayList<>();
for (int i = 0; i < row.length; i++) {
listRow.add(row[i]);
}
ArrayList<Integer> copy = new ArrayList<>(listRow);
Iterator<Integer> itr = copy.iterator();
while (itr.hasNext()) {
if (itr.next() == 0) {
itr.remove();
}
}
if (copy.size() != listRow.size()) {
int difference = listRow.size() - copy.size();
for (int i = 0; i < difference; i++) {
copy.add(0);
}
}
return !listRow.equals(copy);
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void setCellColoredNumber(int x, int y, int value) {
Color color = getColorByValue(value);
if (value == 0) {
setCellValueEx(x, y, color, "");
} else {
setCellValueEx(x, y, color, String.valueOf(value));
}
}
private Color getColorByValue(int value) {
if (value == 0) {
return Color.WHITE;
} else if (value == 2) {
return Color.PINK;
} else if (value == 4) {
return Color.BLUEVIOLET;
} else if (value == 8) {
return Color.BLUE;
} else if (value == 16) {
return Color.CYAN;
} else if (value == 32) {
return Color.GREEN;
} else if (value == 64) {
return Color.LIMEGREEN;
} else if (value == 128) {
return Color.ORANGE;
} else if (value == 256) {
return Color.INDIANRED;
} else if (value == 512) {
return Color.RED;
} else if (value == 1024) {
return Color.MAGENTA;
} else if (value == 2048) {
return Color.PURPLE;
}
return Color.WHITE;
}
private void createNewNumber() {
while (true) {
int x = getRandomNumber(SIDE);
int y = getRandomNumber(SIDE);
if (gameField[y][x] == 0) {
if (getRandomNumber(10) == 9) {
gameField[y][x] = 4;
} else {
gameField[y][x] = 2;
}
break;
}
}
}
private void drawScene() {
for (int y = 0; y < gameField.length; y++) {
for (int x = 0; x < gameField[y].length; x++) {
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
}