public bool Move(Direction direction)
{
Point delta = getDirectionDelta(direction);
IEnumerable<int> xTransversalOrder = CreateTransversalOrder(delta.X);
IEnumerable<int> yTransversalOrder = CreateTransversalOrder(delta.Y);
bool isAnyTileMoved = false;
foreach (int x in xTransversalOrder)
{
foreach (int y in yTransversalOrder)
{
Tile movingTile = Board.Tiles[x, y];
if (movingTile != null)
{
Point targetPosition = GetFarthestPosition(movingTile.Position, delta);
Point mergePosition = targetPosition.Add(delta);
if (IsTilesMergeable(movingTile, mergePosition))
{
Tile mergedTile = Board.Tiles[mergePosition.X, mergePosition.Y];
MergeTile(movingTile, mergedTile);
isAnyTileMoved = true;
}
else if (!targetPosition.Equals(movingTile.Position))
{
Move(movingTile, targetPosition);
isAnyTileMoved = true;
}
}
}
}
return isAnyTileMoved;
}