Beispiel #1
0
        public static Bitboard KingAttacks(Bitboard king)
        {
            Bitboard attacks = king.EastOne() | king.WestOne();

            king    |= attacks;
            attacks |= king.NortOne() | king.SoutOne();
            return(attacks);
        }
Beispiel #2
0
        internal static void AddCastlingMoves(Position position, List <Move> allMoves)
        {
            Side  side  = position.SideToMove;
            Board board = position.Board;

            if (board[side, Piece.King] == 0)
            {
                return;
            }

            if (Castling.CanCastleKingside(position.CastlingRights, side))
            {
                var  kingsideBetween = Castling.KingSideBetween(side);
                bool spaceAvailable  = BitUtils.IsASubsetOfB(kingsideBetween, board.EmptySquares);

                var      kingsideChecks = Castling.KingSideChecks(side);
                Bitboard enemyAttacks   = board.AttacksBy(position.OpposingSide);
                bool     avoidsChecks   = (kingsideChecks & enemyAttacks) == 0;

                if (spaceAvailable && avoidsChecks)
                {
                    Bitboard king         = board[side, Piece.King];
                    Bitboard castleTarget = king.EastOne().EastOne();
                    Square   from         = (Square)king.Serialize()[0];
                    Square   to           = (Square)castleTarget.Serialize()[0];

                    allMoves.Add(new Move(from, to, MoveFlags.KingCastle));
                }
            }

            if (Castling.CanCastleQueenside(position.CastlingRights, side))
            {
                var  queensideBetween = Castling.QueenSideBetween(side);
                bool spaceAvailable   = BitUtils.IsASubsetOfB(queensideBetween, board.EmptySquares);

                var      queensideChecks = Castling.QueenSideChecks(side);
                Bitboard enemyAttacks    = board.AttacksBy(position.OpposingSide);
                bool     avoidsChecks    = (queensideChecks & enemyAttacks) == 0;

                if (spaceAvailable && avoidsChecks)
                {
                    Bitboard king         = board[side, Piece.King];
                    Bitboard castleTarget = king.WestOne().WestOne();
                    Square   from         = (Square)king.Serialize()[0];
                    Square   to           = (Square)castleTarget.Serialize()[0];

                    allMoves.Add(new Move(from, to, MoveFlags.QueenCastle));
                }
            }
        }