mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 11:39:15 +00:00
Do not claim repetition after null move
Null moves can artificially create a repetition draw where instead there is no one. So use a second counter to reset history after a null move. Idea from Joona. After 999 games at 1+0 Mod vs Orig +238 =553 -208 51.50% 514.5/999 +10 ELO Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
5a5dc6fa10
commit
64d6ba2e98
2 changed files with 7 additions and 3 deletions
|
@ -703,7 +703,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
|
|||
// pointer to point to the new, ready to be updated, state.
|
||||
struct ReducedStateInfo {
|
||||
Key key, pawnKey, materialKey;
|
||||
int castleRights, rule50;
|
||||
int castleRights, rule50, pliesFromNull;
|
||||
Square epSquare;
|
||||
Value mgValue, egValue;
|
||||
Value npMaterial[2];
|
||||
|
@ -724,6 +724,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
|
|||
// Increment the 50 moves rule draw counter. Resetting it to zero in the
|
||||
// case of non-reversible moves is taken care of later.
|
||||
st->rule50++;
|
||||
st->pliesFromNull++;
|
||||
|
||||
if (move_is_castle(m))
|
||||
{
|
||||
|
@ -1242,6 +1243,7 @@ void Position::do_null_move(StateInfo& backupSt) {
|
|||
backupSt.mgValue = st->mgValue;
|
||||
backupSt.egValue = st->egValue;
|
||||
backupSt.previous = st->previous;
|
||||
backupSt.pliesFromNull = st->pliesFromNull;
|
||||
st->previous = &backupSt;
|
||||
|
||||
// Save the current key to the history[] array, in order to be able to
|
||||
|
@ -1258,6 +1260,7 @@ void Position::do_null_move(StateInfo& backupSt) {
|
|||
sideToMove = opposite_color(sideToMove);
|
||||
st->epSquare = SQ_NONE;
|
||||
st->rule50++;
|
||||
st->pliesFromNull = 0;
|
||||
gamePly++;
|
||||
|
||||
st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame;
|
||||
|
@ -1279,6 +1282,7 @@ void Position::undo_null_move() {
|
|||
st->mgValue = backupSt->mgValue;
|
||||
st->egValue = backupSt->egValue;
|
||||
st->previous = backupSt->previous;
|
||||
st->pliesFromNull = backupSt->pliesFromNull;
|
||||
|
||||
// Update the necessary information
|
||||
sideToMove = opposite_color(sideToMove);
|
||||
|
@ -1683,7 +1687,7 @@ bool Position::is_draw() const {
|
|||
return true;
|
||||
|
||||
// Draw by repetition?
|
||||
for (int i = 2; i < Min(gamePly, st->rule50); i += 2)
|
||||
for (int i = 2; i < Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2)
|
||||
if (history[gamePly - i] == st->key)
|
||||
return true;
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ enum Phase {
|
|||
|
||||
struct StateInfo {
|
||||
Key key, pawnKey, materialKey;
|
||||
int castleRights, rule50;
|
||||
int castleRights, rule50, pliesFromNull;
|
||||
Square epSquare;
|
||||
Value mgValue, egValue;
|
||||
Value npMaterial[2];
|
||||
|
|
Loading…
Add table
Reference in a new issue