Метод canUserMove() в конце программы.
Его суть:
1) первый for проверяет элементы на ноль
2) второй for проверяет рядом стоящие элементы на равенство
3) после этих проверок вертим массив по часовой стрелке и уходим в рекурсию по методу canUserMove() для проверки по пунктам 1 и 2 которые выше.
4) после четырех прокруток счетчик count == 0 и мы выходим с метода
5) кстати если в каком-то из for из 1 и 2 пункта буль принимает true в рекурсию не уходим и сразу возвращаем true
И еще, проверял я так:
1) через for заполнял массив нулями вывод true
2) через for заполнял массив двойками вывод true
3) через for заполнял массив разными числами вывод false
package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
public class Game2048 extends Game {
private static final int SIDE = 4;
private int[][] gameField = new int[SIDE][SIDE];
private boolean isGameStopped;
private int count = 4;
private boolean proverkaEndGame = false;
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
/*int[] qwe = {4, 0, 4, 0};
System.out.println(mergeRow(qwe));*/
/*for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
gameField[i][j] = count++;
}
}
System.out.println(canUserMove());*/
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void drawScene() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
setCellColoredNumber(i, j, gameField[j][i]);
}
}
}
private void createNewNumber() {
if (getMaxTileValue() == 2048){
win();
}
int x = getRandomNumber(SIDE);
int y = getRandomNumber(SIDE);
//System.out.println(x + " " + y);
if (gameField[x][y] != 0) {
createNewNumber();
} else {
int z = getRandomNumber(10);
if (z == 9) {
gameField[x][y] = 4;
} else
gameField[x][y] = 2;
}
}
private void setCellColoredNumber(int x, int y, int value) {
Color color = getColorByValue(value);
if (color != Color.WHITE)
setCellValueEx(x, y, color, value + "");
else
setCellValueEx(x, y, color, "");
}
private Color getColorByValue(int value) {
if (value == 2) {
return Color.GREEN;
} else if (value == 4) {
return Color.YELLOWGREEN;
} else if (value == 8) {
return Color.YELLOW;
} else if (value == 16) {
return Color.ORANGE;
} else if (value == 32) {
return Color.CORAL;
} else if (value == 64) {
return Color.RED;
} else if (value == 128) {
return Color.BLUE;
} else if (value == 256) {
return Color.PURPLE;
} else if (value == 512) {
return Color.BROWN;
} else if (value == 1024) {
return Color.PINK;
} else if (value == 2048) {
return Color.AQUA;
} else
return Color.WHITE;
}
@Override
public void setCellValueEx(int x, int y, Color cellColor, String value) {
super.setCellValueEx(x, y, cellColor, value);
}
private boolean compressRow(int[] row) {
boolean b = false;
for (int i = row.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (row[j] < row[j + 1] && row[j] == 0) {
int tmp = row[j + 1];
row[j + 1] = row[j];
row[j] = tmp;
b = true;
}
}
}
return b;
}
private boolean mergeRow(int[] row) {
boolean b = false;
for (int i = 0; i < row.length - 1; i++) {
if (row[i] == row[i + 1] && row[i] != 0 && row[i + 1] != 0) {
row[i] += row[i + 1];
row[i + 1] = 0;
b = true;
}
}
return b;
}
@Override
public void onKeyPress(Key key) {
super.onKeyPress(key);
if (key == Key.LEFT) {
moveLeft();
drawScene();
}
if (key == Key.RIGHT) {
moveRight();
drawScene();
}
if (key == Key.UP) {
moveUp();
drawScene();
}
if (key == Key.DOWN) {
moveDown();
drawScene();
}
}
private void moveLeft() {
boolean b = false;
for (int i = 0; i < gameField.length; i++) {
if (compressRow(gameField[i]) | mergeRow(gameField[i])) {
b = true;
}
compressRow(gameField[i]);
}
if (b) {
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 SIDE = gameField.length;
int[][] array = new int[SIDE][SIDE];
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
array[i][j] = gameField[SIDE - j - 1][i];
System.out.print(array[i][j] + " ");
}
}
gameField = array;
}
private int getMaxTileValue(){
int maxValue = 0;
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (gameField[i][j] > maxValue)
maxValue = gameField[i][j];
}
}
return maxValue;
}
private void win(){
isGameStopped = true;
showMessageDialog(Color.AQUAMARINE, "You win!", Color.BEIGE, 50);
}
private boolean canUserMove(){
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (gameField[i][j] == 0) {
proverkaEndGame = true;
}
}
}
for (int i = 0; i < SIDE - 1; i++) {
for (int j = 0; j < SIDE - 1; j++) {
if (gameField[i][j] == gameField[i + 1][j + 1]) {
proverkaEndGame = true;
}
}
}
count = count - 1;
if (count != 0 && !proverkaEndGame) {
rotateClockwise();
canUserMove();
}
return proverkaEndGame;
}
}