The rest of my code did satisfy all other requirements but not first. Any idea why?
package com.codegym.games.game2048;
import com.codegym.engine.cell.*;
import java.util.*;
public class Game2048 extends Game{
private static final int SIDE = 4;
private int[][] gameField = new int[SIDE][SIDE];
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void drawScene() {
for(int x = 0; x < SIDE; x++) {
for(int y = 0; y < SIDE; y++) {
setCellColoredNumber(y, x,gameField[x][y]);
}
}
}
private void createNewNumber() {
int x = getRandomNumber(SIDE);
int y = getRandomNumber(SIDE);
int value;
if (getRandomNumber(10) == 9) {
value = 4;
}
else {
value = 2;
}
if (gameField[x][y] == 2 || gameField[x][y] == 4) {
createNewNumber();
}
else {
gameField[x][y] = value;
}
}
private Color getColorByValue(int value) {
//return a cell color based on value
switch(value) {
case 0:
return Color.WHITE;
case 2:
return Color.BLUE;
case 4:
return Color.RED;
case 8:
return Color.GREEN;
case 16:
return Color.CYAN;
case 32:
return Color.GRAY;
case 64:
return Color.MAGENTA;
case 128:
return Color.ORANGE;
case 256:
return Color.PINK;
case 512:
return Color.YELLOW;
case 1024:
return Color.PURPLE;
case 2048:
return Color.BROWN;
default:
return Color.WHITE;
}
}
private void setCellColoredNumber(int x, int y, int value) {
if(value != 0) {
setCellValueEx(x, y, getColorByValue(value), Integer.toString(value));
}
else {
setCellValueEx(x, y, getColorByValue(value), "");
}
}
private boolean compressRow(int[] row) {
boolean changed = false;
int i;
for (i = 0; i < row.length - 1; i++) {
if (row[i] == 0 && row[i + 1] != 0) {
changed = true;
}
}
if (!changed) {
return changed;
}
for (i = 0; i < row.length; i++) {
for (int j = 0; j < row.length - i - 1; j++) {
if (row[j] < row[j + 1]) {
int buffer = row[j];
row[j] = row[j + 1];
row[j + 1] = buffer;
}
}
}
return changed;
}
private boolean mergeRow(int[] row) {
boolean merged = false;
for (int i = 0; i < row.length - 1; i++) {
if ((row[i] == row[i + 1]) && (row[i] != 0)) {
row[i] = 2 * row[i];
row[i + 1] = 0;
merged = true;
}
}
return merged;
}
@Override
public void onKeyPress(Key key) {
if (key == Key.LEFT) {
moveLeft();
}
else if (key == Key.RIGHT) {
moveRight();
}
else if (key == Key.UP) {
moveUp();
}
else if (key == Key.DOWN) {
moveDown();
}
if(key == Key.UP || key == Key.LEFT || key == Key.RIGHT || key == Key.DOWN) {
drawScene();
}
}
private void moveLeft() {
boolean counter = false;
for(int[] row : gameField) {
boolean compressed = compressRow(row); /* row is int[] so we are going for each row matrix,
first we compress and then we merge, probably we are going to use the values we return*/
boolean merged = mergeRow(row);
if( (merged || compressed) && !counter) {
createNewNumber();
counter = true;
}
for(int num : row) {
System.out.print(num); // then we just print out all the numbers, for each number in row[].
}
}
}
private void moveRight() {
}
private void moveUp() {
}
private void moveDown() {
}
}