/// <inheritdoc/> public IEnumerable <Path> GetPaths(Point start, Piece piece, IPieceEnumerationProvider squares) { return(piece.Type == PieceType.Pawn ? new[] { piece.Edge.RotateCounterClockwise(3), piece.Edge.Opposite(), piece.Edge.RotateClockwise(3) } .Where(direction => squares.EnumerateStraightLine(start, direction).Any()) .Select(direction => { var isMove = direction == piece.Edge.Opposite(); var moves = squares.EnumerateStraightLine(start, direction).Take(2).ToList(); return new Path { AllowMove = isMove, AllowTake = !isMove, Direction = direction, Start = start, Piece = piece, OppositeEdge = !squares.EnumerateStraightLine(start, piece.Edge.Opposite()).Skip(1).Any(), Squares = moves.Take(piece.HasMoved || !isMove ? 1 : 2) }; }) : Enumerable.Empty <Path>()); }
/// <inheritdoc/> public IEnumerable <Path> GetPaths(Point start, Piece piece, IPieceEnumerationProvider squares) => piece.Type == PieceType.Bishop || piece.Type == PieceType.Queen ? Directions.Diagonals .Where(direction => squares.EnumerateStraightLine(start, direction).Any()) .Select(direction => new Path { AllowMove = true, AllowTake = true, Direction = direction, Start = start, Piece = piece, Squares = squares.EnumerateStraightLine(start, direction) }) : Enumerable.Empty <Path>();