mirror of
https://github.com/peterosterlund2/droidfish.git
synced 2025-12-17 19:22:18 +01:00
DroidFish: Update to stockfish 9.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||
Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
|
||||
Copyright (C) 2015-2017 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
|
||||
Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
|
||||
|
||||
Stockfish is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -211,10 +211,10 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
while ((ss >> token) && !isspace(token))
|
||||
{
|
||||
if (isdigit(token))
|
||||
sq += Square(token - '0'); // Advance the given number of files
|
||||
sq += (token - '0') * EAST; // Advance the given number of files
|
||||
|
||||
else if (token == '/')
|
||||
sq -= Square(16);
|
||||
sq += 2 * SOUTH;
|
||||
|
||||
else if ((idx = PieceToChar.find(token)) != string::npos)
|
||||
{
|
||||
@@ -272,7 +272,7 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
// 5-6. Halfmove clock and fullmove number
|
||||
ss >> std::skipws >> st->rule50 >> gamePly;
|
||||
|
||||
// Convert from fullmove starting from 1 to ply starting from 0,
|
||||
// Convert from fullmove starting from 1 to gamePly starting from 0,
|
||||
// handle also common incorrect FEN with fullmove = 0.
|
||||
gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK);
|
||||
|
||||
@@ -787,7 +787,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
if ( (int(to) ^ int(from)) == 16
|
||||
&& (attacks_from<PAWN>(to - pawn_push(us), us) & pieces(them, PAWN)))
|
||||
{
|
||||
st->epSquare = (from + to) / 2;
|
||||
st->epSquare = to - pawn_push(us);
|
||||
k ^= Zobrist::enpassant[file_of(st->epSquare)];
|
||||
}
|
||||
|
||||
@@ -1003,17 +1003,21 @@ bool Position::see_ge(Move m, Value threshold) const {
|
||||
Value balance; // Values of the pieces taken by us minus opponent's ones
|
||||
Bitboard occupied, stmAttackers;
|
||||
|
||||
balance = PieceValue[MG][piece_on(to)];
|
||||
// The opponent may be able to recapture so this is the best result
|
||||
// we can hope for.
|
||||
balance = PieceValue[MG][piece_on(to)] - threshold;
|
||||
|
||||
if (balance < threshold)
|
||||
if (balance < VALUE_ZERO)
|
||||
return false;
|
||||
|
||||
// Now assume the worst possible result: that the opponent can
|
||||
// capture our piece for free.
|
||||
balance -= PieceValue[MG][nextVictim];
|
||||
|
||||
if (balance >= threshold) // Always true if nextVictim == KING
|
||||
if (balance >= VALUE_ZERO) // Always true if nextVictim == KING
|
||||
return true;
|
||||
|
||||
bool relativeStm = true; // True if the opponent is to move
|
||||
bool opponentToMove = true;
|
||||
occupied = pieces() ^ from ^ to;
|
||||
|
||||
// Find all attackers to the destination square, with the moving piece removed,
|
||||
@@ -1022,6 +1026,12 @@ bool Position::see_ge(Move m, Value threshold) const {
|
||||
|
||||
while (true)
|
||||
{
|
||||
// The balance is negative only because we assumed we could win
|
||||
// the last piece for free. We are truly winning only if we can
|
||||
// win the last piece _cheaply enough_. Test if we can actually
|
||||
// do this otherwise "give up".
|
||||
assert(balance < VALUE_ZERO);
|
||||
|
||||
stmAttackers = attackers & pieces(stm);
|
||||
|
||||
// Don't allow pinned pieces to attack pieces except the king as long all
|
||||
@@ -1029,25 +1039,40 @@ bool Position::see_ge(Move m, Value threshold) const {
|
||||
if (!(st->pinnersForKing[stm] & ~occupied))
|
||||
stmAttackers &= ~st->blockersForKing[stm];
|
||||
|
||||
// If we have no more attackers we must give up
|
||||
if (!stmAttackers)
|
||||
return relativeStm;
|
||||
break;
|
||||
|
||||
// Locate and remove the next least valuable attacker
|
||||
nextVictim = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
|
||||
|
||||
if (nextVictim == KING)
|
||||
return relativeStm == bool(attackers & pieces(~stm));
|
||||
{
|
||||
// Our only attacker is the king. If the opponent still has
|
||||
// attackers we must give up. Otherwise we make the move and
|
||||
// (having no more attackers) the opponent must give up.
|
||||
if (!(attackers & pieces(~stm)))
|
||||
opponentToMove = !opponentToMove;
|
||||
break;
|
||||
}
|
||||
|
||||
balance += relativeStm ? PieceValue[MG][nextVictim]
|
||||
: -PieceValue[MG][nextVictim];
|
||||
// Assume the opponent can win the next piece for free and switch sides
|
||||
balance += PieceValue[MG][nextVictim];
|
||||
opponentToMove = !opponentToMove;
|
||||
|
||||
relativeStm = !relativeStm;
|
||||
|
||||
if (relativeStm == (balance >= threshold))
|
||||
return relativeStm;
|
||||
// If balance is negative after receiving a free piece then give up
|
||||
if (balance < VALUE_ZERO)
|
||||
break;
|
||||
|
||||
// Complete the process of switching sides. The first line swaps
|
||||
// all negative numbers with non-negative numbers. The compiler
|
||||
// probably knows that it is just the bitwise negation ~balance.
|
||||
balance = -balance-1;
|
||||
stm = ~stm;
|
||||
}
|
||||
|
||||
// If the opponent gave up we win, otherwise we lose.
|
||||
return opponentToMove;
|
||||
}
|
||||
|
||||
|
||||
@@ -1071,11 +1096,10 @@ bool Position::is_draw(int ply) const {
|
||||
{
|
||||
stp = stp->previous->previous;
|
||||
|
||||
// At root position ply is 1, so return a draw score if a position
|
||||
// repeats once earlier but strictly after the root, or repeats twice
|
||||
// before or at the root.
|
||||
// Return a draw score if a position repeats once earlier but strictly
|
||||
// after the root, or repeats twice before or at the root.
|
||||
if ( stp->key == st->key
|
||||
&& ++cnt + (ply - 1 > i) == 2)
|
||||
&& ++cnt + (ply > i) == 2)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user