X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposition.cpp;h=a005d5df2809e069318f0bbb7fec1c67d04ffea9;hb=d1143794a01cd0540cf47e3415815cd60cde9422;hp=ef5fd97091cc4f0f478b41954090ba8e72a1799f;hpb=3b49aeb4f22569c2b5d5ca830858c4dd584fae7f;p=stockfish diff --git a/src/position.cpp b/src/position.cpp index ef5fd970..a005d5df 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -331,33 +331,26 @@ void Position::set_castle_right(Color c, Square rfrom) { const string Position::fen() const { std::ostringstream ss; - Square sq; - int emptyCnt; for (Rank rank = RANK_8; rank >= RANK_1; rank--) { - emptyCnt = 0; - for (File file = FILE_A; file <= FILE_H; file++) { - sq = file | rank; + Square sq = file | rank; if (is_empty(sq)) - emptyCnt++; - else { - if (emptyCnt > 0) - { - ss << emptyCnt; - emptyCnt = 0; - } - ss << PieceToChar[piece_on(sq)]; + int emptyCnt = 1; + + for ( ; file < FILE_H && is_empty(sq++); file++) + emptyCnt++; + + ss << emptyCnt; } + else + ss << PieceToChar[piece_on(sq)]; } - if (emptyCnt > 0) - ss << emptyCnt; - if (rank > RANK_1) ss << '/'; } @@ -365,16 +358,16 @@ const string Position::fen() const { ss << (sideToMove == WHITE ? " w " : " b "); if (can_castle(WHITE_OO)) - ss << (chess960 ? char(toupper(file_to_char(file_of(castle_rook_square(WHITE, KING_SIDE))))) : 'K'); + ss << (chess960 ? file_to_char(file_of(castle_rook_square(WHITE, KING_SIDE)), false) : 'K'); if (can_castle(WHITE_OOO)) - ss << (chess960 ? char(toupper(file_to_char(file_of(castle_rook_square(WHITE, QUEEN_SIDE))))) : 'Q'); + ss << (chess960 ? file_to_char(file_of(castle_rook_square(WHITE, QUEEN_SIDE)), false) : 'Q'); if (can_castle(BLACK_OO)) - ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, KING_SIDE))) : 'k'); + ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, KING_SIDE)), true) : 'k'); if (can_castle(BLACK_OOO)) - ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, QUEEN_SIDE))) : 'q'); + ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, QUEEN_SIDE)), true) : 'q'); if (st->castleRights == CASTLES_NONE) ss << '-'; @@ -400,14 +393,22 @@ const string Position::pretty(Move move) const { std::ostringstream ss; if (move) - ss << "\nMove is: " << (sideToMove == BLACK ? ".." : "") + ss << "\nMove: " << (sideToMove == BLACK ? ".." : "") << move_to_san(*const_cast(this), move); for (Square sq = SQ_A1; sq <= SQ_H8; sq++) if (piece_on(sq) != NO_PIECE) brd[513 - 68*rank_of(sq) + 4*file_of(sq)] = PieceToChar[piece_on(sq)]; - ss << brd << "\nFen is: " << fen() << "\nKey is: " << st->key; + ss << brd << "\nFen: " << fen() << "\nKey: " << st->key << "\nCheckers: "; + + for (Bitboard b = checkers(); b; ) + ss << square_to_string(pop_lsb(&b)) << " "; + + ss << "\nLegal moves: "; + for (MoveList ml(*this); !ml.end(); ++ml) + ss << move_to_san(*const_cast(this), ml.move()) << " "; + return ss.str(); } @@ -617,7 +618,7 @@ bool Position::is_pseudo_legal(const Move m) const { // Evasions generator already takes care to avoid some kind of illegal moves // and pl_move_is_legal() relies on this. So we have to take care that the // same kind of moves are filtered out here. - if (in_check()) + if (checkers()) { if (type_of(pc) != KING) { @@ -1144,7 +1145,7 @@ void Position::do_castle_move(Move m) { template void Position::do_null_move(StateInfo& backupSt) { - assert(!in_check()); + assert(!checkers()); // Back up the information necessary to undo the null move to the supplied // StateInfo object. Note that differently from normal case here backupSt @@ -1428,7 +1429,7 @@ bool Position::is_draw() const { && (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMg)) return true; - if (st->rule50 > 99 && (!in_check() || MoveList(*this).size())) + if (st->rule50 > 99 && (!checkers() || MoveList(*this).size())) return true; if (CheckRepetition)