Revert to old repeat detection

This commit is contained in:
2026-01-08 15:45:02 +01:00
parent 29ebb83ead
commit 123caf8378

View File

@@ -22,7 +22,7 @@ struct board {
/* used for repeated board state detection only */ /* used for repeated board state detection only */
struct history { struct history {
uint64_t hashes[50]; /* array of zobrist hashes */ struct pos items[50];
size_t length; size_t length;
} hist; } hist;
@@ -380,38 +380,23 @@ static enum move_result move_piece(struct pos* restrict pos,
pos->fullmoves += (pos->moving_side == SIDE_BLACK); pos->fullmoves += (pos->moving_side == SIDE_BLACK);
pos->halfmoves += 1; pos->halfmoves += 1;
assuming(hist->length < sizeof hist->hashes / sizeof *hist->hashes); assuming(hist->length < sizeof hist->items / sizeof *hist->items);
/* check for repeated moves */ /* check for repeated moves */
/* TODO: add move_do and move_undo to create proper repeat checks */ /* TODO: add move_do and move_undo to create proper repeat checks */
assuming(hist->length < 64);
for (size_t i = 0; i < hist->length; ++i) {
_Static_assert(sizeof *pos == sizeof hist->items[i]);
if (!my_memcmp(&hist->items[i].pieces, &pos->pieces, sizeof pos->pieces)
&& !my_memcmp(&hist->items[i].castling_illegal, &pos->castling_illegal, sizeof pos->castling_illegal)
&& hist->items[i].moving_side == pos->moving_side
&& hist->items[i].ep_targets == pos->ep_targets)
{ {
size_t i;
for (i = 0; i < hist->length / 8; ++i) {
uint64_t vec_a[8];
uint64_t vec_b[8];
bool match = false;
for (size_t vec_i = 0; vec_i < 8; ++vec_i) {
vec_a[i] = pos->hash;
}
for (size_t vec_i = 0; vec_i < 8; ++vec_i) {
vec_b[i] = hist->hashes[8*i + vec_i];
}
for (size_t vec_i = 0; vec_i < 8; ++vec_i) {
if (vec_a[vec_i] == vec_b[vec_i]) {
match = true;
}
}
if (match) {
return MR_STALEMATE; return MR_STALEMATE;
} }
} }
for (; i < hist->length; ++i) {
if (hist->hashes[i] == pos->hash) {
return MR_STALEMATE;
}
}
hist->hashes[hist->length++] = pos->hash;
}
if (pos->halfmoves > 50) { if (pos->halfmoves > 50) {
return MR_STALEMATE; return MR_STALEMATE;