From: Marco Costalba Date: Mon, 3 Jan 2011 11:50:49 +0000 (+0100) Subject: Another attempt at fixing Chess960 X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=f200f3ccd2281deadecb6279fac59b16dea622d5 Another attempt at fixing Chess960 Keep the isChess960 flag inside Position so that is copied with the Position, but esplicitly highlight the fact that a FEN string has not enough information to detect Chess960 in general case. To do this add a boolean argument isChess960 to from_fen() function so to self document this shortcoming of FEN notation. Signed-off-by: Marco Costalba --- diff --git a/src/benchmark.cpp b/src/benchmark.cpp index d0afee89..cbb62d29 100644 --- a/src/benchmark.cpp +++ b/src/benchmark.cpp @@ -125,7 +125,7 @@ void benchmark(int argc, char* argv[]) { { Move moves[1] = { MOVE_NONE }; int dummy[2] = { 0, 0 }; - Position pos(*it, 0); + Position pos(*it, false, 0); cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl; if (valType == "perft") { diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 58feae39..fe964935 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -562,7 +562,7 @@ namespace { } // Special extra evaluation for bishops - if (Piece == BISHOP) + if (Piece == BISHOP && pos.is_chess960()) { // An important Chess960 pattern: A cornered bishop blocked by // a friendly pawn diagonally in front of it is a very serious diff --git a/src/material.cpp b/src/material.cpp index bd9d5e8a..0098b39c 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -407,7 +407,7 @@ Key EndgameFunctions::buildKey(const string& keyCode) { } fen += char(8 - keyCode.length() + '0'); fen += "/8/8/8/8/8/8/8 w - -"; - return Position(fen, 0).get_material_key(); + return Position(fen, false, 0).get_material_key(); } const string EndgameFunctions::swapColors(const string& keyCode) { diff --git a/src/position.cpp b/src/position.cpp index f0301e4e..bc6efb7f 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -152,9 +152,9 @@ Position::Position(const Position& pos, int th) { nodes = 0; } -Position::Position(const string& fen, int th) { +Position::Position(const string& fen, bool isChess960, int th) { - from_fen(fen); + from_fen(fen, isChess960); threadID = th; } @@ -175,7 +175,7 @@ void Position::detach() { /// string. This function is not very robust - make sure that input FENs are /// correct (this is assumed to be the responsibility of the GUI). -void Position::from_fen(const string& fen) { +void Position::from_fen(const string& fen, bool c960) { /* A FEN string defines a particular position using only the ASCII character set. @@ -274,10 +274,7 @@ void Position::from_fen(const string& fen) { castleRightsMask[make_square(initialQRFile, RANK_1)] ^= WHITE_OOO; castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO; - isChess960 = initialKFile != FILE_E - || initialQRFile != FILE_A - || initialKRFile != FILE_H; - + isChess960 = c960; find_checkers(); st->key = compute_key(); diff --git a/src/position.h b/src/position.h index 5b1bc664..600c1648 100644 --- a/src/position.h +++ b/src/position.h @@ -134,10 +134,10 @@ public: // Constructors Position(const Position& pos, int threadID); - Position(const std::string& fen, int threadID); + Position(const std::string& fen, bool isChess960, int threadID); // Text input/output - void from_fen(const std::string& fen); + void from_fen(const std::string& fen, bool isChess960); const std::string to_fen() const; void print(Move m = MOVE_NONE) const; diff --git a/src/uci.cpp b/src/uci.cpp index 5e850985..1b10c7b4 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -63,7 +63,7 @@ namespace { bool execute_uci_command(const string& cmd) { - static Position pos(StartPositionFEN, 0); // The root position + static Position pos(StartPositionFEN, false, 0); // The root position UCIParser up(cmd); string token; @@ -84,7 +84,7 @@ bool execute_uci_command(const string& cmd) { cout << "uciok" << endl; } else if (token == "ucinewgame") - pos.from_fen(StartPositionFEN); + pos.from_fen(StartPositionFEN, false); else if (token == "isready") cout << "readyok" << endl; @@ -147,7 +147,7 @@ namespace { if (token == "startpos") { - pos.from_fen(StartPositionFEN); + pos.from_fen(StartPositionFEN, false); if (!(up >> token)) return; } @@ -159,7 +159,7 @@ namespace { fen += token; fen += ' '; } - pos.from_fen(fen); + pos.from_fen(fen, Options["UCI_Chess960"].value()); } if (token != "moves")