X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=6de3f08c89e69b6baf72cc502343e85cfc2e363e;hp=8d63c52f10b92512ebf5589ce33243e43eddcd6c;hb=84ce43498a1e4cc3a963950d5b5de3c6eaaefc1c;hpb=88bb3c9422191b2e8260eeb4d5186f5b4708520f diff --git a/src/position.cpp b/src/position.cpp index 8d63c52f..6de3f08c 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -48,6 +48,13 @@ Key Position::zobSideToMove; Value Position::MgPieceSquareTable[16][64]; Value Position::EgPieceSquareTable[16][64]; +const Piece_attacks_fn piece_attacks_fn[] = + { 0, 0, + &Position::knight_attacks, + &Position::bishop_attacks, + &Position::rook_attacks, + &Position::queen_attacks, + &Position::king_attacks }; //// //// Functions @@ -70,7 +77,7 @@ Position::Position(const std::string &fen) { void Position::from_fen(const std::string &fen) { - static const std::string piecesStr = "KQRBNPkqrbnp"; + static const std::string pieceLetters = "KQRBNPkqrbnp"; static const Piece pieces[] = { WK, WQ, WR, WB, WN, WP, BK, BQ, BR, BB, BN, BP }; clear(); @@ -93,7 +100,7 @@ void Position::from_fen(const std::string &fen) { rank--; continue; } - size_t idx = piecesStr.find(fen[i]); + size_t idx = pieceLetters.find(fen[i]); if (idx == std::string::npos) { std::cout << "Error in FEN at character " << i << std::endl; @@ -106,7 +113,7 @@ void Position::from_fen(const std::string &fen) { // Side to move i++; - if (fen[i] != 'w' && fen[i] == 'b') + if (fen[i] != 'w' && fen[i] != 'b') { std::cout << "Error in FEN at character " << i << std::endl; return; @@ -214,40 +221,50 @@ void Position::from_fen(const std::string &fen) { /// probably only useful for debugging. const std::string Position::to_fen() const { - char pieceLetters[] = " PNBRQK pnbrqk"; - std::string result; + + static const std::string pieceLetters = " PNBRQK pnbrqk"; + std::string fen; int skip; - for(Rank rank = RANK_8; rank >= RANK_1; rank--) { - skip = 0; - for(File file = FILE_A; file <= FILE_H; file++) { - Square square = make_square(file, rank); - if(square_is_occupied(square)) { - if(skip > 0) result += (char)skip + '0'; - result += pieceLetters[piece_on(square)]; - skip = 0; + for (Rank rank = RANK_8; rank >= RANK_1; rank--) + { + skip = 0; + for (File file = FILE_A; file <= FILE_H; file++) + { + Square sq = make_square(file, rank); + if (!square_is_occupied(sq)) + { skip++; + continue; + } + if (skip > 0) + { + fen += (char)skip + '0'; + skip = 0; + } + fen += pieceLetters[piece_on(sq)]; } - else skip++; - } - if(skip > 0) result += (char)skip + '0'; - result += (rank > RANK_1)? '/' : ' '; - } + if (skip > 0) + fen += (char)skip + '0'; - result += (sideToMove == WHITE)? 'w' : 'b'; - result += ' '; - if(castleRights == NO_CASTLES) result += '-'; - else { - if(can_castle_kingside(WHITE)) result += 'K'; - if(can_castle_queenside(WHITE)) result += 'Q'; - if(can_castle_kingside(BLACK)) result += 'k'; - if(can_castle_queenside(BLACK)) result += 'q'; + fen += (rank > RANK_1 ? '/' : ' '); } + fen += (sideToMove == WHITE ? 'w' : 'b') + ' '; + if (castleRights != NO_CASTLES) + { + if (can_castle_kingside(WHITE)) fen += 'K'; + if (can_castle_queenside(WHITE)) fen += 'Q'; + if (can_castle_kingside(BLACK)) fen += 'k'; + if (can_castle_queenside(BLACK)) fen += 'q'; + } else + fen += '-'; + + fen += ' '; + if (ep_square() != SQ_NONE) + fen += square_to_string(ep_square()); + else + fen += '-'; - result += ' '; - if(ep_square() == SQ_NONE) result += '-'; - else result += square_to_string(ep_square()); - - return result; + return fen; }