Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
 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;
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 private void SetCastlingRights(CastlingRights rights)
 {
     if (SideToMove == Player.White)
     {
         WhiteCastlingRights &= rights;
     }
     else
     {
         BlackCastlingRights &= rights;
     }
 }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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
            });
        }
Beispiel #8
0
        private static CastlingRights UpdateCastlingRightsForBothSides(Board newBoard, CastlingRights castlingRights)
        {
            castlingRights = UpdateCastlingRightsForSide(castlingRights, newBoard, Side.White);
            castlingRights = UpdateCastlingRightsForSide(castlingRights, newBoard, Side.Black);

            return(castlingRights);
        }
Beispiel #9
0
 public static ulong ForCastlingRights(CastlingRights castlingRights)
 {
     Debug.Assert(castlingRights.IsValid());
     return(CastlingRightsKeys[(int)castlingRights]);
 }
Beispiel #10
0
 public static bool IsValid(this CastlingRights castlingRights)
 => castlingRights >= CastlingRights.None && castlingRights <= CastlingRights.All;