Подскажите в чем проблема плиз
package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
import java.util.Arrays;
public class Game2048 extends Game {
private static final int SIDE = 4;
private int[][] gameField = new int[SIDE][SIDE];
private boolean isGameStopped = false;
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
drawScene();
createGame();
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void drawScene() {
for (int y = 0; y < gameField.length; y++) {
for (int x = 0; x < gameField.length; x++) {
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
private void createNewNumber() {
if (getMaxTileValue() == 2048) {
win();
return;
}
int y = getRandomNumber(SIDE);
int x = getRandomNumber(SIDE);
while (gameField[y][x] != 0) {
y = getRandomNumber(SIDE);
x = getRandomNumber(SIDE);
}
int randomNumber = getRandomNumber(10);
if (randomNumber == 9) {
gameField[y][x] = 4;
} else {
gameField[y][x] = 2;
}
}
private Color getColorByValue(int value) {
/*0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048.*/
switch (value) {
case 2:
return Color.VIOLET;
case 4:
return Color.MOCCASIN;
case 8:
return Color.GAINSBORO;
case 16:
return Color.SALMON;
case 32:
return Color.GREEN;
case 64:
return Color.FIREBRICK;
case 128:
return Color.YELLOW;
case 256:
return Color.DARKCYAN;
case 512:
return Color.AQUA;
case 1024:
return Color.ROSYBROWN;
case 2048:
return Color.RED;
default:
return Color.ANTIQUEWHITE;
}
}
private void setCellColoredNumber(int x, int y, int value) {
Color color = getColorByValue(value);
setCellValueEx(x, y, color, (value == 0 ? "" : String.valueOf(value)));
}
private boolean compressRow(int[] row) {
int[] copy = new int[row.length];
System.arraycopy(row, 0, copy, 0, row.length);
for (int i = 0; i < row.length - 1; i++) {
for (int j = 0; j < row.length - 1; j++) {
if (row[j] == 0) {
int tmp = row[j];
row[j] = row[j + 1];
row[j + 1] = tmp;
}
}
}
return !Arrays.equals(row, copy);
}
private boolean mergeRow(int[] row) {
int[] copy = new int[row.length];
System.arraycopy(row, 0, copy, 0, row.length);
for (int i = 0; i < row.length - 1; i++) {
if (row[i] == row[i + 1]) {
row[i] *= 2;
row[i + 1] = 0;
}
}
return !Arrays.equals(row, copy);
}
@Override
public void onKeyPress(Key key) {
switch (key) {
case LEFT:
moveLeft();
drawScene();
break;
case RIGHT:
moveRight();
drawScene();
break;
case UP:
moveUp();
drawScene();
break;
case DOWN:
moveDown();
drawScene();
break;
}
}
private void moveLeft() {
int count = 0;
for (int[] row : gameField) {
if (compressRow(row) | mergeRow(row) | compressRow(row)) {
count++;
}
}
if (count > 0) {
createNewNumber();
}
}
private void moveRight() {
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
}
private void moveUp() {
rotateClockwise();
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
}
private void moveDown() {
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
rotateClockwise();
}
private void rotateClockwise() {
int[][] copy = new int[SIDE][SIDE];
for (int i = 0; i < gameField.length; i++) {
for (int j = 0; j < gameField[i].length; j++) {
copy[i][j] = gameField[gameField.length - j - 1][i];
}
}
for (int i = 0; i < gameField.length; i++) {
for (int j = 0; j < gameField[i].length; j++) {
gameField[i][j] = copy[i][j];
}
}
}
private int getMaxTileValue() {
int max = 0;
for (int i = 0; i < gameField.length; i++) {
for (int j = 0; j < gameField[i].length; j++) {
if (max < gameField[i][j]) {
max = gameField[i][j];
}
}
}
return max;
}
private void win() {
isGameStopped = true;
showMessageDialog(Color.NONE, "YOU WIN", Color.GREEN, 40);
}
private boolean canUserMove() {
for (int i = 0; i < gameField.length; i++) {
for (int j = 0; j < gameField[i].length; j++) {
if (gameField[i][j] == 0) return true;
}
}
for (int i = 0; i < gameField.length - 1; i++) {
for (int j = 0; j < gameField[i].length - 1; j++) {
if (gameField[i][j] == gameField[i + 1][j] || gameField[i][j] == gameField[i][j + 1]) {
return true;
}
}
}
return false;
}
}
/*Игра 2048 (14/18)
Отлично! В прошлой части мы выяснили условия, при которых игра выиграна и реализовали их.
Но есть и обратная сторона медали — проигрыш. Если на игровом поле нет плитки со значением 2048 и нет возможности сделать ход, игроку засчитывается поражение.
Ход можно сделать, если есть хотя бы одна пустая плитка или пустых плиток нет, но есть возможность их соединения.
Вынеси эти проверки в метод canUserMove().
Требования:
1. В классе Game2048 должен быть создан приватный метод boolean canUserMove().
2. canUserMove() должен возвращать true, если количество нулевых элементов матрицы gameField больше нуля.
3. canUserMove() должен возвращать true, если нулевых элементов нет, но в матрице gameField есть хотя бы две соседние клетки с одинаковым значением (по горизонтали или вертикали).
4. canUserMove() должен возвращать false, если пустых плиток нет, и нет возможности соединения клеток.*/