Моя задача не проходит требование "Метод moveLeft() должен перемещать и соединять элементы матрицы gameField влево в соответствии с правилами игры.", я перепроверила правила игры и сравнила с правильным решением и по-моему всё подходит, можете пожалуйста подсказать, что я сделала не так, спасибо.
package com.javarush.task.jdk13.task53.task5301;
import com.javarush.engine.cell.*;
public class Game2048 extends Game{
private static final int SIDE = 4;
private final int[][] gameField = new int[SIDE][SIDE];
public void initialize(){
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
public void onKeyPress(Key key){
if (key == Key.LEFT) {
moveLeft();
drawScene();
}else if (key == Key.RIGHT) {
moveRight();
drawScene();
}else if (key == Key.UP) {
moveUp();
drawScene();
}else if (key == Key.DOWN) {
moveDown();
drawScene();
}
}
private void moveLeft(){
boolean isNewNumberNeeded = false;
for (int i = 0; i < SIDE; i++) {
boolean wasCompressed = compressRow(gameField[i]);
boolean wasMerged = mergeRow(gameField[i]);
if (wasCompressed) {
compressRow(gameField[i]);
}
if (wasCompressed || wasMerged) {
isNewNumberNeeded = true;
}
}
if (isNewNumberNeeded)
createNewNumber();
}
private void moveRight(){
}
private void moveUp(){
}
private void moveDown(){
}
private void createGame(){
createNewNumber();
createNewNumber();
}
private void createNewNumber(){
int x = getRandomNumber(SIDE);
int y = getRandomNumber(SIDE);
while (gameField[x][y] != 0){
x = getRandomNumber(SIDE);
y = getRandomNumber(SIDE);
}
int randomizer = getRandomNumber(10);
if (randomizer == 9){
gameField[x][y] = 4;
}else{
gameField[x][y] = 2;
}
}
private void drawScene(){
for (int x = 0; x < SIDE; x++){
for (int y = 0; y < SIDE; y++){
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
private void setCellColoredNumber(int x, int y, int value){
Color color = getColorByValue(value);
String writenValue = "" + value;
String empty = "";
if (value == 0){
setCellValueEx(x, y, color, empty);
}else {
setCellValueEx(x, y, color, writenValue);
}
}
private Color getColorByValue(int value){
if (value == 0){
return Color.WHITE;
}
if (value == 2){
return Color.DARKVIOLET;
}
if (value == 4){
return Color.BLUEVIOLET;
}
if (value == 8){
return Color.CYAN;
}
if (value == 16){
return Color.DEEPSKYBLUE;
}
if (value == 32){
return Color.DARKGREEN;
}
if (value == 64){
return Color.DARKOLIVEGREEN;
}
if (value == 128){
return Color.OLIVE;
}
if (value == 256){
return Color.GREENYELLOW;
}
if (value == 512){
return Color.YELLOWGREEN;
}
if (value == 1024){
return Color.MAGENTA;
}
if (value == 2048){
return Color.MAROON;
}else{
return Color.NONE;
}
}
/*
private boolean compressRow(int[] row){
int[] rowCopy = new int[row.length];
for (int i = 0; i < row.length; i++){
if (row[i] > 0){
rowCopy[i] = row[i];
}
}
boolean change;
if (row.deepEquals(rowCopy)){
change = true;
}else{ change = true;}
for (int i = 0; i < row.length; i++){
row[i] = rowCory[i];
}
return change;
}
*/
// private void move1(){
// for (int i = 0; i < SIDE; i++) {
// compressRowLeft(gameField[i]);
// mergeRowLeft(gameField[i]);
// }
// }
private boolean compressRow(int[] row){
int insertRow = 0;
boolean result = false;
for (int x = 0; x < SIDE; x++){
if (row[x] > 0) {
if (x != insertRow){
row[insertRow] = row[x];
row[x] = 0;
result = true;
}
insertRow++;
}
}
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 + 1] != 0){
if (row[i] == row[i + 1]){
row[i] = row[i] + row[i];
row[i + 1] = 0;
result = true;
}
}
}
return result;
}
//private void move2(){
// for (int i = 0; i < SIDE; i++) {
// compressRowRight(gameField[i]);
// mergeRowRight(gameField[i]);
// }
// }
private boolean compressRowRight(int[] row){
int insertRow = SIDE;
boolean result = false;
for (int x = SIDE; x > 0; x--){
if (row[x] < 0) {
if (x != insertRow){
row[insertRow] = row[x];
row[x] = 0;
result = true;
}
insertRow--;
}
}
return result;
}
private boolean mergeRowRight(int[] row){
boolean result = false;
for (int i = row.length - 1; i > 0; i--){
if (row[i] != 0 && row[i - 1] != 0){
if (row[i] == row[i - 1]){
row[i] = row[i] + row[i];
row[i - 1] = 0;
result = true;
}
}
}
return result;
}
//private void move3(){
// for (int y = 0; y < SIDE; y++) {
// for (int x = 0; x < SIDE; x++){
// compressRowUp(gameField);
// mergeRowUp(gameField);
// }
// }
// }
private boolean compressRowUp(int[][] row){
int insertRow = 0;
boolean result = false;
for (int y = 0; y < SIDE; y++) {
for (int x = 0; x < SIDE; x++){
if (row[x][y] > 0) {
if (x != insertRow) {
row[insertRow][y] = row[x][y];
row[x][y] = 0;
result = true;
}
insertRow++;
}
}
}
return result;
}
private boolean mergeRowUp(int[][] row){
boolean result = false;
for (int y = 0; y < row.length - 1; y++){
for (int x = 0; x < row[y].length - 1; x++) {
if (row[x][y] != 0 && row[x + 1][y] != 0) {
if (row[x][y] == row[x + 1][y]) {
row[x][y] = row[x][y] + row[x][y];
row[x + 1][y] = 0;
result = true;
}
}
}
}
return result;
}
// private void move4(){
// for (int y = 0; y < SIDE; y++) {
// for (int x = 0; x < SIDE; x++){
// compressRowDown(gameField);
// mergeRowDown(gameField);
// }
// }
// }
private boolean compressRowDown(int[][] row){
int insertRow = SIDE;
boolean result = false;
for (int y = SIDE; y > 0; y--) {
for (int x = SIDE; x > 0; x--){
if (row[x][y] > 0) {
if (x != insertRow) {
row[insertRow][y] = row[x][y];
row[x][y] = 0;
result = true;
}
insertRow--;
}
}
}
return result;
}
private boolean mergeRowDown(int[][] row){
boolean result = false;
for (int y = row.length - 1; y > 0; y--){
for (int x = row[y].length - 1; x > 0; x--) {
if (row[x][y] != 0 && row[x - 1][y] != 0) {
if (row[x][y] == row[x - 1][y]) {
row[x][y] = row[x][y] + row[x][y];
row[x - 1][y] = 0;
result = true;
}
}
}
}
return result;
}
}