X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=0b687a8d1496e797e22983b36ca7b0819fd92ea8;hp=e1f07bfb4857292bfb7d479cd9f270d05668fd60;hb=49e110c52b19f5c99954d4797b8e991b0b60007c;hpb=23b6809f3dffe8c93b7edef4e5d47925920e5031 diff --git a/src/position.cpp b/src/position.cpp index e1f07bfb..0b687a8d 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1149,9 +1149,9 @@ void Position::clear() { startState.epSquare = SQ_NONE; st = &startState; - for (int i = 0; i < 8; i++) + for (int i = 0; i < PIECE_TYPE_NB; i++) for (int j = 0; j < 16; j++) - pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE; + pieceList[WHITE][i][j] = pieceList[BLACK][i][j] = SQ_NONE; } @@ -1223,6 +1223,7 @@ Key Position::compute_material_key() const { /// game and the endgame. These functions are used to initialize the incremental /// scores when a new position is set up, and to verify that the scores are correctly /// updated by do_move and undo_move when the program is running in debug mode. + Score Position::compute_psq_score() const { Score score = SCORE_ZERO; @@ -1254,21 +1255,14 @@ Value Position::compute_non_pawn_material(Color c) const { } -/// Position::is_draw() tests whether the position is drawn by material, -/// repetition, or the 50 moves rule. It does not detect stalemates, this -/// must be done by the search. -bool Position::is_draw() const { +/// Position::is_draw() tests whether the position is drawn by 50 moves rule +/// or by repetition. It does not detect stalemates. - // Draw by material? - if ( !pieces(PAWN) - && (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMg)) - return true; +bool Position::is_draw() const { - // Draw by the 50 moves rule? if (st->rule50 > 99 && (!checkers() || MoveList(*this).size())) return true; - // Draw by repetition? int i = 4, e = std::min(st->rule50, st->pliesFromNull); if (i <= e) @@ -1279,7 +1273,7 @@ bool Position::is_draw() const { stp = stp->previous->previous; if (stp->key == st->key) - return true; + return true; // Draw after first repetition i += 2; @@ -1294,7 +1288,7 @@ bool Position::is_draw() const { /// is only useful for debugging especially for finding evaluation symmetry bugs. static char toggle_case(char c) { - return isupper(c) ? tolower(c) : toupper(c); + return char(islower(c) ? toupper(c) : tolower(c)); } void Position::flip() { @@ -1302,24 +1296,24 @@ void Position::flip() { string f, token; std::stringstream ss(fen()); - for (int i = 0; i < 8; i++) + for (Rank rank = RANK_8; rank >= RANK_1; rank--) // Piece placement { - std::getline(ss, token, i < 7 ? '/' : ' '); - std::transform(token.begin(), token.end(), token.begin(), toggle_case); - f.insert(0, token + (i ? "/" : " ")); + std::getline(ss, token, rank > RANK_1 ? '/' : ' '); + f.insert(0, token + (f.empty() ? " " : "/")); } - ss >> token; // Side to move - f += (token == "w" ? "b " : "w "); + ss >> token; // Active color + f += (token == "w" ? "B " : "W "); // Will be lowercased later - ss >> token; // Castling flags - std::transform(token.begin(), token.end(), token.begin(), toggle_case); + ss >> token; // Castling availability f += token + " "; - ss >> token; // En-passant square + std::transform(f.begin(), f.end(), f.begin(), toggle_case); + + ss >> token; // En passant square f += (token == "-" ? token : token.replace(1, 1, token[1] == '3' ? "6" : "3")); - std::getline(ss, token); // Full and half moves + std::getline(ss, token); // Half and full moves f += token; set(f, is_chess960(), this_thread());