From d9f03acb023512b645b63498717b7088d7cccad4 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Mon, 10 Jul 2023 13:17:26 +0200 Subject: [PATCH] fix piece color in move_do --- src/brchess.c | 17 +++--- src/chessdefs.h | 6 +-- src/move.c | 141 +++++++++++++++++++++++++++++++----------------- src/search.c | 9 +++- 4 files changed, 112 insertions(+), 61 deletions(-) diff --git a/src/brchess.c b/src/brchess.c index a9d76a4..73567ec 100644 --- a/src/brchess.c +++ b/src/brchess.c @@ -297,15 +297,16 @@ int do_pos(pos_t *pos, __unused char *arg) int do_genmoves(pos_t *pos, __unused char *arg) { - log_f(1, "%s\n", arg); moves_gen_all(pos); return 1; } int do_prmoves(pos_t *pos, __unused char *arg) { - log_f(1, "%s\n", arg); - moves_print(pos, M_PR_SEPARATE | M_PR_NUM); + uint debug_level = debug_level_get(); + debug_level_set(1); + moves_print(pos, M_PR_SEPARATE | M_PR_NUM | M_PR_LONG); + debug_level_set(debug_level); return 1; } @@ -423,10 +424,14 @@ int do_depth(__unused pos_t *pos, char *arg) int do_search(pos_t *pos, __unused char *arg) { - printf("++++++++\nnegamax=%d\n", negamax(pos, depth, pos->turn==WHITE? 1:-1)); - printf("best="); + int debug_level = debug_level_get(); + + negamax(pos, depth, pos->turn == WHITE ? 1 : -1); + debug_level_set(1); + log(1, "best="); move_print(0, pos->bestmove, 0); - printf("score=%d\n", pos->bestmove->negamax); + log(1, " negamax=%d\n", pos->bestmove->negamax); + debug_level_set(debug_level); return 1; } diff --git a/src/chessdefs.h b/src/chessdefs.h index aec1cac..9b60a83 100644 --- a/src/chessdefs.h +++ b/src/chessdefs.h @@ -90,13 +90,13 @@ typedef unsigned char square_t; */ typedef unsigned char castle_t; -#define CASTLE_WK 1 /* 0x01 00000001 */ +#define CASTLE_WK (1 << 0) /* 0x01 00000001 */ #define CASTLE_WQ (1 << 1) /* 0x02 00000010 */ #define CASTLE_BK (1 << 2) /* 0x04 00000100 */ #define CASTLE_BQ (1 << 3) /* 0x08 00001000 */ -#define CASTLE_W 0x03 /* 00000011 W castle mask */ -#define CASTLE_B 0x0C /* 00001100 B castle mask */ +#define CASTLE_W (CASTLE_WK | CASTLE_WQ) /* 00000011 W castle mask */ +#define CASTLE_B (CASTLE_BK | CASTLE_BQ) /* 00001100 B castle mask */ /* bitboard */ diff --git a/src/move.c b/src/move.c index a1d294f..636554c 100644 --- a/src/move.c +++ b/src/move.c @@ -92,36 +92,36 @@ int move_print(int movenum, move_t *move, move_flags_t flags) return 0; } if (flags & M_PR_NUM) - printf("%d:", movenum); + log(1, "%d:", movenum); if (move->flags & M_CASTLE_K) { - printf("O-O"); + log(1, "O-O"); goto end; } else if (move->flags & M_CASTLE_Q) { - printf("O-O-O"); + log(1, "O-O-O"); goto end; } else { - printf("%s%c%c", P_SYM(move->piece), + log(1, "%s%c%c", P_SYM(move->piece), FILE2C(F88(move->from)), RANK2C(R88(move->from))); if (move->flags & M_CAPTURE) { - printf("x"); + log(1, "x"); if (flags & M_PR_LONG) - printf("%s", P_SYM(move->capture)); + log(1, "%s", P_SYM(move->capture)); } else { - printf("-"); + log(1, "-"); } - printf("%c%c", + log(1, "%c%c", FILE2C(F88(move->to)), RANK2C(R88(move->to))); if (flags & M_PR_LONG && move->flags & M_EN_PASSANT) - printf("e.p."); + log(1, "e.p."); if (move->promotion) - printf("=%s", P_SYM(move->promotion)); + log(1, "=%s", P_SYM(move->promotion)); end: - printf(" "); + log(1, " "); } if (flags & M_PR_NL) - printf("\n"); + log(1, "\n"); return 1; } @@ -133,7 +133,7 @@ void moves_print(pos_t *pos, move_flags_t flags) for (int color=WHITE; color <= BLACK; ++color) { int verif = 0; - printf("%s pseudo-moves:\n\t", color == WHITE? "White": "Black"); + log(1, "%s pseudo-moves:\n\t", color == WHITE? "White": "Black"); if (! (flags & M_PR_SEPARATE)) { movenum = 1; list_for_each_safe(p_cur, tmp, &pos->moves[color]) { @@ -141,20 +141,20 @@ void moves_print(pos_t *pos, move_flags_t flags) verif += move_print(movenum++, move, flags); } } else { - printf("captures: "); + log(1, "captures: "); movenum = 1; list_for_each_safe(p_cur, tmp, &pos->moves[color]) { move = list_entry(p_cur, move_t, list); verif += move_print(movenum++, move, flags | M_PR_CAPT); } movenum = 1; - printf("\n\tothers : "); + log(1, "\n\tothers : "); list_for_each_safe(p_cur, tmp, &pos->moves[color]) { move = list_entry(p_cur, move_t, list); verif += move_print(movenum++, move, flags | M_PR_NCAPT); } } - printf("\n\tTotal moves = %d mobility=%u\n", verif, pos->mobility[color]); + log(1, "\n\tTotal moves = %d mobility=%u\n", verif, pos->mobility[color]); } } @@ -163,7 +163,7 @@ static move_t *move_add(pos_t *pos, piece_t piece, square_t from, { board_t *board = pos->board; move_t *move; - int color = COLOR(piece); + int color = COLOR(pos->board[from].piece); # ifdef DEBUG_MOVE log_i(3, "piece_color=%d turn=%d from=%c%c to=%c%c\n", @@ -186,7 +186,7 @@ static move_t *move_add(pos_t *pos, piece_t piece, square_t from, return NULL; list_add(&move->list, &pos->moves[color]); - move->piece = piece; + move->piece = piece | color; move->from = from; move->to = to; move->capture = board[to].piece; @@ -194,7 +194,9 @@ static move_t *move_add(pos_t *pos, piece_t piece, square_t from, if (move->capture) move->flags |= M_CAPTURE; # ifdef DEBUG_MOVE - log_i(3, "added move from %c%c to %c%c\n", + log_i(3, "added %s %s move from %c%c to %c%c\n", + COLOR(move->piece)? "black": "white", + P_NAME(PIECE(move->piece)), FILE2C(F88(move->from)), RANK2C(R88(move->from)), FILE2C(F88(move->to)), RANK2C(R88(move->to))); # endif @@ -615,8 +617,12 @@ int moves_gen(pos_t *pos, bool color, bool doit, bool do_king) # ifdef DEBUG_MOVE log_f(2, "color:%s doit:%d\n", color? "Black": "White", doit); # endif - piece_list = &pos->pieces[color]; + /* do not generate moves if already done for color */ + if (!list_empty(&pos->moves[color])) + doit = false; + + piece_list = &pos->pieces[color]; pos->mobility[color] = 0; pos->controlled[color] = 0; count += pseudo_moves_castle(pos, color, doit, do_king); @@ -661,6 +667,7 @@ int moves_gen_king_moves(pos_t *pos, bool color, bool doit) */ void moves_gen_all(pos_t *pos) { + //log_f(1, "turn=%d opponent=%d\n", pos->turn, OPPONENT(pos->turn)); moves_gen(pos, OPPONENT(pos->turn), false, false); moves_gen(pos, pos->turn, true, true); moves_gen_king_moves(pos, OPPONENT(pos->turn), false); @@ -676,88 +683,122 @@ void moves_gen_all(pos_t *pos) pos_t *move_do(pos_t *pos, move_t *move) { # ifdef DEBUG_MOVE - printf("++++++++++ "); - move_print(0, move, M_PR_NL | M_PR_LONG | M_PR_NUM); + //log(1, "new move: "); + move_print(0, move, M_PR_NL | M_PR_LONG); # endif pos_t *new = pos_dup(pos); piece_t piece = PIECE(move->piece), newpiece = piece, captured = move->capture; - int color = COLOR(piece); + int color = COLOR(move->piece); square_t from = move->from, to = move->to; + u64 bb_from = SQ88_2_BB(from), bb_to = SQ88_2_BB(to); - if (move->capture || PIECE(piece) == PAWN) /* 50 moves */ + //printf("Piece color=%d\n", color); + + if (move->capture || piece == PAWN) /* 50 moves */ new->clock_50 = 0; else new->clock_50++; if (move->flags & M_CAPTURE) { /* capture */ - if (!(move->flags & M_EN_PASSANT)) { - piece_del(&new->board[to].s_piece->list); - new->board[to].piece = 0; - new->occupied[OPPONENT(color)] ^= SQ88_2_BB(to); - new->bb[OPPONENT(color)][PIECETOBB(captured)] ^= SQ88_2_BB(to); - } else { + if (move->flags & M_EN_PASSANT) { uchar ep_file = F88(pos->en_passant); square_t ep_grab = color == WHITE ? SQ88(ep_file, 4): SQ88(ep_file, 3); - log_f(1, "en-passant=%d,%d\n", ep_file, color == WHITE ? 4 : 3); + u64 bb_ep_grab = SQ88_2_BB(ep_grab); + + log_f(5, "en-passant=%d,%d\n", ep_file, color == WHITE ? 4 : 3); piece_del(&new->board[ep_grab].s_piece->list); new->board[ep_grab].piece = 0; - new->occupied[OPPONENT(color)] ^= SQ88_2_BB(ep_grab); - new->bb[OPPONENT(color)][BB_PAWN] ^= SQ88_2_BB(ep_grab); + new->occupied[OPPONENT(color)] &= ~bb_ep_grab; + new->bb[OPPONENT(color)][BB_PAWN] &= ~bb_ep_grab; + + } else { + piece_del(&new->board[to].s_piece->list); + new->board[to].piece = 0; + new->occupied[OPPONENT(color)] &= ~bb_to; + new->bb[OPPONENT(color)][PIECETOBB(captured)] &= ~bb_to; } } else if (move->flags & M_CASTLE_Q) { uchar row = R88(from); square_t rook_from = SQ88(0, row); square_t rook_to = SQ88(3, row); + u64 bb_rook_from = SQ88_2_BB(rook_from); + u64 bb_rook_to = SQ88_2_BB(rook_to); + new->board[rook_to] = new->board[rook_from]; new->board[rook_to].s_piece->square = rook_to; - new->occupied[color] ^= SQ88_2_BB(rook_from); - new->occupied[color] |= SQ88_2_BB(rook_to); - new->bb[color][PIECETOBB(BB_ROOK)] ^= SQ88_2_BB(rook_from); - new->bb[color][PIECETOBB(BB_ROOK)] |= SQ88_2_BB(rook_to); + new->occupied[color] &= ~bb_rook_from; + new->occupied[color] |= bb_rook_to; + new->bb[color][PIECETOBB(BB_ROOK)] &= ~bb_rook_from; + new->bb[color][PIECETOBB(BB_ROOK)] |= bb_rook_to; new->board[rook_from].piece = 0; new->board[rook_from].s_piece = NULL; + //new->castle &= color == WHITE? ~CASTLE_W: ~CASTLE_B; + } else if (move->flags & M_CASTLE_K) { uchar row = R88(from); square_t rook_from = SQ88(7, row); square_t rook_to = SQ88(5, row); + u64 bb_rook_from = SQ88_2_BB(rook_from); + u64 bb_rook_to = SQ88_2_BB(rook_to); + new->board[rook_to] = new->board[rook_from]; new->board[rook_to].s_piece->square = rook_to; - new->occupied[color] ^= SQ88_2_BB(rook_from); - new->occupied[color] |= SQ88_2_BB(rook_to); - new->bb[color][PIECETOBB(BB_ROOK)] ^= SQ88_2_BB(rook_from); - new->bb[color][PIECETOBB(BB_ROOK)] |= SQ88_2_BB(rook_to); + new->occupied[color] &= ~bb_rook_from; + new->occupied[color] |= bb_rook_to; + new->bb[color][PIECETOBB(BB_ROOK)] &= ~bb_rook_from; + new->bb[color][PIECETOBB(BB_ROOK)] |= bb_rook_to; new->board[rook_from].piece = 0; new->board[rook_from].s_piece = NULL; + // new->castle &= color == WHITE? ~CASTLE_W: ~CASTLE_B; } new->board[to] = new->board[from]; /* fix dest square */ new->board[to].s_piece->square = to; if (move->flags & M_PROMOTION) { - log(2, "promotion to %s\n", P_SYM(move->promotion)); - printf("newpiece=%#x p=%#x\n", move->promotion, PIECE(move->promotion)); + log_f(5, "promotion to %s\n", P_SYM(move->promotion)); + log_f(5, "newpiece=%#x p=%#x\n", move->promotion, PIECE(move->promotion)); newpiece = PIECE(move->promotion); new->board[to].piece = move->promotion; new->board[to].s_piece->piece = move->promotion; } /* replace old occupied bitboard by new one */ - new->occupied[color] ^= SQ88_2_BB(from); - new->occupied[color] |= SQ88_2_BB(to); - new->bb[color][PIECETOBB(piece)] ^= SQ88_2_BB(from); - new->bb[color][PIECETOBB(newpiece)] |= SQ88_2_BB(to); + new->occupied[color] &= ~bb_from; + new->occupied[color] |= bb_to; + new->bb[color][PIECETOBB(piece)] &= ~bb_from; + new->bb[color][PIECETOBB(newpiece)] |= bb_to; if (move->flags & M_PROMOTION) { - printf("color=%d bbpiece=%d\n", color, PIECETOBB(newpiece)); - bitboard_print(new->bb[color][PIECETOBB(newpiece)]); + log_f(5, "promotion color=%d bbpiece=%d\n", color, PIECETOBB(newpiece)); + //bitboard_print(new->bb[color][PIECETOBB(newpiece)]); + } + /* set en_passant */ + new->en_passant = 0; + if (piece == PAWN) { + if (R88(from) == 1 && R88(to) == 3) + pos->en_passant = SQ88(F88(from), 2); + else if (R88(from) == 6 && R88(to) == 4) + pos->en_passant = SQ88(F88(from), 5); } /* always make "from" square empty */ new->board[from].piece = 0; new->board[from].s_piece = NULL; + //printf("old turn=%d ", color); SET_COLOR(new->turn, OPPONENT(color)); /* pos color */ - + //printf("new turn=%d\n", new->turn); + //fflush(stdout); + /* adjust castling flags */ + if ((bb_from | bb_to) & (A1 | E1)) + new->castle &= ~CASTLE_WQ; + else if ((bb_from | bb_to) & (E1 | H1)) + new->castle &= ~CASTLE_WK; + else if ((bb_from | bb_to) & (A8 | E8)) + new->castle &= ~CASTLE_BQ; + else if ((bb_from | bb_to) & (E8 | H8)) + new->castle &= ~CASTLE_BK; return new; } diff --git a/src/search.c b/src/search.c index 29e95db..9c32fae 100644 --- a/src/search.c +++ b/src/search.c @@ -30,7 +30,7 @@ eval_t negamax(pos_t *pos, int depth, int color) pos_t *newpos; eval_t best = EVAL_MIN, score; - printf("depth=%d\n", depth); + //printf("depth=%d\n", depth); moves_gen_all(pos); //pos_check(pos); if (depth == 0) { @@ -40,9 +40,14 @@ eval_t negamax(pos_t *pos, int depth, int color) //printf(" --> evalnega=%d\n", score); return score; } - moves_print(pos, 0); + //moves_print(pos, 0); list_for_each_entry(move, &pos->moves[pos->turn], list) { + log(1, "%.*s", 5 - depth, " "); newpos = move_do(pos, move); + //move_print(0, move, 0); + //printf("color piece = %d\n", COLOR(move->piece)); + //printf("turns=%d/%d\n", pos->turn, newpos->turn); + //fflush(stdout); score = -negamax(newpos, depth - 1, -color); move->negamax = score; //printf("move=");