diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 41 |
1 files changed, 39 insertions, 2 deletions
@@ -494,7 +494,7 @@ int generate_pseudolegal_moves(Move* moves, int* board, int color, int only_capt while(ray_move && *ray_move) { for (int destination = origin + *ray_move; !(destination & 0x88); destination += *ray_move) { - if ((board[destination] == EMPTY && !only_captures) || board[destination] % 2 != color) { + if ((board[destination] == EMPTY && !only_captures) || (board[destination] != EMPTY && board[destination] % 2 != color)) { if (moves) moves[moves_count] = (Move){ origin, destination, 0 }; moves_count++; } @@ -672,6 +672,43 @@ int order_moves(Move* moves, int moves_count, int* board, long hash, Transpositi return cache_hits; // Only needed for display } +int quiscence(int* board, int color, int alpha, int beta, int* metrics, long hash, Transposition* transposition_table, long* zobrist_seed, clock_t deadline) { + int is_maximizer = (color == 0); + + int evaluation = static_evaluate(board, 0, 0); + if(evaluation >= beta ) return beta; + if(alpha < evaluation) alpha = evaluation; + + Move pseudolegal_moves[MAX_AVAILABLE_MOVES]; + int pseudolegal_moves_count = generate_pseudolegal_moves(pseudolegal_moves, board, color, 1); + int cache_hits = order_moves(pseudolegal_moves, pseudolegal_moves_count, board, hash, transposition_table, zobrist_seed); + + for (int i = 0; i < pseudolegal_moves_count; i++) { + *metrics += 1; + Move move = pseudolegal_moves[i]; + + long move_hash = hash_after_move(move, board, zobrist_seed, hash); + int captured_piece = make_move(move, board); + int score = quiscence(board, 1 - color, alpha, beta, metrics, move_hash, transposition_table, zobrist_seed, deadline); + unmake_move(move, captured_piece, board); + + if (is_maximizer) { + if (score > evaluation) evaluation = score; + alpha = MAX(evaluation, alpha); + } else { + if (score < evaluation) evaluation = score; + beta = MIN(evaluation, beta); + } + + if (beta <= alpha) break; + + // We ran out of time + if (clock() > deadline) break; + } + + return evaluation; +} + /* * Alpha-beta pruning * Value here is white material advantage over black @@ -699,7 +736,7 @@ Move minimax_search(int* board, int color, int depth, int alpha, int beta, int* move.value = depth > 0 ? minimax_search(board, 1 - color, depth - 1, alpha, beta, metrics, move_hash, transposition_table, zobrist_seed, deadline).value - : static_evaluate(board, pseudolegal_moves_count, color); + : quiscence(board, 1 - color, alpha, beta, metrics, hash, transposition_table, zobrist_seed, deadline); if (transposition_table[move_hash].depth < depth) { if (transposition_table[move_hash].depth == -1) TRANSPOSITION_TABLE_CARDINALITY++; |