I'm making a 2048 clone and my method to move and merge tiles is really long. I've heard of helper methods but I'm a little lost as to how I should use them. I feel like my code is a little too long and can be made shorter but I don't know how. What can I do to make it shorter and cleaner? I'll also take any constructive criticism on anything else part of the method.
public boolean move(Direction direction)
{
boolean didMove = false;
int multiplier = 2;
if (direction == Direction.RIGHT) {
//int i represents rows; int j represents columns
for (int i = 0; i < GRID_SIZE; i++ ) {
ArrayList<Integer> slideTile = new ArrayList<>();
//Copying row w/o 0s to ArrayList
for (int j = 0; j < GRID_SIZE; j++) {
if(grid[i][j] != 0) {
slideTile.add(grid[i][j]);
}
}
//Merging tiles that are next to each other if
//they are equal and updating score.
for (int j = slideTile.size()-1; j > 0; j--) {
if (slideTile.get(j).equals(slideTile.get(j-1))) {
slideTile.set(j, multiplier*slideTile.get(j-1));
score = score + multiplier*slideTile.get(j-1);
slideTile.set(j-1, 0);
}
}
//Removing 0s that may have resulted from merging
for (int j = 0; j < slideTile.size(); j++ ) {
if (slideTile.get(j) == 0) {
slideTile.remove(j);
}
}
//Adding 0s to beginning of ArrayList to slide tiles right
int size = slideTile.size();
for (int j = 0; j < (GRID_SIZE - size); j++){
slideTile.add(0, 0);
}
//Copying ArrayList row back to game grid.
for (int j = 0; j < GRID_SIZE; j++) {
this.grid[i][j] = slideTile.get(j);
}
}
didMove = true;
}
if (direction == Direction.LEFT) {
//int i represents rows; int j represents columns
for (int i = 0; i < GRID_SIZE; i++ ) {
ArrayList<Integer> slideTile = new ArrayList<>();
//Copying row w/o 0s to ArrayList
for (int j = 0; j < GRID_SIZE; j++) {
if(grid[i][j] != 0) {
slideTile.add(grid[i][j]);
}
}
//Merging tiles that are next to each other if
//they are equal and updating score.
for (int j = 0; j < slideTile.size()-1; j++) {
if (slideTile.get(j).equals(slideTile.get(j+1))) {
slideTile.set(j, multiplier*slideTile.get(j+1));
score = score + multiplier*slideTile.get(j+1);
slideTile.set(j+1, 0);
}
}
//Removing 0s that may have resulted from merging
for (int j = 0; j < slideTile.size(); j++ ) {
if (slideTile.get(j) == 0) {
slideTile.remove(j);
}
}
//Adding 0s to end of ArrayList to slide tiles left
int size = slideTile.size();
for (int j = 0; j < (GRID_SIZE - size); j++){
slideTile.add(0);
}
//Copying ArrayList row back to game grid.
for (int j = 0; j < GRID_SIZE; j++) {
this.grid[i][j] = slideTile.get(j);
}
}
didMove = true;
}
if (direction == Direction.UP) {
//int i represents rows; int j represents columns
for (int j = 0; j < GRID_SIZE; j++ ) {
ArrayList<Integer> slideTile = new ArrayList<>();
//Copying row w/o 0s to ArrayList
for (int i = 0; i < GRID_SIZE; i++) {
if ( grid [i][j] != 0 )
slideTile.add(grid[i][j]);
}
//Merging tiles that are next to each other if
//they are equal and updating score.
for (int i = 0; i < slideTile.size()-1; i++) {
if (slideTile.get(i).equals(slideTile.get(i+1))) {
slideTile.set(i, multiplier*slideTile.get(i+1));
System.out.println(slideTile.get(i));
score = score + multiplier*slideTile.get(i+1);
slideTile.set(i+1, 0);
}
}
//Removing 0s that may have resulted from merging
for (int i = 0; i < slideTile.size(); i++ ) {
if (slideTile.get(i) == 0) {
slideTile.remove(i);
}
}
//Adding 0s to end of ArrayList to slide tiles up
int size = slideTile.size();
for (int i = 0; i < (GRID_SIZE - size); i++){
slideTile.add(0);
}
//Copying ArrayList row back to game grid.
for (int i = 0; i < GRID_SIZE; i++) {
this.grid[i][j] = slideTile.get(i);
}
}
didMove = true;
}
if (direction == Direction.DOWN) {
//int i represents rows; int j represents columns
for (int j = 0; j < GRID_SIZE; j++ ) {
ArrayList<Integer> slideTile = new ArrayList<>();
//Copying row w/o 0s to ArrayList
for (int i = 0; i < GRID_SIZE; i++) {
if(grid[i][j] != 0) {
slideTile.add(grid[i][j]);
}
}
//Merging tiles that are next to each other if
//they are equal and updating score.
for (int i = slideTile.size()-1; i > 0; i--) {
if (slideTile.get(i).equals(slideTile.get(i-1))) {
slideTile.set(i, multiplier*slideTile.get(i-1));
score = score + multiplier*slideTile.get(i-1);
slideTile.set(i-1, 0);
}
}
//Removing 0s that may have resulted from merging
for (int i = 0; i <slideTile.size(); i++ ) {
if (slideTile.get(i) == 0) {
slideTile.remove(i);
}
}
//Adding 0s to end of ArrayList to slide tiles up
int size = slideTile.size();
for (int i = 0; i < (GRID_SIZE - size); i++){
slideTile.add(0, 0);
}
//Copying ArrayList row back to game grid.
for (int i = 0; i < GRID_SIZE; i++) {
this.grid[i][j] = slideTile.get(i);
}
}
didMove = true;
}
return didMove;
}