diff --git a/headers/eval.h b/headers/eval.h deleted file mode 100644 index 06ca2e3..0000000 --- a/headers/eval.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef EVAL_H -#define EVAL_H -move *findBest(move* move, size_t size, game* g); -#endif diff --git a/headers/types.h b/headers/types.h index 7aa69c9..a1a7e84 100644 --- a/headers/types.h +++ b/headers/types.h @@ -20,7 +20,6 @@ typedef struct { typedef struct { int From; int To; - char Promo; } move; #endif diff --git a/src/eval.c b/src/eval.c deleted file mode 100644 index 5ac2f32..0000000 --- a/src/eval.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "types.h" -#include "help.h" -#include "moves.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 -#define INF 9000000 -#define MAX_DEPTH 3 // Adjustable depth - -int evaluateBoard(game *game); -void makeMove(game *g, move* m); -int negamax(game *g, int depth, int alpha, int beta, int color); - -move *findBest(move* moves, size_t size, game* g){ - int bestScore = -INF; - move *bestMove = moves; - int color = g->whiteToMove ? 1 : -1; - - for (int i = 0; i < size; i++) { - game gg = *g; - makeMove(&gg, &moves[i]); - int score = -negamax(&gg, MAX_DEPTH, -INF, INF, -color); - if (score > bestScore) { - bestScore = score; - bestMove = &moves[i]; - printf("info score cp %d\n", g->whiteToMove ? bestScore : -bestScore); - } - } - return bestMove; -} - -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; - } - - 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; -} - -int negamax(game *g, int depth, int alpha, int beta, int color) { - if (depth == 0) - return color * evaluateBoard(g); - - move moves[1500]; - int cnt = pawnMove(g, moves); - cnt += knightMove(g, moves + cnt); - cnt += rookMove(g, moves + cnt); - cnt += bishopMove(g, moves + cnt); - cnt += kingMove(g, moves + cnt); - cnt += queenMove(g, moves + cnt); - - if (cnt == 0) - return 0; - - int bestValue = -INF; - for (int i = 0; i < cnt; i++) { - game gg = *g; - makeMove(&gg, &moves[i]); - - int value = -negamax(&gg, depth - 1, -beta, -alpha, -color); - - if (value > bestValue) bestValue = value; - if (value > alpha) alpha = value; - if (alpha >= beta) break; - } - return bestValue; -} diff --git a/src/main.c b/src/main.c index 493c5bd..49783ae 100644 --- a/src/main.c +++ b/src/main.c @@ -9,7 +9,6 @@ #include "moves.h" #include "types.h" #include "help.h" -#include "eval.h" #define BUFF_SIZE 4096 @@ -28,8 +27,7 @@ int main() { char ltz[] = "abcdefgh"; int cnt = 0; while (1) { - if(!fgets(line, sizeof(line), stdin)) - return 0; + (void)fgets(line, sizeof(line), stdin); size_t len = strlen(line); if (len - 1) line[len - 1] = '\0'; @@ -57,14 +55,14 @@ int main() { printf("readyok\n"); } else if (!strcmp("go", token)) { static move mov[1500];//big dumb buffer - size_t cnt = 0; + int 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 = findBest(mov,cnt,g); + move *m = &mov[rand() % cnt]; char *end = ""; int yTo, xTo, yFrom, xFrom; @@ -74,7 +72,7 @@ int main() { yFrom = m->From / 8 + 1; long long bit = 1LL << m->From; - if (m->Promo) { + if (((g->whiteToMove && yTo == 8) || (!g->whiteToMove && yTo == 1)) && ((findSet(g,bit) == &g->white.pawns) || (findSet(g,bit) == &g->black.pawns))) { end = "q\n"; } else { end = "\n"; diff --git a/src/moves.c b/src/moves.c index 45ad882..0ae4f2e 100644 --- a/src/moves.c +++ b/src/moves.c @@ -12,7 +12,6 @@ int pawnMove(game *g, move *moves) { long long pawns = g->whiteToMove ? g->white.pawns : g->black.pawns; long long enemy = g->whiteToMove ? fullSet(&g->black) : fullSet(&g->white); long long occupied = fullSetBoth(g); - long long promo = (0xFFLL) << (g->whiteToMove ? 56 : 0); int movdir = g->whiteToMove ? 8 : -8; int capLeft = g->whiteToMove ? 7 : -9; @@ -22,29 +21,25 @@ int pawnMove(game *g, move *moves) { for (int i = 0; i < 64; ++i) { long long bit = 1LL << i; - char p = 0; if (!(pawns & bit)) continue; // forword int to = i + movdir; - p = (promo & (1LL << to)) ? 'q' : 0; if (to >= 0 && to < 64 && !(occupied & (1LL << to))) { - moves[index++] = (move){.From = i, .To = to, .Promo = p}; + moves[index++] = (move){.From = i, .To = to}; } // left to = i + capLeft; - p = (promo & (1LL << to)) ? 'q' : 0; if (i % 8 > 0 && (to >= 0 && to < 64) && (enemy & (1LL << to))) { - moves[index++] = (move){.From = i, .To = to, .Promo = p}; + moves[index++] = (move){.From = i, .To = to}; } // right to = i + capRight; - p = (promo & (1LL << to)) ? 'q' : 0; if (i % 8 < 7 && (to >= 0 && to < 64) && (enemy & (1LL << to))) { - moves[index++] = (move){.From = i, .To = to, .Promo = p}; + moves[index++] = (move){.From = i, .To = to}; } } return index; @@ -82,7 +77,7 @@ int knightMove(game *g, move *moves) { if (occupied & destBit) continue; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; } } return index; @@ -96,7 +91,7 @@ int rookScan(game *g, move *moves, long long w, long long b) { long long rooks = g->whiteToMove ? w : b; long long occupied = g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); long long occupiedE = - !g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); + !g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); int index = 0; for (int i = 0; i < 64; i++) { @@ -112,7 +107,7 @@ int rookScan(game *g, move *moves, long long w, long long b) { long long lbit = 1LL << to; if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -123,7 +118,7 @@ int rookScan(game *g, move *moves, long long w, long long b) { long long lbit = 1LL << to; if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -134,7 +129,7 @@ int rookScan(game *g, move *moves, long long w, long long b) { long long lbit = 1LL << to; if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -145,7 +140,7 @@ int rookScan(game *g, move *moves, long long w, long long b) { long long lbit = 1LL << to; if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -184,7 +179,7 @@ int bishopScan(game *g, move *moves, long long w, long long b) { if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -201,7 +196,7 @@ int bishopScan(game *g, move *moves, long long w, long long b) { if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -218,7 +213,7 @@ int bishopScan(game *g, move *moves, long long w, long long b) { if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -235,7 +230,7 @@ int bishopScan(game *g, move *moves, long long w, long long b) { if (occupied & lbit) break; - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; if (occupiedE & lbit) break; } @@ -277,7 +272,7 @@ int kingMove(game *g, move *moves){ if (toX >= 0 && toX < 8 && toY >= 0 && toY < 8) { if (!(occupied & destBit)) { - moves[index++] = (move){.From = i, .To = to, .Promo=0}; + moves[index++] = (move){.From = i, .To = to}; } } }