Здравствуйте! При запуске игры периодически заметны потери чисел при движении в любую сторону, но валидатор почему-то не проходит только проверку вправо. Не могу разобраться в каком методе ошибка.
package com.javarush.games.game2048;
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;
public class Game2048 extends Game {
private int[][] gameField = new int[SIDE][SIDE];
private static final int SIDE = 4;
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void drawScene() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
setCellColoredNumber(i, j, gameField[j][i]);
}
}
}
private void createNewNumber() {
int cell;
int xValue = getRandomNumber(SIDE);
int yValue = getRandomNumber(SIDE);
int randomNumber = getRandomNumber(10);
if (randomNumber == 9) {
cell = 4;
} else {
cell = 2;
}
gameField[xValue][yValue] = cell;
}
private Color getColorByValue(int value) {
switch (value) {
case 0:
return Color.PERU;
case 2:
return Color.SLATEGRAY;
case 4:
return Color.LINEN;
case 8:
return Color.OLIVEDRAB;
case 16:
return Color.SILVER;
case 32:
return Color.TOMATO;
case 64:
return Color.SALMON;
case 128:
return Color.THISTLE;
case 256:
return Color.FIREBRICK;
case 512:
return Color.LIGHTGOLDENRODYELLOW;
case 1024:
return Color.LAVENDER;
case 2048:
return Color.FORESTGREEN;
}
return Color.ALICEBLUE;
}
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 boolean compressRow(int[] row) {
boolean ifChanged = false;
for (int i = 0; i < row.length; i++) {
if (row[i] == 0) {
for (int j = i + 1; j < row.length; j++) {
if (row[j] != 0) {
ifChanged = true;
row[i] = row[j];
row[j] = 0;
break;
}
}
}
}
return ifChanged;
}
private boolean mergeRow(int[] row) {
boolean ifChanged = false;
for (int i = 0; i < row.length-1; i++) {
if (row[i] != 0) {
if (row[i+1] == row[i]){
ifChanged = true;
row[i] = row[i]*2;
row[i + 1] = 0;
}
}
}
return ifChanged;
}
public void onKeyPress(Key key) {
if (key == Key.LEFT) {
moveLeft();
} else if (key == Key.RIGHT) {
moveRight();
} else if (key == Key.DOWN) {
moveDown();
} else if (key == Key.UP) {
moveUp();
}
if (key == Key.LEFT || key == Key.RIGHT
|| key == Key.DOWN || key == Key.UP) {
drawScene();
}
}
private void rotateClockwise() {
int[][] temp= new int[SIDE][SIDE];
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
temp[i][j] = gameField[gameField.length-j-1][i];
}
}
gameField = temp;
}
private void moveLeft() {
int trueCounter = 0;
if (compressRow(gameField[0]) || mergeRow(gameField[0])) {
compressRow(gameField[0]);
trueCounter++;
}
if (compressRow(gameField[1]) || mergeRow(gameField[1])) {
compressRow(gameField[1]);
trueCounter++;
}
if (compressRow(gameField[2]) || mergeRow(gameField[2])) {
compressRow(gameField[2]);
trueCounter++;
}
if (compressRow(gameField[3]) || mergeRow(gameField[3])) {
compressRow(gameField[3]);
trueCounter++;
}
if (trueCounter > 0) {
createNewNumber();
}
}
private void moveRight() {
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
}
private void moveDown() {
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
rotateClockwise();
}
private void moveUp() {
rotateClockwise();
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
}
public static void main(String[] args) {
}
}