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)
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
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
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)
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)