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<Key>();
- for (File f = FILE_A; f <= FILE_H; f++)
+ for (File f = FILE_A; f <= FILE_H; ++f)
Zobrist::enpassant[f] = rk.rand<Key>();
for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++)
Zobrist::side = rk.rand<Key>();
Zobrist::exclusion = rk.rand<Key>();
- 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]);
else if ((p = PieceToChar.find(token)) != string::npos)
{
put_piece(sq, color_of(Piece(p)), type_of(Piece(p)));
- sq++;
+ ++sq;
}
}
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);
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;
}
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;
{
int emptyCnt = 1;
- for ( ; file < FILE_H && is_empty(sq++); file++)
+ for ( ; file < FILE_H && is_empty(++sq); ++file)
emptyCnt++;
ss << emptyCnt;
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;
}
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;
/// 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;
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;
if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
return true;
- // Draw by repetition?
int i = 4, e = std::min(st->rule50, st->pliesFromNull);
if (i <= e)
stp = stp->previous->previous;
if (stp->key == st->key)
- return true;
+ return true; // Draw after first repetition
i += 2;
/// 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() {
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());
{
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))]++;
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;
}
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<Full>(pieces(c, pt)))
return false;
if ((*step)++, debugPieceList)
- for (Color c = WHITE; c <= BLACK; c++)
- for (PieceType pt = PAWN; pt <= KING; pt++)
- for (int i = 0; i < pieceCount[c][pt]; i++)
+ 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);