Не проходит по 3 пункту и казалось где тут можно ошибиться. Может я не правильно понимаю это требование? Гуру JR выручайте!
package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
public class Game2048 extends Game {
private static final int SIDE = 4;
private boolean isGameStopped = false;
private int[][] gameField;
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
public void createGame() {
//
// -_-
gameField = null;
gameField = new int[SIDE][SIDE];
for (int j = 0; j < SIDE; j++) {
for (int i = 0; i < SIDE; i++) {
gameField[j][i] = 0;
}
}
createNewNumber();
//showField();
}
/* private void showField() {
for (int j = 0; j < SIDE; j++) {
for (int i = 0; i < SIDE; i++) {
System.out.print(gameField[j][i] + " ");
}
System.out.println();
}
System.out.println(" ---- ");
}*/
@Override
public void onKeyPress(Key key) {
if (!isGameStopped) {
if (canUserMove()) {
switch (key) {
case LEFT:
moveLeft();
drawScene();
break;
case RIGHT:
moveRight();
drawScene();
break;
case UP:
moveUp();
drawScene();
break;
case DOWN:
moveDown();
drawScene();
}
} else {
gameOver();
}
} else if (key.equals(Key.SPACE)) {
createGame();
drawScene();
isGameStopped = false;
}
}
public void moveLeft() {
boolean isFieldChanged = false;
for (int j = 0; j < SIDE; j++) {
isFieldChanged = isFieldChanged | compressRow(gameField[j]);
isFieldChanged = isFieldChanged | mergeRow(gameField[j]);
isFieldChanged = isFieldChanged | compressRow(gameField[j]);
}
if (isFieldChanged) {
createNewNumber();
}
//showArray();
}
public void moveRight() {
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
}
public void moveUp() {
rotateClockwise();
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
}
public void moveDown() {
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
rotateClockwise();
}
public void createNewNumber() {
if (getMaxTileValue() == 2048) win();
int randX = 0;
int randY = 0;
do {
randX = getRandomNumber(SIDE);
randY = getRandomNumber(SIDE);
} while (gameField[randY][randX] != 0);
int randValue = getRandomNumber(10);
if (randValue == 9) gameField[randY][randX] = 4;
else if (randValue >= 0 && randValue <= 8) gameField[randY][randX] = 2;
}
public void drawScene() {
for (int j = 0; j < gameField.length; j++) {
for (int i = 0; i < gameField[j].length; i++) {
setCellColoredNumber(i, j, gameField[j][i]);
}
}
}
public Color getColorByValue(int value) {
switch (value) {
case 2:
return Color.PINK;
case 4:
return Color.PEACHPUFF;
case 8:
return Color.BLUE;
case 16:
return Color.AQUA;
case 32:
return Color.GAINSBORO;
case 64:
return Color.GREEN;
case 128:
return Color.ORANGE;
case 256:
return Color.BROWN;
case 512:
return Color.RED;
case 1024:
return Color.BLUEVIOLET;
case 2048:
return Color.GOLD;
case 0:
return Color.GRAY;
default:
return null;
}
}
public void setCellColoredNumber(int x, int y, int value) {
if (value != 0) {
setCellValueEx(x, y, getColorByValue(value), String.valueOf(value));
} else {
setCellValueEx(x, y, getColorByValue(value), "");
}
}
public boolean compressRow(int[] row) {
int zIndex = 0;
boolean isArrHaszeroes = false;
for (int i = 0; i < row.length; i++) {
if (row[i] == 0) {
zIndex = i;
isArrHaszeroes = true;
break;
}
}
int startedZIndex = zIndex;
for (int i = zIndex; i < row.length; i++) {
if (row[i] != 0 && isArrHaszeroes) {
//swap
int temp = row[zIndex];
row[zIndex] = row[i];
row[i] = temp;
// zi++
zIndex++;
}
}
return zIndex != startedZIndex;
}
public boolean mergeRow(int[] row) {
boolean isChanged = false;
for (int i = 0; i < row.length - 1; i++) {
if (row[i] != 0) {
if (row[i] == row[i + 1]) {
isChanged = true;
row[i] = row[i] * 2;
row[i + 1] = 0;
}
}
}
return isChanged;
}
public void rotateClockwise() {
int[][] resArr = new int[SIDE][SIDE];
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
resArr[j][SIDE - i - 1] = gameField[i][j];
}
}
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
gameField[i][j] = resArr[i][j];
}
}
}
public int getMaxTileValue() {
int max = 0;
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (gameField[i][j] > max) {
max = gameField[i][j];
}
}
}
return max;
}
public void win() {
isGameStopped = true;
showMessageDialog(Color.GRAY, "Victory", Color.GREEN, 16);
}
public void gameOver() {
isGameStopped = true;
showMessageDialog(Color.GRAY, "Game Over", Color.RED, 16);
}
public boolean canUserMove() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (gameField[i][j] == 0) return true;
}
}
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE - 1; j++) {
if (gameField[i][j] == gameField[i][j + 1]) {
return true;
}
}
}
for (int i = 0; i < SIDE - 1; i++) {
for (int j = 0; j < SIDE; j++) {
if (gameField[i][j] == gameField[i + 1][j]) {
return true;
}
}
}
return false;
}
}