public boolean canMove(MoveDirection direction) {
		Iterable<Point> iterable = pointIterator(direction);
		for (Point candidate : iterable) {
			boolean isRealPoint = !isEmpty(candidate.y, candidate.x);
			if (!isRealPoint) {
				continue;// discard 0's
			}

			int destY = candidate.y + direction.yAddition;
			int destX = candidate.x + direction.xAddition;
			boolean isDestInBounds = isInBounds(destY, destX);
			boolean isDestEmpty = isDestInBounds && isEmpty(destY, destX);
			boolean canUpScore = isDestInBounds && board[destY][destX] == board[candidate.y][candidate.x];

			if (isDestInBounds && (isDestEmpty || canUpScore)) {
				return true;
			}
		}
		return false;
	}