X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=98e79df2a82d2d661c9af66aa8d8004466da1bab;hp=71a3074608ee75fda8996486ddba03762dc4b603;hb=dc2302b701083dade07d59b1ffbfd180d47c4383;hpb=038235ba3541087e2db969a0a4bdfd5fc2a42b44 diff --git a/src/position.cpp b/src/position.cpp index 71a30746..98e79df2 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -31,6 +31,7 @@ #include "movepick.h" #include "position.h" #include "psqtab.h" +#include "san.h" #include "ucioption.h" @@ -38,6 +39,8 @@ //// Variables //// +extern SearchStack EmptySearchStack; + int Position::castleRightsMask[64]; Key Position::zobrist[2][8][64]; @@ -49,6 +52,7 @@ Key Position::zobSideToMove; Value Position::MgPieceSquareTable[16][64]; Value Position::EgPieceSquareTable[16][64]; +static bool RequestPending = false; //// //// Functions @@ -242,7 +246,7 @@ const std::string Position::to_fen() const { fen += (rank > RANK_1 ? '/' : ' '); } - fen += (sideToMove == WHITE ? 'w' : 'b') + ' '; + fen += (sideToMove == WHITE ? "w " : "b "); if (castleRights != NO_CASTLES) { if (can_castle_kingside(WHITE)) fen += 'K'; @@ -263,29 +267,45 @@ const std::string Position::to_fen() const { /// Position::print() prints an ASCII representation of the position to -/// the standard output. - -void Position::print() const { - char pieceStrings[][8] = - {"| ? ", "| P ", "| N ", "| B ", "| R ", "| Q ", "| K ", "| ? ", - "| ? ", "|=P=", "|=N=", "|=B=", "|=R=", "|=Q=", "|=K=" - }; - - for(Rank rank = RANK_8; rank >= RANK_1; rank--) { - std::cout << "+---+---+---+---+---+---+---+---+\n"; - for(File file = FILE_A; file <= FILE_H; file++) { - Square sq = make_square(file, rank); - Piece piece = piece_on(sq); - if(piece == EMPTY) - std::cout << ((square_color(sq) == WHITE)? "| " : "| . "); - else - std::cout << pieceStrings[piece]; - } - std::cout << "|\n"; +/// the standard output. If a move is given then also the san is print. + +void Position::print(Move m) const { + + static const std::string pieceLetters = " PNBRQK PNBRQK ."; + + // Check for reentrancy, as example when called from inside + // MovePicker that is used also here in move_to_san() + if (RequestPending) + return; + + RequestPending = true; + + std::cout << std::endl; + if (m != MOVE_NONE) + { + std::string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : ""); + std::cout << "Move is: " << col << move_to_san(*this, m) << std::endl; } - std::cout << "+---+---+---+---+---+---+---+---+\n"; - std::cout << to_fen() << std::endl; - std::cout << key << std::endl; + for (Rank rank = RANK_8; rank >= RANK_1; rank--) + { + std::cout << "+---+---+---+---+---+---+---+---+" << std::endl; + for (File file = FILE_A; file <= FILE_H; file++) + { + Square sq = make_square(file, rank); + Piece piece = piece_on(sq); + if (piece == EMPTY && square_color(sq) == WHITE) + piece = NO_PIECE; + + char col = (color_of_piece_on(sq) == BLACK ? '=' : ' '); + std::cout << '|' << col << pieceLetters[piece] << col; + } + std::cout << '|' << std::endl; + } + std::cout << "+---+---+---+---+---+---+---+---+" << std::endl + << "Fen is: " << to_fen() << std::endl + << "Key is: " << key << std::endl; + + RequestPending = false; } @@ -410,6 +430,7 @@ bool Position::piece_attacks_square(Square f, Square t) const { case WR: case BR: return piece_attacks_square(f, t); case WQ: case BQ: return piece_attacks_square(f, t); case WK: case BK: return piece_attacks_square(f, t); + default: break; } return false; } @@ -437,6 +458,7 @@ bool Position::move_attacks_square(Move m, Square s) const { case WR: case BR: return piece_attacks_square(t, s); case WQ: case BQ: return piece_attacks_square(t, s); case WK: case BK: return piece_attacks_square(t, s); + default: break; } return false; } @@ -643,6 +665,9 @@ bool Position::move_is_check(Move m, Bitboard dcCandidates) const { return bit_is_set(rook_attacks_bb(rto, b), ksq); } return false; + + default: // NO_PIECE_TYPE + break; } assert(false); return false; @@ -650,10 +675,12 @@ bool Position::move_is_check(Move m, Bitboard dcCandidates) const { /// Position::move_is_capture() tests whether a move from the current -/// position is a capture. +/// position is a capture. Move must not be MOVE_NONE. bool Position::move_is_capture(Move m) const { + assert(m != MOVE_NONE); + return ( !square_is_empty(move_to(m)) && (color_of_piece_on(move_to(m)) == opposite_color(side_to_move())) ) @@ -1113,7 +1140,7 @@ void Position::do_promotion_move(Move m, UndoInfo &u) { castleRights &= castleRightsMask[to]; key ^= zobCastle[castleRights]; - // Reset rule 50 counter + // Reset rule 50 counter rule50 = 0; // Update checkers BB @@ -1900,8 +1927,7 @@ bool Position::is_mate() { if (is_check()) { - MovePicker mp = MovePicker(*this, false, MOVE_NONE, MOVE_NONE, - MOVE_NONE, MOVE_NONE, Depth(0)); + MovePicker mp = MovePicker(*this, false, MOVE_NONE, EmptySearchStack, Depth(0)); return mp.get_next_move() == MOVE_NONE; } return false;