From c25de2cb558b3d34effd731d0f4c19d1d4d4c10a Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 15:46:48 -0400 Subject: [PATCH] Quick pice counting --- headers/eval.h | 4 +++ src/eval.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 5 +-- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 headers/eval.h create mode 100644 src/eval.c diff --git a/headers/eval.h b/headers/eval.h new file mode 100644 index 0000000..06ca2e3 --- /dev/null +++ b/headers/eval.h @@ -0,0 +1,4 @@ +#ifndef EVAL_H +#define EVAL_H +move *findBest(move* move, size_t size, game* g); +#endif diff --git a/src/eval.c b/src/eval.c new file mode 100644 index 0000000..17a87d8 --- /dev/null +++ b/src/eval.c @@ -0,0 +1,83 @@ +#include "types.h" +#include "help.h" +#include +#include +#include + +#define PAWN_VALUE 100 +#define KNIGHT_VALUE 320 +#define BISHOP_VALUE 330 +#define ROOK_VALUE 500 +#define QUEEN_VALUE 900 +#define KING_VALUE 20000 + +int evaluateBoard(game *game); +void makeMove(game *g, move* m); + +move *findBest(move* moves, size_t size, game* g){ + int bestScore = -999999; + move *m = moves; + for (int i = 0; i < size; i++) { + game gg = *g; + makeMove(&gg, &moves[i]); + int score = evaluateBoard(&gg); + if (score > bestScore) { + bestScore = score; + m = &moves[i]; + printf("info score cp %d\n", g->whiteToMove ? bestScore : -bestScore); + } + } + return m; +} + +int evaluateBoard(game *game) { + int score = 0; + + for (int i = 0; i < 64; ++i) { + long long bit = 1LL << i; + if (game->white.pawns & bit) score += PAWN_VALUE; + else if (game->white.knights & bit) score += KNIGHT_VALUE; + else if (game->white.bishops & bit) score += BISHOP_VALUE; + else if (game->white.rooks & bit) score += ROOK_VALUE; + else if (game->white.queen & bit) score += QUEEN_VALUE; + else if (game->white.king & bit) score += KING_VALUE; + } + + for (int i = 0; i < 64; ++i) { + long long bit = 1LL << i; + if (game->black.pawns & bit) score -= PAWN_VALUE; + else if (game->black.knights & bit) score -= KNIGHT_VALUE; + else if (game->black.bishops & bit) score -= BISHOP_VALUE; + else if (game->black.rooks & bit) score -= ROOK_VALUE; + else if (game->black.queen & bit) score -= QUEEN_VALUE; + else if (game->black.king & bit) score -= KING_VALUE; + } + + score *= game->whiteToMove ? -1 : 1; + return score; +} + +void makeMove(game *g, move* m) { + //should replace inside of PlayMoves but im lazy + long long from_bit = 1LL << m->From; + long long to_bit = 1LL << m->To; + + long long *set = findSet(g, from_bit); + if (!set) + return; + *set &= ~from_bit; + + long long *captured = findSet(g, to_bit); + if (captured) *captured &= ~to_bit; + + if (m->Promo) { + char promoChar = g->whiteToMove ? toupper(m->Promo) : m->Promo; + long long *newSet = charToSet(g, promoChar); + if (newSet) + *newSet |= to_bit; + } else { + *set |= to_bit; + } + + g->whiteToMove = !g->whiteToMove; +} diff --git a/src/main.c b/src/main.c index d4e1c97..493c5bd 100644 --- a/src/main.c +++ b/src/main.c @@ -9,6 +9,7 @@ #include "moves.h" #include "types.h" #include "help.h" +#include "eval.h" #define BUFF_SIZE 4096 @@ -56,14 +57,14 @@ int main() { printf("readyok\n"); } else if (!strcmp("go", token)) { static move mov[1500];//big dumb buffer - int cnt = 0; + size_t cnt = 0; cnt += pawnMove(g,mov); cnt += knightMove(g,(mov+cnt)); cnt += rookMove(g,(mov+cnt)); cnt += bishopMove(g,(mov+cnt)); cnt += kingMove(g,(mov+cnt)); cnt += queenMove(g,(mov+cnt)); - move *m = &mov[rand() % cnt]; + move *m = findBest(mov,cnt,g); char *end = ""; int yTo, xTo, yFrom, xFrom;