X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=2266f2a573dfa05e313b0913d903578d1e4ebb2d;hp=e1f07bfb4857292bfb7d479cd9f270d05668fd60;hb=7a1ff6d8ff39bb9e6844d24467899d47e942486f;hpb=23b6809f3dffe8c93b7edef4e5d47925920e5031 diff --git a/src/position.cpp b/src/position.cpp index e1f07bfb..2266f2a5 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -120,12 +120,12 @@ void Position::init() { RKISS rk; - for (Color c = WHITE; c <= BLACK; c++) - for (PieceType pt = PAWN; pt <= KING; pt++) - for (Square s = SQ_A1; s <= SQ_H8; s++) + for (Color c = WHITE; c <= BLACK; ++c) + for (PieceType pt = PAWN; pt <= KING; ++pt) + for (Square s = SQ_A1; s <= SQ_H8; ++s) Zobrist::psq[c][pt][s] = rk.rand(); - for (File f = FILE_A; f <= FILE_H; f++) + for (File f = FILE_A; f <= FILE_H; ++f) Zobrist::enpassant[f] = rk.rand(); for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++) @@ -141,14 +141,14 @@ void Position::init() { Zobrist::side = rk.rand(); Zobrist::exclusion = rk.rand(); - for (PieceType pt = PAWN; pt <= KING; pt++) + for (PieceType pt = PAWN; pt <= KING; ++pt) { PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt]; PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt]; Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]); - for (Square s = SQ_A1; s <= SQ_H8; s++) + for (Square s = SQ_A1; s <= SQ_H8; ++s) { psq[WHITE][pt][ s] = (v + PSQT[pt][s]); psq[BLACK][pt][~s] = -(v + PSQT[pt][s]); @@ -233,7 +233,7 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { else if ((p = PieceToChar.find(token)) != string::npos) { put_piece(sq, color_of(Piece(p)), type_of(Piece(p))); - sq++; + ++sq; } } @@ -255,10 +255,10 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { token = char(toupper(token)); if (token == 'K') - for (rsq = relative_square(c, SQ_H1); type_of(piece_on(rsq)) != ROOK; rsq--) {} + for (rsq = relative_square(c, SQ_H1); type_of(piece_on(rsq)) != ROOK; --rsq) {} else if (token == 'Q') - for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; rsq++) {} + for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; ++rsq) {} else if (token >= 'A' && token <= 'H') rsq = File(token - 'A') | relative_rank(c, RANK_1); @@ -317,11 +317,11 @@ void Position::set_castle_right(Color c, Square rfrom) { Square kto = relative_square(c, cs == KING_SIDE ? SQ_G1 : SQ_C1); Square rto = relative_square(c, cs == KING_SIDE ? SQ_F1 : SQ_D1); - for (Square s = std::min(rfrom, rto); s <= std::max(rfrom, rto); s++) + for (Square s = std::min(rfrom, rto); s <= std::max(rfrom, rto); ++s) if (s != kfrom && s != rfrom) castlePath[c][cs] |= s; - for (Square s = std::min(kfrom, kto); s <= std::max(kfrom, kto); s++) + for (Square s = std::min(kfrom, kto); s <= std::max(kfrom, kto); ++s) if (s != kfrom && s != rfrom) castlePath[c][cs] |= s; } @@ -334,9 +334,9 @@ const string Position::fen() const { std::ostringstream ss; - for (Rank rank = RANK_8; rank >= RANK_1; rank--) + for (Rank rank = RANK_8; rank >= RANK_1; --rank) { - for (File file = FILE_A; file <= FILE_H; file++) + for (File file = FILE_A; file <= FILE_H; ++file) { Square sq = file | rank; @@ -344,7 +344,7 @@ const string Position::fen() const { { int emptyCnt = 1; - for ( ; file < FILE_H && is_empty(sq++); file++) + for ( ; file < FILE_H && is_empty(++sq); ++file) emptyCnt++; ss << emptyCnt; @@ -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; } @@ -1210,9 +1210,9 @@ Key Position::compute_material_key() const { Key k = 0; - for (Color c = WHITE; c <= BLACK; c++) - for (PieceType pt = PAWN; pt <= QUEEN; pt++) - for (int cnt = 0; cnt < pieceCount[c][pt]; cnt++) + for (Color c = WHITE; c <= BLACK; ++c) + for (PieceType pt = PAWN; pt <= QUEEN; ++pt) + for (int cnt = 0; cnt < pieceCount[c][pt]; ++cnt) k ^= Zobrist::psq[c][pt][cnt]; return k; @@ -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; @@ -1247,7 +1248,7 @@ Value Position::compute_non_pawn_material(Color c) const { Value value = VALUE_ZERO; - for (PieceType pt = KNIGHT; pt <= QUEEN; pt++) + for (PieceType pt = KNIGHT; pt <= QUEEN; ++pt) value += pieceCount[c][pt] * PieceValue[MG][pt]; return value; @@ -1268,7 +1269,6 @@ bool Position::is_draw() const { 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 +1279,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 +1294,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 +1302,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()); @@ -1366,7 +1366,7 @@ bool Position::pos_is_ok(int* failedStep) const { { int kingCount[COLOR_NB] = {}; - for (Square s = SQ_A1; s <= SQ_H8; s++) + for (Square s = SQ_A1; s <= SQ_H8; ++s) if (type_of(piece_on(s)) == KING) kingCount[color_of(piece_on(s))]++; @@ -1393,8 +1393,8 @@ bool Position::pos_is_ok(int* failedStep) const { return false; // Separate piece type bitboards must have empty intersections - for (PieceType p1 = PAWN; p1 <= KING; p1++) - for (PieceType p2 = PAWN; p2 <= KING; p2++) + for (PieceType p1 = PAWN; p1 <= KING; ++p1) + for (PieceType p2 = PAWN; p2 <= KING; ++p2) if (p1 != p2 && (pieces(p1) & pieces(p2))) return false; } @@ -1420,21 +1420,21 @@ bool Position::pos_is_ok(int* failedStep) const { return false; if ((*step)++, debugPieceCounts) - for (Color c = WHITE; c <= BLACK; c++) - for (PieceType pt = PAWN; pt <= KING; pt++) + for (Color c = WHITE; c <= BLACK; ++c) + for (PieceType pt = PAWN; pt <= KING; ++pt) if (pieceCount[c][pt] != popcount(pieces(c, pt))) return false; if ((*step)++, debugPieceList) - for (Color c = WHITE; c <= BLACK; c++) - for (PieceType pt = PAWN; pt <= KING; pt++) + for (Color c = WHITE; c <= BLACK; ++c) + for (PieceType pt = PAWN; pt <= KING; ++pt) for (int i = 0; i < pieceCount[c][pt]; i++) if ( board[pieceList[c][pt][i]] != make_piece(c, pt) || index[pieceList[c][pt][i]] != i) return false; if ((*step)++, debugCastleSquares) - for (Color c = WHITE; c <= BLACK; c++) + for (Color c = WHITE; c <= BLACK; ++c) for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1)) { CastleRight cr = make_castle_right(c, s);