Исполняющий метод у нас initialize, но в нем мы не вызываем такие необходимые для работы игры методы, например как mergeRow или onKeyPress. Каким образом тогда программа исправно работает и запускает игру?
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];
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void drawScene() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
setCellColoredNumber(j, i, gameField[i][j]);
}
}
}
private void createNewNumber() {
while (true) {
int x = getRandomNumber(SIDE);
int y = getRandomNumber(SIDE);
if (gameField[y][x] == 0) {
int tmp = getRandomNumber(10);
gameField[y][x] = tmp == 9 ? 4 : 2;
break;
} else
continue;
}
}
private void setCellColoredNumber(int x, int y, int value) {
Color color = getColorByValue(value);
String str = value > 0 ? "" + value : "";
setCellValueEx(x, y, color, str);
}
private Color getColorByValue(int value) {
if (value == 0)
return Color.WHITE;
else if (value == 2)
return Color.YELLOW;
else if (value == 4)
return Color.ORANGE;
else if (value == 8)
return Color.LIGHTPINK;
else if (value == 16)
return Color.DEEPPINK;
else if (value == 32)
return Color.RED;
else if (value == 64)
return Color.DARKRED;
else if (value == 128)
return Color.BLUE;
else if (value == 256)
return Color.DARKBLUE;
else if (value == 512)
return Color.LIMEGREEN;
else if (value == 1024)
return Color.DARKGREEN;
else
return Color.CORAL;
}
private boolean compressRow(int[] row) {
int zero = 0;
boolean result = false;
for (int x = 0; x < SIDE; x++) {
if (row[x] > 0) {
if (x != zero) {
row[zero] = row[x];
row[x] = 0;
result = true;
}
zero++;
}
}
return result;
}
private boolean mergeRow(int[] row) {
boolean result = false;
if (row[0] == row[1] && row[0] != 0) {
row[0] = row[0] + row[1];
row[1] = 0;
result = true;
}
if (row[1] == row[2] && row[1] != 0) {
row[1] = row[1] + row[2];
row[2] = 0;
result = true;
}
if (row[2] == row[3] && row[2] != 0) {
row[2] = row[2] + row[3];
row[3] = 0;
result = true;
}
return result;
}
public void onKeyPress(Key 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() {
int count = 0;
boolean change = false;
for (int[] row : gameField) {
if (compressRow(row))
change = true;
if (mergeRow(row))
change = true;
if (compressRow(row))
change = true;
}
if (change) {
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[][] original = new int[SIDE][SIDE];
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
original[j][SIDE - 1 - i] = gameField[i][j];
}
}
gameField = original;
}
}