Метод отлично работает.
Есть варианты, что мог упустить?
package com.javarush.games.game2048;
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.*;
public class Game2048 extends Game {
private static final int SIDE = 4;
private int [][] gameField = new int[SIDE][SIDE];
@java.lang.Override
public void initialize() {
super.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++)
//setCellColor(i,j,Color.AQUA);
setCellColoredNumber(i, j, gameField[j][i]);
}
private void createNewNumber(){
int x,y;
do {
x = getRandomNumber(SIDE);
y = getRandomNumber(SIDE);
} while (gameField[x][y] != 0); // поиск свободной ячейки
if (getRandomNumber(10) == 9) {
gameField[x][y] = 4;
//setCellValue(x, y, "4");
} else {
gameField[x][y] = 2;
// setCellValue(x, y, "2");
}
}
private Color getColorByValue(int value){
if (value == 2) return Color.CORNSILK;
else if (value == 4) return Color.CORAL;
else if (value == 8) return Color.GOLD;
else if (value == 16) return Color.TOMATO;
else if (value == 32) return Color.CRIMSON;
else if (value == 64) return Color.CHOCOLATE;
else if (value == 128) return Color.BROWN;
else if (value == 256) return Color.DARKBLUE;
else if (value == 512) return Color.INDIGO;
else if (value == 1024) return Color.LIGHTSKYBLUE;
else if (value == 2048) return Color.SNOW;
else return Color.WHEAT;
}
private void setCellColoredNumber(int x, int y, int value){
if (value == 0) setCellValueEx(x, y, getColorByValue(value), "");
else setCellValueEx(x, y, getColorByValue(value), String.valueOf(value));
}
private boolean compressRow(int[] row){
int number;
int leftShift = 1;
boolean isRow = false;
for (int i = 1; i < row.length; i++) {
if (row[i] != 0) { // число?
while ( row[i-leftShift] == 0){ // пока слева 0
number = row[i-leftShift+1]; // запоминаем число
row[i-leftShift+1] = row[i-leftShift]; // меняем с 0 местами
row[i-leftShift] = number; // число ставим вперед
if (i-leftShift > 0)leftShift++; // если есть возможность, то сдвинем влево курсор
isRow = true;
}
}
}
return isRow;
}
}