title: Correct tile movement for a 2048 game
body: <p>I decided to make a 2048 Command Line Edition but I'm having trouble getting the right tile movement...</p>
  
  <p>My current structure is that the board is a 2D array (4x4) of ints. When an input is received, it will try to push every tile in that direction (ignoring tiles with value 0), if it notices a change it will start over (Because a tile on the bottom row will have to go all the way up, not just one step up). However, a side effect of this is the following problem:<br>
  [2][2][4] with the command -> should give [0][4][4] but since it starts over, the program will be able to merge 4 and 4 and get a [0][0][8] intead...<br>
  Another difficult problem is the [4][4][8][8] which should give [0][0][8][16] so I can't just stop after a merge.</p>
  
  <p>The code below is my processCommand function. It takes a board and an input (which is "d", "u", "l", or "r". If the game notices gameover it will put "gameover" as input). It's not very pretty and I've tried to make a single for loop for moving tiles (Like if you write "l" a value horiz will be -1 and if you write "r" it will be 1 and then I move the tile horiz spots horizontal but I couldn't make that work).</p>
  
  <p>Any ideas on how to do this (and critique on my programming) would be greatly appreciated! </p>
  
  <pre><code>func processCommand(board [][]int, input string) {
  
  board_new := board
  
  switch input {
      case "d":
          for i := 0; i &lt; height - 1; i++ {
              for j := 0; j &lt; width; j++ {
  
                  if board[i][j] == 0 {
                      continue
                  }
  
                  if board[i + 1][j] == 0 || board[i + 1][j] == board[i][j] {
                      board_new[i + 1][j] = board[i + 1][j] + board[i][j]
                      board_new[i][j] = 0
                      i = 0
                      j = 0
                      change = true
                  }
              }
          }
  
      case "u":
          for i := 1; i &lt; height; i++ {
              for j := 0; j &lt; width; j++ {
  
                  if board[i][j] == 0 {
                      continue
                  }
  
                  if board[i - 1][j] == 0 || board[i - 1][j] == board[i][j] {
                      board_new[i - 1][j] = board[i - 1][j] + board[i][j]
                      board_new[i][j] = 0
                      i = 1
                      j = 0
                      change = true
                  }
              }
          } 
  
      case "l":
          for i := 0; i &lt; height; i++ {
              for j := 1; j &lt; width; j++ {
  
                  if board[i][j] == 0 {
                      continue
                  }
  
                  if board[i][j - 1] == 0 || board[i][j - 1] == board[i][j] {
                      board_new[i][j - 1] = board[i][j - 1] + board[i][j]
                      board_new[i][j] = 0
                      i = 0
                      j = 1
                      change = true
                  }
              }
          }
  
      case "r":
          for i := 0; i &lt; height; i++ {
              for j := 0; j &lt; width - 1; j++ {
  
                  if board[i][j] == 0 {
                      continue
                  }
  
                  if board[i][j + 1] == 0 || board[i][j + 1] == board[i][j] {
                      board_new[i][j + 1] = board[i][j + 1] + board[i][j]
                      board_new[i][j] = 0
                      i = 0
                      j = 0
                      change = true
                  }
              }
          }
  
      case "gameover":
          gameOver = true
  
      default:
          processCommand(board, input)
  }
  
  board = board_new
  </code></pre>
  
  <p>}</p>