Ошибка по всем пунктам в такой простой задаче. По факту всё сдвигает. что не так?/*
* Copyright (c) 2021. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.javarush.games.game2048;
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;
import java.util.ArrayList;
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);
drawScene();
createGame();
}
private void createGame() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
gameField[j][i] = 0;
}
}
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() {
int x, y;
do {
x = getRandomNumber(SIDE);
y = getRandomNumber(SIDE);
} while (gameField[y][x] != 0);
int value = getRandomNumber(10) == 0 ? 4 : 2;
setCellColoredNumber(x, y, value);
}
private void setCellColoredNumber(int x, int y, int value) {
gameField[y][x] = value;
if (value == 0) {
setCellValueEx(x, y, getColorByValue(value), "");
} else {
setCellValueEx(x, y, getColorByValue(value), Integer.toString(value));
}
}
private Color getColorByValue(int value) {
switch (value) {
case 0:
return Color.WHITE;
case 2:
return Color.LIGHTPINK;
case 4:
return Color.BLUEVIOLET;
case 8:
return Color.BLUE;
case 16:
return Color.CYAN;
case 32:
return Color.LIGHTSEAGREEN;
case 64:
return Color.LIMEGREEN;
case 128:
return Color.ORANGE;
case 256:
return Color.INDIANRED;
case 512:
return Color.RED;
case 1024:
return Color.MAGENTA;
case 2048:
return Color.MEDIUMVIOLETRED;
}
return null;
}
/* public static void main(String[] args) {
int[] a = {0, 4, 4, 4};
System.out.println(mergeRow(a));
System.out.println();
System.out.println(Arrays.toString(a));
}*/
private boolean compressRow(int[] row) {
boolean rezult = false;
ArrayList<Integer> arr = new ArrayList<>(row.length);
for (int i = 0; i < row.length; i++) {
if (row[i] != 0)
arr.add(row[i]);
}
int arrsize = arr.size();
for (int i = 0; i < row.length - arrsize; i++) {
arr.add(0);
}
int[] temprow = new int[arr.size()];
for (int i = 0; i < temprow.length; i++) {
temprow[i] = arr.get(i);
}
rezult = !Arrays.equals(row, temprow);
for (int i = 0; i < row.length; i++) {
row[i] = arr.get(i);
}
return rezult;
}
private boolean mergeRow(int[] row) {
boolean rezult = false;
ArrayList<Integer> arr = new ArrayList<>(row.length);
for (int i = 0; i < row.length; i++) {
if (i + 1 < row.length) {
if (row[i] == row[i + 1]) {
arr.add(row[i] + row[i + 1]);
arr.add(0);
i++;
} else
arr.add(row[i]);
} else {
arr.add(row[i]);
}
}
int[] temprow = new int[arr.size()];
for (int i = 0; i < temprow.length; i++) {
temprow[i] = arr.get(i);
}
rezult = !Arrays.equals(row, temprow);
for (int i = 0; i < row.length; i++) {
row[i] = arr.get(i);
}
return rezult;
}
@Override
public void onKeyPress(Key key) {
if (key == Key.DOWN) {
moveDown();
}
if (key == Key.UP) {
moveUp();
}
if (key == Key.LEFT) {
moveLeft();
}
if (key == Key.RIGHT) {
moveRight();
}
}
private void moveLeft() {
boolean go = false;
for (int i = 0; i < SIDE; i++) {
if (compressRow(gameField[i])) go = true;
if (mergeRow(gameField[i])) go = true;
if (compressRow(gameField[i])) go = true;
}
if (go) {
createNewNumber();
}
drawScene();
}
private void moveRight() {
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
drawScene();
}
private void moveUp() {
rotateClockwise();
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
drawScene();
}
private void moveDown() {
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
rotateClockwise();
drawScene();
}
private void rotateClockwise() {
int SIDE = gameField.length;
int[][] rezult = new int[SIDE][SIDE];
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
rezult[i][j] = gameField[SIDE - j - 1][i];
}
}
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
gameField[i][j] = rezult[i][j];
}
}
}
}