From 1ee34b9d35a1ad6083967f858988180a425e43ec Mon Sep 17 00:00:00 2001 From: eug-vs Date: Wed, 31 Aug 2022 07:37:27 +0300 Subject: feat: discourage bad pawn structure --- src/main.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 39346c2..c68c62e 100644 --- a/src/main.c +++ b/src/main.c @@ -432,6 +432,41 @@ int list_available_moves(Move* moves, int* board, int color) { return moves_count; } +// Count doubled, blocked and isolated pawns +int count_bad_pawns(int* board, int color) { + int bad_pawns = 0; + long occupied_files = 0b00000000; + + for (int file = 0; file < 8; file++) { + int file_pawns = 0; + for (int rank = 7; rank >= 0; rank--) { + int piece = board[rank * 16 + file]; + if ((piece & NO_COLOR) == PAWN && piece % 2 == color) { + file_pawns++; + occupied_files |= 1 << file; + + // If pawn can't advance, it's blocked + int advance_rank = rank + (color == WHITE ? 1 : -1); + if (board[advance_rank * 16 + file] != EMPTY) bad_pawns++; + } + } + + // Doubled or tripled pawns will get punished + bad_pawns += file_pawns - 1; + } + + // Shift everything to the left to get some space around right-most bit + occupied_files = occupied_files << 1; + + // Count isolated pawns based on bits in occupied files + for (int bit = 1; bit < 9; bit++) { + long bit_mask = (1 << (bit + 1)) | (1 << (bit - 1)); + if (!(occupied_files & bit_mask)) bad_pawns++; + } + + return bad_pawns; +} + /* * Return a total board evaluation symbolizing advantage * for WHITE, meaining WHITE tries to maximize this @@ -448,7 +483,9 @@ int evaluate_position(int* board, int precomputed_mobility, int mobility_color) int white_mobility_advantage = (mobility - opponent_mobility) * (mobility_color == WHITE ? 1 : -1); - return white_material_advantage + white_mobility_advantage; + int pawn_structure_advantage = count_bad_pawns(board, BLACK) - count_bad_pawns(board, WHITE); + + return white_material_advantage + white_mobility_advantage + 5 * pawn_structure_advantage; } int get_piece_raw_value(int piece) { @@ -562,7 +599,6 @@ int main() { int color = ply % 2; printf("##### Ply %i #####\n", ply); printf("Current evaluation: %i\n", evaluate_position(board, 0, WHITE)); - printf("Zobrist hash: %lo\n", hash); if (color == PLAYER) { printf("Enter a move for %s:\n", COLORS[color]); -- cgit v1.2.3