My code is a loop, the mentor's solution is calling manually as needed. Am I doing something wrong?
Please ignore the break in moveUp method, I was testing something
private void moveLeft(){
boolean isNumberNeeded = false;
for (int[] row : gameField) {
boolean compress = compressRow(row);
boolean merge = mergeRow(row);
if (merge) compressRow(row);
if (compress || merge) isNumberNeeded = true;
}
if (isNumberNeeded) createNewNumber();
}
private void moveRight(){
for (int i = 0; i < 5; i++){
if (i == 2) {
moveLeft();
continue;
}
rotateClockwise();
}
}
private void moveUp(){
for (int i = 0; i < 5; i++){
if (i == 3) {
moveLeft();
break;
}
rotateClockwise();
}
}
private void moveDown(){
for (int i = 0; i < 5; i++){
if (i == 1) {
moveLeft();
continue;
}
rotateClockwise();
}
}
package com.codegym.games.game2048;
import com.codegym.engine.cell.*;
import javafx.geometry.Side;
import java.util.ArrayList;
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();
}
@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();
}
else return;
drawScene();
}
private void createGame(){
createNewNumber();
createNewNumber();
}
private void createNewNumber(){
int xCoord = Integer.MAX_VALUE;
int yCoord = Integer.MAX_VALUE;
do {
xCoord = getRandomNumber(0, SIDE);
yCoord = getRandomNumber(0, SIDE);
}
while (gameField[xCoord][yCoord] != 0);
if (getRandomNumber(10) == 9) gameField[xCoord][yCoord] = 4;
else gameField[xCoord][yCoord] = 2;
}
//paint cells with same values in same colours
private void setCellColoredNumber(int x, int y, int value){
Color c1 = getColorByValue(value);
if (value == 0) setCellValueEx(x, y, c1, "");
else setCellValueEx(x, y, c1, String.valueOf(value));
}
private Color getColorByValue(int value){
switch (value) {
case 0:
return Color.WHITE;
case 2:
return Color.PLUM;
case 4:
return Color.SLATEBLUE;
case 8:
return Color.DODGERBLUE;
case 16:
return Color.DARKTURQUOISE;
case 32:
return Color.MEDIUMSEAGREEN;
case 64:
return Color.LIMEGREEN;
case 128:
return Color.DARKORANGE;
case 256:
return Color.SALMON;
case 512:
return Color.ORANGERED;
case 1024:
return Color.DEEPPINK;
case 2048:
return Color.MEDIUMVIOLETRED;
default:
return Color.NONE;
}
}
private void moveLeft(){
boolean isNumberNeeded = false;
for (int[] row : gameField) {
boolean compress = compressRow(row);
boolean merge = mergeRow(row);
if (merge) compressRow(row);
if (compress || merge) isNumberNeeded = true;
}
if (isNumberNeeded) createNewNumber();
}
private void moveRight(){
for (int i = 0; i < 5; i++){
if (i == 2) {
moveLeft();
continue;
}
rotateClockwise();
}
}
private void moveUp(){
for (int i = 0; i < 5; i++){
if (i == 3) {
moveLeft();
break;
}
rotateClockwise();
}
}
private void moveDown(){
for (int i = 0; i < 5; i++){
if (i == 1) {
moveLeft();
continue;
}
rotateClockwise();
}
}
private boolean compressRow(int[] row){
// [ 0 4 0 2]
//mutarea primelor doua, daca primul nr este 0 iar al doilea nu este
int insertPosition = 0;
boolean result = false;
for (int x = 0; x < SIDE; x++) {
if (row[x] > 0) {
if (x != insertPosition) {
row[insertPosition] = row[x];
row[x] = 0;
result = true;
}
insertPosition++;
}
}
return result;
}
private boolean mergeRow(int[] row){
boolean result = false;
for (int i = 0; i < row.length - 1; i++) {
if (row[i] != 0 && row[i] == row[i + 1]) {
row[i] += row[i + 1];
row[i + 1] = 0;
result = true;
}
}
return result;
}
private void rotateClockwise() {
//1 devine 1 dar pe verticala
//2 devine 2 etc
int[][] copyOfField = new int[SIDE][SIDE];
int counterI = SIDE-1;
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
copyOfField[j][counterI] = gameField[i][j];
}
counterI--;
}
}
private void drawScene(){
for (int y = 0; y < SIDE; y++){
for (int x = 0; x < SIDE; x++){
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
}