1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

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 <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-01-03 12:50:49 +01:00
parent 2bb555025f
commit f200f3ccd2
6 changed files with 13 additions and 16 deletions

View file

@ -125,7 +125,7 @@ void benchmark(int argc, char* argv[]) {
{ {
Move moves[1] = { MOVE_NONE }; Move moves[1] = { MOVE_NONE };
int dummy[2] = { 0, 0 }; int dummy[2] = { 0, 0 };
Position pos(*it, 0); Position pos(*it, false, 0);
cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl; cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl;
if (valType == "perft") if (valType == "perft")
{ {

View file

@ -562,7 +562,7 @@ namespace {
} }
// Special extra evaluation for bishops // Special extra evaluation for bishops
if (Piece == BISHOP) if (Piece == BISHOP && pos.is_chess960())
{ {
// An important Chess960 pattern: A cornered bishop blocked by // An important Chess960 pattern: A cornered bishop blocked by
// a friendly pawn diagonally in front of it is a very serious // a friendly pawn diagonally in front of it is a very serious

View file

@ -407,7 +407,7 @@ Key EndgameFunctions::buildKey(const string& keyCode) {
} }
fen += char(8 - keyCode.length() + '0'); fen += char(8 - keyCode.length() + '0');
fen += "/8/8/8/8/8/8/8 w - -"; 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) { const string EndgameFunctions::swapColors(const string& keyCode) {

View file

@ -152,9 +152,9 @@ Position::Position(const Position& pos, int th) {
nodes = 0; 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; threadID = th;
} }
@ -175,7 +175,7 @@ void Position::detach() {
/// string. This function is not very robust - make sure that input FENs are /// string. This function is not very robust - make sure that input FENs are
/// correct (this is assumed to be the responsibility of the GUI). /// 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. 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_1)] ^= WHITE_OOO;
castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO; castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO;
isChess960 = initialKFile != FILE_E isChess960 = c960;
|| initialQRFile != FILE_A
|| initialKRFile != FILE_H;
find_checkers(); find_checkers();
st->key = compute_key(); st->key = compute_key();

View file

@ -134,10 +134,10 @@ public:
// Constructors // Constructors
Position(const Position& pos, int threadID); 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 // 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; const std::string to_fen() const;
void print(Move m = MOVE_NONE) const; void print(Move m = MOVE_NONE) const;

View file

@ -63,7 +63,7 @@ namespace {
bool execute_uci_command(const string& cmd) { 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); UCIParser up(cmd);
string token; string token;
@ -84,7 +84,7 @@ bool execute_uci_command(const string& cmd) {
cout << "uciok" << endl; cout << "uciok" << endl;
} }
else if (token == "ucinewgame") else if (token == "ucinewgame")
pos.from_fen(StartPositionFEN); pos.from_fen(StartPositionFEN, false);
else if (token == "isready") else if (token == "isready")
cout << "readyok" << endl; cout << "readyok" << endl;
@ -147,7 +147,7 @@ namespace {
if (token == "startpos") if (token == "startpos")
{ {
pos.from_fen(StartPositionFEN); pos.from_fen(StartPositionFEN, false);
if (!(up >> token)) if (!(up >> token))
return; return;
} }
@ -159,7 +159,7 @@ namespace {
fen += token; fen += token;
fen += ' '; fen += ' ';
} }
pos.from_fen(fen); pos.from_fen(fen, Options["UCI_Chess960"].value<bool>());
} }
if (token != "moves") if (token != "moves")