Хотя я спокойно играю в игру. Где проблема?
package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
public class Game2048 extends Game {
private final static int SIDE = 4;
private int[][] gameField = new int[SIDE][SIDE];
private void createGame(){
createNewNumber();
createNewNumber();
}
private void drawScene(){
for (int y = 0; y < gameField[0].length; y++) {
for (int x = 0; x < gameField[y].length; x++) {
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
private void createNewNumber(){
int y = getRandomNumber(SIDE);
int x = getRandomNumber(SIDE);
if (gameField[x][y] == 0) {
gameField[x][y] = getRandomNumber(10) > 8 ? 4 : 2;
} else createNewNumber();
}
private Color getColorByValue(int value){
Color color = null;
switch (value) {
case 0:
color = Color.CADETBLUE;
break;
case 2:
color = Color.ALICEBLUE;
break;
case 4:
color = Color.FIREBRICK;
break;
case 8:
color = Color.MAGENTA;
break;
case 16:
color = Color.CADETBLUE;
break;
case 32:
color = Color.PERU;
break;
case 64:
color = Color.LAVENDER;
break;
case 128:
color = Color.AZURE;
break;
case 256:
color = Color.PINK;
break;
case 512:
color = Color.HONEYDEW;
break;
case 1024:
color = Color.INDIANRED;
break;
case 2048:
color = Color.VIOLET;
break;
}
return color;
}
private void setCellColoredNumber(int x, int y, int value){
setCellValueEx(x, y, getColorByValue(value), value == 0 ? "" : String.valueOf(value));
}
private boolean compressRow(int[] row) {
boolean result = false;
int[] originalRow = row;
while (originalRow[0] == 0 && originalRow[1] != 0 || (originalRow[1] == 0 && originalRow[2] != 0) || (originalRow[2] == 0 && originalRow[3] != 0)) {
for (int i = 0; i < originalRow.length - 1; i++) {
if (originalRow[i] == 0 && originalRow[i + 1] != 0) {
result = true;
int temp = originalRow[i];
originalRow[i] = originalRow[i + 1];
originalRow[i + 1] = temp;
}
}
}
return result;
}
private boolean mergeRow(int[] row){
boolean result = false;
int[] originalRow = row;
for (int i = 0; i < originalRow.length - 1; i++) {
if (originalRow[i] == originalRow[i + 1] && originalRow[i] != 0) {
result = true;
originalRow[i] = originalRow[i] + originalRow[i + 1];
originalRow[i + 1] = 0;
}
}
return result;
}
private void moveLeft(){
boolean isChanged = false;
for (int i = 0; i < SIDE; i++) {
if (compressRow(gameField[i])) {
isChanged = true;
}
if (mergeRow(gameField[i])) {
isChanged = true;
compressRow(gameField[i]);
}
}
if (isChanged) {
createNewNumber();
}
drawScene();
}
private void moveRight(){
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
drawScene();
}
private void moveUp(){
rotateClockwise();
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
drawScene();
}
private void moveDown(){
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
rotateClockwise();
drawScene();
}
private void rotateClockwise(){
int n = SIDE;
int[][] newField = new int[n][n];
for (int i = 0; i < n/2; i++) {
for (int j = i; j < n-i-1; j++) {
int tmp = gameField[i][j];
newField[i][j]=gameField[n-j-1][i];
newField[n-j-1][i]=gameField[n-i-1][n-j-1];
newField[n-i-1][n-j-1]=gameField[j][n-i-1];
newField[j][n-i-1]=tmp;
}
}
gameField = newField;
}
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
@Override
public void onKeyPress(Key key) {
switch (key){
case LEFT:
moveLeft();
break;
case RIGHT:
moveRight();
break;
case UP:
moveUp();
break;
case DOWN:
moveDown();
break;
}
}
}