Exemple #1
0
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))
Exemple #2
0
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))
Exemple #3
0
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))
Exemple #4
0
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))
Exemple #5
0
def _occ_attack_table(sq, pc):
    mask = MASK[pc][sq]
    bits = bitboard.ones(mask)
    attacks = {}
    for occ_index in xrange(1 << bits):
        occ = 0L
        for sq_index, test_sq in enumerate(bitboard.squares(mask)):
            if occ_index & (1L << sq_index):
                occ |= test_sq
        attacks[occ] = _calc_slide_attacks(sq, occ, pc)
Exemple #6
0
def _occ_attack_table(sq, pc):
    mask = MASK[pc][sq]
    bits = bitboard.ones(mask)
    attacks = {}
    for occ_index in xrange(1 << bits):
        occ = 0L
        for sq_index, test_sq in enumerate(bitboard.squares(mask)):
            if occ_index & (1L << sq_index):
                occ |= test_sq
        attacks[occ] = _calc_slide_attacks(sq, occ, pc)
Exemple #7
0
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))
Exemple #8
0
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))
Exemple #9
0
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))
Exemple #10
0
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))
Exemple #11
0
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))
Exemple #12
0
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))