public boolean moveLeft() {
		
		// Block invalid moves
		if (!canMoveLeft)
			return false;
		
		boolean result = false;
		for (int i = 0; i < dim; i++) {
			for (int j = 1; j < dim; j++) {		// We can skip the left most column
				
				// Skip empty tiles
				if (isTileEmpty(i, j))
					continue;
				
				// Stepping indices
				int k = j;
				
				// Slide this value as far left as it will go
				while (isValidLocation(i, k-1) && isTileEmpty(i, k - 1) && moveTileLeft(i, k)) {
					k--;
					result = true;
				}
				
				// If the tile came to rest to the right of a tile with the 
				// same value, nullify it
				if (canTilesMerge(i, k, i, k - 1)) {
					mergeLeft(i, k);
					result = true;
				}
			}
		}
		return result;
	}