add castle pseudo-moves

This commit is contained in:
2021-10-31 20:43:43 +01:00
parent 3ac41d7f78
commit 537c36d14c
2 changed files with 54 additions and 1 deletions

View File

@@ -55,6 +55,10 @@ void move_print(move_t *move)
printf("e.p.");
if (move->promotion)
printf("=%s", P_SYM(move->promotion));
if (move->flags & M_CASTLE_K)
printf("(O-O)");
if (move->flags & M_CASTLE_Q)
printf("(O-O-O)");
printf(" ");
}
@@ -196,6 +200,52 @@ int pseudo_moves_pawn(pos_t *pos, piece_list_t *ppiece)
return count;
}
int pseudo_moves_castle(pos_t *pos)
{
//piece_t piece = PIECE(ppiece->piece);
//square_t square = ppiece->square, new;
unsigned char color = pos->turn;
board_t *board = pos->board;
unsigned char rank1, castle_K, castle_Q;
move_t *move = NULL;
unsigned short count=0;
if (color == WHITE) {
rank1 = 0;
castle_K = pos->castle & CASTLE_WK;
castle_Q = pos->castle & CASTLE_WQ;
} else {
rank1 = 7;
castle_K = pos->castle & CASTLE_WK;
castle_Q = pos->castle & CASTLE_WQ;
}
if (castle_K) {
if (!(board[SQUARE(5, rank1)].piece ||
board[SQUARE(6, rank1)].piece)) {
move = move_add(pos, board[SQUARE(4, rank1)].piece,
SQUARE(4, rank1), SQUARE(6, rank1));
if (move) {
move->flags |= M_CASTLE_K;
}
count++;
}
}
if (castle_Q) {
if (!(board[SQUARE(1, rank1)].piece ||
board[SQUARE(2, rank1)].piece ||
board[SQUARE(3, rank1)].piece )) {
move = move_add(pos, board[SQUARE(4, rank1)].piece,
SQUARE(4, rank1), SQUARE(2, rank1));
if (move) {
move->flags |= M_CASTLE_Q;
}
count++;
}
}
return count;
}
/* general rule moves for non pawn pieces
*/
int pseudo_moves_gen(pos_t *pos, piece_list_t *ppiece)
@@ -252,6 +302,7 @@ int moves_get(pos_t *pos)
piece_list = pos->turn == WHITE? &pos->pieces_white: &pos->pieces_black;
pseudo_moves_castle(pos);
list_for_each_safe(p_cur, tmp, piece_list) {
piece = list_entry(p_cur, piece_list_t, list);
if (PIECE(piece->piece) != PAWN)

View File

@@ -27,7 +27,8 @@ typedef unsigned char move_flags_t;
#define M_CAPTURE 0x02
#define M_EN_PASSANT 0x04
#define M_PROMOTION 0x08
#define M_CASTLE 0x10
#define M_CASTLE_K 0x10
#define M_CASTLE_Q 0x20
typedef struct move_s {
piece_t piece;
@@ -41,6 +42,7 @@ typedef struct move_s {
pool_t *moves_pool_init();
void move_print(move_t *move);
void moves_print(pos_t *move);
int pseudo_moves_castle(pos_t *pos);
int pseudo_moves_gen(pos_t *pos, piece_list_t *piece);
int pseudo_moves_pawn(pos_t *pos, piece_list_t *piece);
int moves_get(pos_t *pos);