From: Marco Costalba Date: Thu, 12 Feb 2009 11:12:46 +0000 (+0100) Subject: Introduce update_checkers() to simplify do_move() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=1d2247aea39074d8ecea4a5ce81b1cf85165538e Introduce update_checkers() to simplify do_move() No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/position.cpp b/src/position.cpp index 2b527501..83a83c18 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -710,6 +710,22 @@ void Position::restore(const UndoInfo& u) { // u.capture is restored in undo_move() } +template +inline void Position::update_checkers(Bitboard* pCheckersBB, Square ksq, Square from, Square to, Bitboard dcCandidates) { + + if (Piece != KING && bit_is_set(piece_attacks(ksq), to)) + set_bit(pCheckersBB, to); + + if (Piece != QUEEN && bit_is_set(dcCandidates, from)) + { + if (Piece != ROOK) + (*pCheckersBB) |= (piece_attacks(ksq) & rooks_and_queens(side_to_move())); + + if (Piece != BISHOP) + (*pCheckersBB) |= (piece_attacks(ksq) & bishops_and_queens(side_to_move())); + } +} + /// Position::do_move() makes a move, and backs up all information necessary /// to undo the move to an UndoInfo object. The move is assumed to be legal. /// Pseudo-legal moves should be filtered out before this function is called. @@ -789,33 +805,34 @@ void Position::do_move(Move m, UndoInfo& u, Bitboard dcCandidates) { if (piece == KING) kingSquare[us] = to; - // If the move was a double pawn push, set the en passant square. - // This code is a bit ugly right now, and should be cleaned up later. - // FIXME + // Reset en passant square if (epSquare != SQ_NONE) { key ^= zobEp[epSquare]; epSquare = SQ_NONE; } + + // If the moving piece was a pawn do some special extra work if (piece == PAWN) { + // Reset rule 50 draw counter + rule50 = 0; + + // Update pawn hash key + pawnKey ^= zobrist[us][PAWN][from] ^ zobrist[us][PAWN][to]; + + // Set en passant square, only if moved pawn can be captured if (abs(int(to) - int(from)) == 16) { - if( ( us == WHITE - && (pawn_attacks(WHITE, from + DELTA_N) & pawns(BLACK))) - || ( us == BLACK - && (pawn_attacks(BLACK, from + DELTA_S) & pawns(WHITE)))) + if ( (us == WHITE && (pawn_attacks(WHITE, from + DELTA_N) & pawns(BLACK))) + || (us == BLACK && (pawn_attacks(BLACK, from + DELTA_S) & pawns(WHITE)))) { epSquare = Square((int(from) + int(to)) / 2); key ^= zobEp[epSquare]; } } - // Reset rule 50 draw counter - rule50 = 0; - - // Update pawn hash key - pawnKey ^= zobrist[us][PAWN][from] ^ zobrist[us][PAWN][to]; } + // Update piece lists pieceList[us][piece][index[from]] = to; index[to] = index[from]; @@ -826,7 +843,7 @@ void Position::do_move(Move m, UndoInfo& u, Bitboard dcCandidates) { castleRights &= castleRightsMask[to]; key ^= zobCastle[castleRights]; - // Update checkers bitboard + // Update checkers bitboard, piece must be already moved checkersBB = EmptyBoardBB; Square ksq = king_square(them); switch (piece) @@ -841,39 +858,23 @@ void Position::do_move(Move m, UndoInfo& u, Bitboard dcCandidates) { break; case KNIGHT: - if (bit_is_set(piece_attacks(ksq), to)) - set_bit(&checkersBB, to); - - if (bit_is_set(dcCandidates, from)) - checkersBB |= ( (piece_attacks(ksq) & rooks_and_queens(us)) - |(piece_attacks(ksq) & bishops_and_queens(us))); + update_checkers(&checkersBB, ksq, from, to, dcCandidates); break; case BISHOP: - if (bit_is_set(piece_attacks(ksq), to)) - set_bit(&checkersBB, to); - - if (bit_is_set(dcCandidates, from)) - checkersBB |= (piece_attacks(ksq) & rooks_and_queens(us)); + update_checkers(&checkersBB, ksq, from, to, dcCandidates); break; case ROOK: - if (bit_is_set(piece_attacks(ksq), to)) - set_bit(&checkersBB, to); - - if (bit_is_set(dcCandidates, from)) - checkersBB |= (piece_attacks(ksq) & bishops_and_queens(us)); + update_checkers(&checkersBB, ksq, from, to, dcCandidates); break; case QUEEN: - if (bit_is_set(piece_attacks(ksq), to)) - set_bit(&checkersBB, to); + update_checkers(&checkersBB, ksq, from, to, dcCandidates); break; case KING: - if (bit_is_set(dcCandidates, from)) - checkersBB |= ( (piece_attacks(ksq) & rooks_and_queens(us)) - |(piece_attacks(ksq) & bishops_and_queens(us))); + update_checkers(&checkersBB, ksq, from, to, dcCandidates); break; default: @@ -893,7 +894,6 @@ void Position::do_move(Move m, UndoInfo& u, Bitboard dcCandidates) { assert(is_ok()); } - /// Position::do_capture_move() is a private method used to update captured /// piece info. It is called from the main Position::do_move function. diff --git a/src/position.h b/src/position.h index 4b524ec4..d05546f7 100644 --- a/src/position.h +++ b/src/position.h @@ -86,8 +86,8 @@ struct UndoInfo { Key key, pawnKey, materialKey; int rule50; Move lastMove; - PieceType capture; Value mgValue, egValue; + PieceType capture; }; @@ -308,6 +308,9 @@ private: void undo_ep_move(Move m); void find_checkers(); + template + void update_checkers(Bitboard* pCheckersBB, Square ksq, Square from, Square to, Bitboard dcCandidates); + template Bitboard hidden_checks(Color c, Square ksq) const;