def get_pawn_moves_2(pos, moves): pawns = pos.piece_bbs[piece.PAWN] & pos.color_bbs[pos.color] not_occ = ~(pos.occupied) enp = pos.en_passant opp_occ = pos.color_bbs[not pos.color] | enp if pos.color: sets = ((bitboard.n, square.s, not_occ), (bitboard.nw, square.se, opp_occ), (bitboard.ne, square.sw, opp_occ)) pro_rank, dbl_rank, push, = 6, 1, bitboard.n dfwd, dback = bitboard.nn, square.ss else: sets = ((bitboard.s, square.n, not_occ), (bitboard.se, square.nw, opp_occ), (bitboard.sw, square.ne, opp_occ)) pro_rank, dbl_rank, push, = 1, 6, bitboard.s dfwd, dback = bitboard.ss, square.nn regular = pawns & ~square.BIT_RANKS[pro_rank] promoting = pawns & square.BIT_RANKS[pro_rank] for fwd, back, occ in sets: for sq in bitboard.squares(fwd(regular) & occ): prm = piece.PAWN if sq == enp else piece.NONE moves.append(move.mv(piece.PAWN, back(sq), sq, prm)) for sq in bitboard.squares(fwd(promoting) & occ): _make_promotions(moves, sq, back(sq)) # double pawn moves occ = ~(pos.occupied | push(pos.occupied)) double = (regular & square.BIT_RANKS[dbl_rank]) for sq in bitboard.squares(dfwd(double) & occ): moves.append(move.mv(piece.PAWN, dback(sq), sq))
def get_king_moves(pos, moves): frsq = pos.piece_bbs[piece.KING] & pos.color_bbs[pos.color] not_own_occ = ~pos.color_bbs[pos.color] for tosq in bitboard.squares(ATTACKS[piece.KING][frsq] & not_own_occ): if not attacked(pos, tosq): moves.append(move.mv(piece.KING, frsq, tosq)) for flag, tosq, step, inter in CASTLE_FLAG_MAP[pos.color]: if (not (pos.castle & flag) or inter & pos.occupied or attacked(pos, step) or attacked(pos, tosq)): continue moves.append(move.mv(piece.KING, frsq, tosq, piece.KING))
def _get_sliding_moves(pos, moves, pc, source=None): if not source: source = pc pieces = pos.piece_bbs[source] & pos.color_bbs[pos.color] not_own_occ = ~pos.color_bbs[pos.color] for frsq in bitboard.squares(pieces): occ = pos.occupied & MASK[pc][frsq] for tosq in bitboard.squares(OCC_ATTACKS[pc][frsq][occ] & not_own_occ): moves.append(move.mv(source, frsq, tosq))
def get_pawn_moves(pos, moves): pawns = pos.piece_bbs[piece.PAWN] & pos.color_bbs[pos.color] not_occ = ~(pos.occupied) enp = pos.enp opp_occ = pos.color_bbs[not pos.color] | enp if pos.color: # single pawn moves regular = pawns & ~square.BIT_RANKS[6] promoting = pawns & square.BIT_RANKS[6] single = bitboard.n(pawns) & not_occ for sq in bitboard.squares(single): moves.append(move.mv(piece.PAWN, square.s(sq), sq)) for sq in bitboard.squares(bitboard.n(promoting) & not_occ): _make_promotions(moves, sq, square.s(sq)) # east attacks for sq in bitboard.squares(bitboard.ne(regular) & opp_occ): prm = piece.PAWN if sq == enp else piece.NONE moves.append(move.mv(piece.PAWN, square.sw(sq), sq, prm)) for sq in bitboard.squares(bitboard.ne(promoting) & opp_occ): _make_promotions(moves, sq, square.sw(sq)) # west attacks for sq in bitboard.squares(bitboard.nw(regular) & opp_occ): prm = piece.PAWN if sq == enp else piece.NONE moves.append(move.mv(piece.PAWN, square.se(sq), sq, prm)) for sq in bitboard.squares(bitboard.nw(promoting) & opp_occ): _make_promotions(moves, sq, square.se(sq)) # double pawn moves doubles = bitboard.n(single & square.BIT_RANKS[2]) for sq in bitboard.squares(doubles & not_occ): moves.append(move.mv(piece.PAWN, square.ss(sq), sq)) else: # single pawn moves regular = pawns & ~square.BIT_RANKS[1] promoting = pawns & square.BIT_RANKS[1] single = bitboard.s(pawns) & not_occ for sq in bitboard.squares(single): moves.append(move.mv(piece.PAWN, square.n(sq), sq)) for sq in bitboard.squares(bitboard.s(promoting) & not_occ): _make_promotions(moves, sq, square.n(sq)) # east attacks for sq in bitboard.squares(bitboard.se(regular) & opp_occ): prm = piece.PAWN if sq == enp else piece.NONE moves.append(move.mv(piece.PAWN, square.nw(sq), sq, prm)) for sq in bitboard.squares(bitboard.se(promoting) & opp_occ): _make_promotions(moves, sq, square.nw(sq)) # west attacks for sq in bitboard.squares(bitboard.sw(regular) & opp_occ): prm = piece.PAWN if sq == enp else piece.NONE moves.append(move.mv(piece.PAWN, square.ne(sq), sq, prm)) for sq in bitboard.squares(bitboard.sw(promoting) & opp_occ): _make_promotions(moves, sq, square.ne(sq)) # double pawn moves doubles = bitboard.s(single & square.BIT_RANKS[5]) for sq in bitboard.squares(doubles & not_occ): moves.append(move.mv(piece.PAWN, square.nn(sq), sq))
def _make_promotions(moves, tosq, frsq): for pc in (piece.KNIGHT, piece.BISHOP, piece.ROOK, piece.QUEEN): moves.append(move.mv(piece.PAWN, frsq, tosq, promotion=pc))
def get_knight_moves(pos, moves): knights = pos.piece_bbs[piece.KNIGHT] & pos.color_bbs[pos.color] not_occ = ~pos.color_bbs[pos.color] for frsq in bitboard.squares(knights): for tosq in bitboard.squares(ATTACKS[piece.KNIGHT][frsq] & not_occ): moves.append(move.mv(piece.KNIGHT, frsq, tosq))