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