public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest) { var moveList = new List <Position>(); foreach (var delta in Constants.RookDeltas) { var position = Position.Clone(Position) + delta; while (position.IsValid()) { if (pieceMoveRequest.Pieces.ContainsKey(position) && pieceMoveRequest.Pieces[position].Colour == Colour) { break; } moveList.Add(position); if (pieceMoveRequest.Pieces.ContainsKey(position)) { break; } position += delta; } } return(moveList); }
public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest) { var moveList = new List <Position>(); foreach (var delta in Constants.KnightDeltas) { var position = Position.Clone(Position) + delta; if (pieceMoveRequest.Pieces.ContainsKey(position) && pieceMoveRequest.Pieces[position].Colour == Colour) { continue; } if (position.IsValid()) { moveList.Add(position); } } return(moveList); }
public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest) { if (!(pieceMoveRequest is PawnMoveRequest pawnMoveRequest)) { throw new ArgumentException("Expected pawn move request."); } var moveList = new List <Position>(); var pawnDelta = Colour == Colour.White ? Constants.WhitePawnDelta : Constants.BlackPawnDelta; var position = Position + pawnDelta; if (!pawnMoveRequest.Pieces.ContainsKey(position)) { moveList.Add(position); position += pawnDelta; if (NumberMoves == 0 && !pawnMoveRequest.Pieces.ContainsKey(position)) { moveList.Add(position); } } var attackDeltaLeft = Position + (Colour == Colour.White ? new Position(1, -1) : new Position(-1, -1)); var attackDeltaRight = Position + (Colour == Colour.White ? new Position(1, 1) : new Position(-1, 1)); var attackList = new List <Position> { attackDeltaRight, attackDeltaLeft }; foreach (var attackPosition in attackList) { var enPassantDelta = Colour == Colour.White ? new Position(attackPosition.Row - 1, attackPosition.Column) : new Position(attackPosition.Row + 1, attackPosition.Column); if (pawnMoveRequest.Pieces.ContainsKey(attackPosition) && pawnMoveRequest.Pieces[attackPosition].Colour != Colour || CanEnPassant(pawnMoveRequest, enPassantDelta)) { moveList.Add(attackPosition); } } return(moveList); }
public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest) { var moveList = new List <Position>(); foreach (var delta in Constants.KingDeltas) { var position = Position.Clone(Position) + delta; if (position.IsValid() && !(pieceMoveRequest.Pieces.ContainsKey(position) && pieceMoveRequest.Pieces[position].Colour == Colour)) { moveList.Add(position); } } if (CanCastle(pieceMoveRequest.Pieces, out var castleDirection)) { switch (castleDirection) { case CastleDirection.None: break; case CastleDirection.Left: moveList.AddRange(GetLeftCastleSquares()); break; case CastleDirection.Right: moveList.AddRange(GetRightCastleSquares()); break; case CastleDirection.Both: moveList.AddRange(GetLeftCastleSquares()); moveList.AddRange(GetRightCastleSquares()); break; default: throw new ArgumentOutOfRangeException(); } } return(moveList); }
public abstract List <Position> GetMoves(PieceMoveRequest pieceMoveRequest);