Example #1
0
def str(mv):
    if promotion(mv) == ivory_piece.KING:
        return 'O-O-O' if square.file(tosq(mv)) == 'c' else 'O-O'
    out = []
    if piece(mv) == ivory_piece.PAWN:
        if is_capture(mv):
            out.append(square.file(frsq(mv)))
            out.append('x')
    else:
        out.append(ivory_piece.str(piece(mv)).upper())
        if is_show_file(mv):
            out.append(square.file(frsq(mv)))
        if is_show_rank(mv):
            out.append(square.rank(frsq(mv)))
        if is_capture(mv):
            out.append('x')
    out.append(square.str(tosq(mv)))
    if promotion(mv):
        print square.str(frsq(mv)), square.str(tosq(mv))
        out.append('=')
        out.append(ivory_piece.str(promotion(mv)).upper())
    if is_check(mv):
        out.append('+')
    if is_mate(mv):
        out.append('#')
    return ''.join(out)
Example #2
0
def str(mv):
    if promotion(mv) == ivory_piece.KING:
        return 'O-O-O' if square.file(tosq(mv)) == 'c' else 'O-O'
    out = []
    if piece(mv) == ivory_piece.PAWN:
        if is_capture(mv):
            out.append(square.file(frsq(mv)))
            out.append('x')
    else:
        out.append(ivory_piece.str(piece(mv)).upper())
        if is_show_file(mv):
            out.append(square.file(frsq(mv)))
        if is_show_rank(mv):
            out.append(square.rank(frsq(mv)))
        if is_capture(mv):
            out.append('x')
    out.append(square.str(tosq(mv)))
    if promotion(mv):
        print square.str(frsq(mv)), square.str(tosq(mv))
        out.append('=')
        out.append(ivory_piece.str(promotion(mv)).upper())
    if is_check(mv):
        out.append('+')
    if is_mate(mv):
        out.append('#')
    return ''.join(out)
Example #3
0
 def make_move(self, mv):
     cl = self.color
     half, cast, enp = self.halfmove_clock, self.castle, self.enp
     self.color = not self.color
     opp_cl = self.color
     if cl == 0:
         self.move_num += 1
     self.enp = 0L
     frsq = move.frsq(mv)
     tosq = move.tosq(mv)
     prom = move.promotion(mv)
     pc = self.clear_square(tosq)
     mvpc = move.piece(mv)
     if pc or mvpc == piece.PAWN:
         self.halfmove_clock = 0
     else:
         self.halfmove_clock += 1
     if prom and prom != piece.PAWN and prom != piece.KING:
         mvpc = prom
     self.set_square(tosq, mvpc, cl)
     self.clear_square(frsq)
     if tosq == self.ROOK_SQUARES[opp_cl][0]:
         self.castle &= ~castle.QUEEN[opp_cl]
     elif tosq == self.ROOK_SQUARES[opp_cl][1]:
         self.castle &= ~castle.KING[opp_cl]
     if mvpc == piece.KING:
         self.castle &= ~castle.QUEEN[cl]
         self.castle &= ~castle.KING[cl]
         if prom == piece.KING:
             rfrsq, rtosq = self.CASTLE_SQUARE_MAP[tosq]
             rook = self.clear_square(rfrsq)
             self.set_square(rtosq, rook, cl)
     elif mvpc == piece.ROOK:
         if frsq == self.ROOK_SQUARES[cl][0]:
             self.castle &= ~castle.QUEEN[cl]
         elif frsq == self.ROOK_SQUARES[cl][1]:
             self.castle &= ~castle.KING[cl]
     elif mvpc == piece.PAWN:
         back = square.n(tosq) if opp_cl == 1 else square.s(tosq)
         if prom == piece.PAWN:
             self.clear_square(back)
         else:
             diff = square.rank(frsq) - square.rank(tosq)
             if diff == 2 or diff == -2:
                 self.enp = back
     self.moves.append((mv, pc, half, cast, enp))
     return pc
Example #4
0
 def make_move(self, mv):
     cl = self.color
     half, cast, enp = self.halfmove_clock, self.castle, self.enp
     self.color = not self.color
     opp_cl = self.color
     if cl == 0:
         self.move_num += 1
     self.enp = 0L
     frsq = move.frsq(mv)
     tosq = move.tosq(mv)
     prom = move.promotion(mv)
     pc = self.clear_square(tosq)
     mvpc = move.piece(mv)
     if pc or mvpc == piece.PAWN:
         self.halfmove_clock = 0
     else:
         self.halfmove_clock += 1
     if prom and prom != piece.PAWN and prom != piece.KING:
         mvpc = prom
     self.set_square(tosq, mvpc, cl)
     self.clear_square(frsq)
     if tosq == self.ROOK_SQUARES[opp_cl][0]:
         self.castle &= ~castle.QUEEN[opp_cl]
     elif tosq == self.ROOK_SQUARES[opp_cl][1]:
         self.castle &= ~castle.KING[opp_cl]
     if mvpc == piece.KING:
         self.castle &= ~castle.QUEEN[cl]
         self.castle &= ~castle.KING[cl]
         if prom == piece.KING:
             rfrsq, rtosq = self.CASTLE_SQUARE_MAP[tosq]
             rook = self.clear_square(rfrsq)
             self.set_square(rtosq, rook, cl)
     elif mvpc == piece.ROOK:
         if frsq == self.ROOK_SQUARES[cl][0]:
             self.castle &= ~castle.QUEEN[cl]
         elif frsq == self.ROOK_SQUARES[cl][1]:
             self.castle &= ~castle.KING[cl]
     elif mvpc == piece.PAWN:
         back = square.n(tosq) if opp_cl == 1 else square.s(tosq)
         if prom == piece.PAWN:
             self.clear_square(back)
         else:
             diff = square.rank(frsq) - square.rank(tosq)
             if diff == 2 or diff == -2:
                 self.enp = back
     self.moves.append((mv, pc, half, cast, enp))
     return pc
Example #5
0
    def _disambiguate_moves(self, moves):
        files = {}
        ranks = {}
        unamb = list(moves)
        for mv in moves:
            if move.promotion(mv):
                continue
            ps = (move.piece(mv), move.tosq(mv))
            files.setdefault(ps, [])
            ranks.setdefault(ps, [])
            files[ps].append(square.file(move.frsq(mv)))
            ranks[ps].append(square.rank(move.frsq(mv)))

        opp_cl = not self.color
        for i, mv in enumerate(moves):
            ps = (move.piece(mv), move.tosq(mv))
            if files[ps].count(square.file(move.frsq(mv))) > 1:
                unamb[i] = moves[i].set_show_rank()
            if ranks[ps].count(square.rank(move.frsq(mv))) > 1:
                unamb[i] = moves[i].set_show_file()
        return unamb
Example #6
0
    def _disambiguate_moves(self, moves):
        files = {}
        ranks = {}
        unamb = list(moves)
        for mv in moves:
            if move.promotion(mv):
                continue
            ps = (move.piece(mv), move.tosq(mv))
            files.setdefault(ps, [])
            ranks.setdefault(ps, [])
            files[ps].append(square.file(move.frsq(mv)))
            ranks[ps].append(square.rank(move.frsq(mv)))

        opp_cl = not self.color
        for i, mv in enumerate(moves):
            ps = (move.piece(mv), move.tosq(mv))
            if files[ps].count(square.file(move.frsq(mv))) > 1:
                unamb[i] = moves[i].set_show_rank()
            if ranks[ps].count(square.rank(move.frsq(mv))) > 1:
                unamb[i] = moves[i].set_show_file()
        return unamb
Example #7
0
        ATTACKS, MASK, OCC_ATTACKS = pickle.load(f)
else:
    ATTACKS = {}
    ATTACKS[piece.BISHOP] = {}
    ATTACKS[piece.ROOK] = {}
    ATTACKS[piece.KING] = {}
    ATTACKS[piece.KNIGHT] = {}
    MASK = {}
    MASK[piece.BISHOP] = {}
    MASK[piece.ROOK] = {}
    OCC_ATTACKS = {}
    OCC_ATTACKS[piece.BISHOP] = {}
    OCC_ATTACKS[piece.ROOK] = {}

    for sq in square.all():
        rank = square.BIT_RANKS[square.rank(sq)]
        file = square.BIT_FILES[square.file(sq)]
        a1h8 = square.BIT_A1H8[square.a1h8(sq)]
        a8h1 = square.BIT_A8H1[square.a8h1(sq)]

        ATTACKS[piece.BISHOP][sq] = a1h8 | a8h1
        MASK[piece.BISHOP][sq] = (
            (a1h8 & ~bitboard.msb(a1h8) & ~bitboard.lsb(a1h8)) |
            (a8h1 & ~bitboard.msb(a8h1) & ~bitboard.lsb(a8h1)))
        ATTACKS[piece.ROOK][sq] = rank | file
        MASK[piece.ROOK][sq] = (
            (rank & ~bitboard.msb(rank) & ~bitboard.lsb(rank)) |
            (file & ~bitboard.msb(file) & ~bitboard.lsb(file)))
        OCC_ATTACKS[piece.BISHOP][sq] = _occ_attack_table(sq, piece.BISHOP)
        OCC_ATTACKS[piece.ROOK][sq] = _occ_attack_table(sq, piece.ROOK)
        ATTACKS[piece.KING][sq] = _king_moves(sq)
Example #8
0
        ATTACKS, MASK, OCC_ATTACKS = pickle.load(f)
else:
    ATTACKS = {}
    ATTACKS[piece.BISHOP] = {}
    ATTACKS[piece.ROOK] = {}
    ATTACKS[piece.KING] = {}
    ATTACKS[piece.KNIGHT] = {}
    MASK = {}
    MASK[piece.BISHOP] = {}
    MASK[piece.ROOK] = {}
    OCC_ATTACKS = {}
    OCC_ATTACKS[piece.BISHOP] = {}
    OCC_ATTACKS[piece.ROOK] = {}

    for sq in square.all():
        rank = square.BIT_RANKS[square.rank(sq)]
        file = square.BIT_FILES[square.file(sq)]
        a1h8 = square.BIT_A1H8[square.a1h8(sq)]
        a8h1 = square.BIT_A8H1[square.a8h1(sq)]

        ATTACKS[piece.BISHOP][sq] = a1h8 | a8h1
        MASK[piece.BISHOP][sq] = (
                (a1h8 & ~bitboard.msb(a1h8) & ~bitboard.lsb(a1h8)) |
                (a8h1 & ~bitboard.msb(a8h1) & ~bitboard.lsb(a8h1))
        )
        ATTACKS[piece.ROOK][sq] = rank | file
        MASK[piece.ROOK][sq] = (
            (rank & ~bitboard.msb(rank) & ~bitboard.lsb(rank)) |
            (file & ~bitboard.msb(file) & ~bitboard.lsb(file))
        )
        OCC_ATTACKS[piece.BISHOP][sq] = _occ_attack_table(sq, piece.BISHOP)