public static Bitboard KingAttacks(Bitboard king) { Bitboard attacks = king.EastOne() | king.WestOne(); king |= attacks; attacks |= king.NortOne() | king.SoutOne(); return(attacks); }
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)); } } }