Не понимаю, что не так? Кажется отрабатывает все правильно. Код получился лаконичный и логичный, а валидацию не проходит.
package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
import java.util.LinkedList;
import java.util.Queue;
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 void createGame(){
createNewNumber();
createNewNumber();
}
private void drawScene(){
for (int y=0; y<SIDE; y++){
for (int x=0; x<SIDE; x++){
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
private void createNewNumber(){
int x = getRandomNumber(SIDE);
int y = getRandomNumber(SIDE);
int random = getRandomNumber(10);
if (gameField[y][x] == 0) {
if (random == 9) {
gameField[y][x] = 4;
}
else if (random < 9) {
gameField[y][x] = 2;
}
}
else if (gameField[y][x] != 0) {
createNewNumber();
}
}
private Color getColorByValue(int value){
switch (value) {
case (0):
return Color.SKYBLUE;
case (2):
return Color.WHEAT;
case (4):
return Color.SILVER;
case (8):
return Color.BLUEVIOLET;
case (16):
return Color.DARKGRAY;
case (32):
return Color.SALMON;
case (64):
return Color.ALICEBLUE;
case (128):
return Color.ROYALBLUE;
case (256):
return Color.RED;
case (512):
return Color.FIREBRICK;
case (1024):
return Color.AZURE;
case (2048):
return Color.BEIGE;
default:
return Color.SKYBLUE;
}
}
private void setCellColoredNumber(int x, int y, int value){ //
Color color = getColorByValue(value);
if (value!=0){
setCellValueEx(x, y, color, ""+value);
}
else{
setCellValueEx(x, y, color, "");
}
}
private boolean compressRow(int[] row){ //сдвиг
boolean result=false;
Queue <Integer> predictor = new LinkedList();
for (int rowNumber = 0; rowNumber < SIDE; rowNumber++) {
if (row[rowNumber] == 0) {
predictor.add(rowNumber);
}
else if (rowNumber != 0) {
if (predictor.peek()!=null) {
row[predictor.poll()] = row[rowNumber];
predictor.add(rowNumber);
row[rowNumber] = 0;
result=true;
}
}
}
return result;
}
private boolean mergeRow(int[] row){ //сложение
boolean result=false;
for (int rowNumber = 1; rowNumber < SIDE; rowNumber++) {
if (row[rowNumber]==row[rowNumber-1]&&row[rowNumber]!=0) {
row[rowNumber-1]=row[rowNumber-1]*2;
row[rowNumber]=0;
result=true;
}
}
return result;
}
public void onKeyPress(Key key){
if (key==Key.LEFT) {
moveLeft();
drawScene();
}
if (key.equals(Key.RIGHT)){
moveRight();
drawScene();
}
if (key.equals(Key.UP)) {
moveUp();
drawScene();
}
if (key.equals(Key.DOWN)) {
moveDown();
drawScene();
}
}
private void moveLeft(){
boolean result=false;
for (int y=0; y<gameField.length; y++){
while (compressRow(gameField[y]) | mergeRow(gameField[y])) {
compressRow(gameField[y]);
result=true;
}
}
if (result){
createNewNumber();
}
}
private void moveRight(){
}
private void moveUp(){
}
private void moveDown(){
}
}