Exemplo n.º 1
0
        private static Dictionary <bool, Board> GetCastingBoards(Color color, Move move)
        {
            var          fenToBoard          = new FenTextToBoard();
            const string emptyFenWhiteToMove = "4k3/8/8/8/8/8/8/4K3 w - - 0 1";
            const string emptyFenBlackToMove = "4k3/8/8/8/8/8/8/4K3 b - - 0 1";
            var          dictCastlingBoards  = new Dictionary <bool, Board>();
            var          emptyBoard          = color == Color.Black
                ? fenToBoard.Translate(emptyFenBlackToMove)
                : fenToBoard.Translate(emptyFenWhiteToMove);
            var castlingAvailability = GetCastlingAvailabilityFromMove(move);
            var allCastles           = CastlingAvailability.WhiteQueenside | CastlingAvailability.BlackKingside |
                                       CastlingAvailability.WhiteQueenside | CastlingAvailability.BlackQueenside;
            var castleUnavailable = allCastles.RemoveFlags(castlingAvailability);
            var castleAvailable   = castlingAvailability;
            var canCastle         = new Board(emptyBoard.Occupancy, emptyBoard.HalfMoveClock, emptyBoard.EnPassantIndex,
                                              emptyBoard.PieceCaptured,
                                              castleAvailable, emptyBoard.ActivePlayer, emptyBoard.FullMoveCounter, true);

            var cannotCastle = new Board(emptyBoard.Occupancy, emptyBoard.HalfMoveClock, emptyBoard.EnPassantIndex,
                                         emptyBoard.PieceCaptured,
                                         castleUnavailable, emptyBoard.ActivePlayer, emptyBoard.FullMoveCounter, true);

            dictCastlingBoards.Add(true, canCastle);
            dictCastlingBoards.Add(false, cannotCastle);
            return(dictCastlingBoards);
        }
Exemplo n.º 2
0
        protected BoardState(string strFen) : this()
        {
            var fen = new FenTextToBoard().Translate(strFen);

            SetBoardState(fen.HalfMoveClock, fen.EnPassantIndex, null, fen.CastlingAvailability, fen.ActivePlayer,
                          fen.FullMoveCounter);
        }
Exemplo n.º 3
0
        public void CloneTest()
        {
            var board = new FenTextToBoard().Translate(
                "rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - 1 2");
            var clone = board.Clone();

            Assert.AreNotSame(board, clone);
            Assert.AreEqual(board, clone);
        }
Exemplo n.º 4
0
        public void GetLegal_IfNoPieceAtIndex_ReturnsEmptyArray()
        {
            var fenToBoard = new FenTextToBoard();
            var board      = fenToBoard.Translate("2kr1b1r/pppqpppp/3pb3/3N4/2P1P3/6P1/PPQBPP1P/R3KB1R w KQ - 1 12");

            var legalMoves = Bitboard.Instance.GetLegalMoves(34, board.Occupancy, null,
                                                             CastlingAvailability.WhiteKingside | CastlingAvailability.WhiteQueenside);

            Assert.IsEmpty(legalMoves);
        }
Exemplo n.º 5
0
        public void ApplyMove_EnPassantCaptures(string fen, int src, int dst, ulong oppPawn, ulong actPawn)
        {
            var move        = MoveHelpers.GenerateMove((ushort)src, (ushort)dst, MoveType.EnPassant);
            var board       = new FenTextToBoard().Translate(fen);
            var activeColor = board.ActivePlayer;
            var oppColor    = board.ActivePlayer.Toggle();
            var actual      = board.ApplyMoveToBoard(move);

            Assert.AreEqual(actual.Occupancy.Occupancy(activeColor, Piece.Pawn), actPawn,
                            $"{board.ActivePlayer}'s pawn structure incorrect after En Passant capture");
            Assert.AreEqual(actual.Occupancy.Occupancy(oppColor, Piece.Pawn), oppPawn,
                            $"{board.ActivePlayer.Toggle()}'s pawn structure incorrect after En Passant capture");
        }
Exemplo n.º 6
0
        public void ApplyMove_Castles(string fen, CastlingAvailability castlingMove, ulong expectedKingVal,
                                      ulong expectedRookVal)
        {
            var move = castlingMove == CastlingAvailability.WhiteKingside ? MoveHelpers.WhiteCastleKingSide
                : castlingMove == CastlingAvailability.WhiteQueenside ? MoveHelpers.WhiteCastleQueenSide
                : castlingMove == CastlingAvailability.BlackKingside ? MoveHelpers.BlackCastleKingSide
                : MoveHelpers.BlackCastleQueenSide;
            var board         = new FenTextToBoard().Translate(fen);
            var postMove      = board.ApplyMoveToBoard(move);
            var activeKingVal = postMove.Occupancy.Occupancy(board.ActivePlayer, Piece.King);
            var activeRookVal = postMove.Occupancy.Occupancy(board.ActivePlayer, Piece.Rook);

            Assert.AreEqual(expectedKingVal, activeKingVal);
            Assert.AreEqual(expectedRookVal, activeRookVal);
        }