private static string CreateStringFromCastlingRights(CastlingRights castlingRights) { string output = ""; if (castlingRights.HasFlag(CastlingRights.WhiteKingSide)) { output += 'K'; } if (castlingRights.HasFlag(CastlingRights.WhiteQueenSide)) { output += 'Q'; } if (castlingRights.HasFlag(CastlingRights.BlackKingSide)) { output += 'k'; } if (castlingRights.HasFlag(CastlingRights.BlackQueenSide)) { output += 'q'; } if (string.IsNullOrEmpty(output)) { return("-"); } else { return(output); } }
public FEN(string piecePlacement, Side activeSide, CastlingRights castlingAvailability, Square?enpassantTargetSquare, int halfmoveClock, int fullmoveNumber) { PiecePlacement = piecePlacement; ActiveSide = activeSide; CastlingAvailability = castlingAvailability; EnpassantTargetSquare = enpassantTargetSquare; HalfmoveClock = halfmoveClock; FullmoveNumber = fullmoveNumber; }
private static CastlingRights CreateCastlingRightsFromString(string castlingRightsString) { CastlingRights whiteKing = castlingRightsString.Contains('K') ? CastlingRights.WhiteKingSide : 0; CastlingRights whiteQueen = castlingRightsString.Contains('Q') ? CastlingRights.WhiteQueenSide : 0; CastlingRights blackKing = castlingRightsString.Contains('k') ? CastlingRights.BlackKingSide : 0; CastlingRights blackQueen = castlingRightsString.Contains('q') ? CastlingRights.BlackQueenSide : 0; return(whiteKing | whiteQueen | blackKing | blackQueen); }
public static CastlingRights RemoveKingSide(this CastlingRights castlingRights, Side side) { castlingRights &= side switch { Side.White => ~CastlingRights.WhiteKingSide, Side.Black => ~CastlingRights.BlackKingSide, _ => throw new ArgumentOutOfRangeException(nameof(side)) }; return(castlingRights); }
private void SetCastlingRights(CastlingRights rights) { if (SideToMove == Player.White) { WhiteCastlingRights &= rights; } else { BlackCastlingRights &= rights; } }
private static CastlingRights UpdateCastlingRightsForSide(CastlingRights castlingRights, Board newBoard, Side side) { if ((Castling.KingSideRookFrom(side) & newBoard[side, Piece.Rook]) == 0) { castlingRights = castlingRights.RemoveKingSide(side); } if ((Castling.QueenSideRookFrom(side) & newBoard[side, Piece.Rook]) == 0) { castlingRights = castlingRights.RemoveQueenSide(side); } return(castlingRights); }
public static Position MakeMoveNoLegalCheck(this Position position, Move move) { Board board = position.Board; ApplyMoveToBoard(board, move, out Piece fromPiece); CastlingRights castlingRights = position.CastlingRights; int halfMoveClock = position.HalfmoveClock; Square? enPassantSquare = null; if (move.Flags == MoveFlags.DoublePawnPush) { enPassantSquare = position.SideToMove switch { Side.White => move.From + 8, Side.Black => move.From - 8, _ => throw new IndexOutOfRangeException(nameof(position.SideToMove)) }; } if (fromPiece == Piece.King) { castlingRights = castlingRights.RemoveBoth(position.SideToMove); } castlingRights = UpdateCastlingRightsForBothSides(board, castlingRights); if (fromPiece == Piece.Pawn || move.IsCapture) { halfMoveClock = 0; } else { halfMoveClock++; } int fullMoveNumber = position.FullMoveNumber; if (position.SideToMove == Side.Black) { fullMoveNumber++; } return(new Position(board, position.OpposingSide, enPassantSquare, castlingRights, halfMoveClock) { FullMoveNumber = fullMoveNumber }); }
private static CastlingRights UpdateCastlingRightsForBothSides(Board newBoard, CastlingRights castlingRights) { castlingRights = UpdateCastlingRightsForSide(castlingRights, newBoard, Side.White); castlingRights = UpdateCastlingRightsForSide(castlingRights, newBoard, Side.Black); return(castlingRights); }
public static ulong ForCastlingRights(CastlingRights castlingRights) { Debug.Assert(castlingRights.IsValid()); return(CastlingRightsKeys[(int)castlingRights]); }
public static bool IsValid(this CastlingRights castlingRights) => castlingRights >= CastlingRights.None && castlingRights <= CastlingRights.All;