position add: pos_set_pinners_blockers()

This commit is contained in:
2024-03-26 17:31:44 +01:00
parent aaeab03089
commit 70d6c23c00
3 changed files with 68 additions and 30 deletions

View File

@@ -186,6 +186,30 @@ bitboard_t pos_checkers(const pos_t *pos, const color_t color)
return sq_attackers(pos, occ, pos->king[color], OPPONENT(color));
}
/**
* pos_king_pinners_blockers() - set position "pinners" and "blockers".
* @pos: &position
*
* set position "pinners" on player-to-play king.
*
*/
void pos_set_pinners_blockers(pos_t *pos)
{
color_t color = pos->turn;
square_t king = pos->king[color];
bitboard_t tmp, occ = pos_occ(pos), blockers = 0;
int pinner;
pos->pinners = sq_pinners(pos, king, OPPONENT(pos->turn));
bit_for_each64(pinner, tmp, pos->pinners) {
//bitboard_t blocker =
// warn_on(popcount64(blocker) != 1);
blockers |= bb_between_excl[pinner][king] & occ;
}
pos->blockers = blockers;
return;
}
/**
* pos_king_pinners() - get the "pinners" on a king "pinners".
* @pos: &position
@@ -218,13 +242,12 @@ bitboard_t pos_king_blockers(const pos_t *pos, const color_t color, const bitboa
square_t pinner, king = pos->king[color];
bit_for_each64(pinner, tmp, pinners) {
bitboard_t blocker = bb_between_excl[pinner][king] & occ;
warn_on(popcount64(blocker) != 1);
if (popcount64(blocker) != 1) {
printf("n blockers = %d\n", popcount64(blocker));
bb_print("blockers", blocker);
}
blockers |= blocker;
//warn_on(popcount64(blocker) != 1);
//if (popcount64(blocker) != 1) {
// printf("n blockers = %d\n", popcount64(blocker));
// bb_print("blockers", blocker);
//}
blockers |= bb_between_excl[pinner][king] & occ;
}
return blockers;
}
@@ -333,7 +356,7 @@ void pos_print_mask(const pos_t *pos, const bitboard_t mask)
}
/**
* pos_print_board_raw - print simple position board (octal/FEN symbol values)
* pos_print_raw - print simple position board (octal/FEN symbol values)
* @bb: the bitboard
* @type: int, 0 for octal, 1 for fen symbol
*/

View File

@@ -30,7 +30,8 @@ typedef struct __pos_s {
u64 node_count; /* evaluated nodes */
int turn; /* WHITE or BLACK */
/* data which cannot be recovered by move_undo
/* data which cannot be recovered by move_undo (like castle_rights, ...),
* or would be expensive to recover (checkers, ...)
* following data can be accessed either directly, either via "movesave"
* structure name.
* For example, pos->en_passant and pos->state.en_passant are the same.
@@ -48,7 +49,6 @@ typedef struct __pos_s {
);
piece_t board[BOARDSIZE];
bitboard_t bb[2][PIECE_TYPE_MAX]; /* bb[0][PAWN], bb[1][ALL_PIECES] */
//bitboard_t controlled[2]; /* unsure */
square_t king[2]; /* dup with bb, faster retrieval */
@@ -159,12 +159,11 @@ void pos_del(pos_t *pos);
pos_t *pos_clear(pos_t *pos);
bool pos_cmp(const pos_t *pos1, const pos_t *pos2);
//bitboard_t set_king_pinners_blockers(pos_t *pos);
void pos_set_pinners_blockers(pos_t *pos);
bitboard_t pos_checkers(const pos_t *pos, const color_t color);
bitboard_t pos_king_pinners(const pos_t *pos, const color_t color);
bitboard_t pos_king_blockers(const pos_t *pos, const color_t color, const bitboard_t );
//bitboard_t set_king_pinners_blockers(pos_t *pos);
//char *pos_checkers2str(const pos_t *pos, char *str);
//char *pos_pinners2str(const pos_t *pos, char *str);
int pos_check(const pos_t *pos, const bool strict);