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:
parent
2bb555025f
commit
f200f3ccd2
6 changed files with 13 additions and 16 deletions
|
@ -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")
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Reference in a new issue