From bfe933551554abeaf5a0dca638428fe42387b13a Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 03:48:31 -0400 Subject: [PATCH 1/5] pic random move --- src/main.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index 094594a..3b3e771 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "moves.h" #include "types.h" #include "help.h" @@ -50,12 +51,14 @@ int main() { playMoves(g, lineRest); } else if (!strcmp("ucinewgame", token)) { } else if (!strcmp("isready", token)) { + srand(time(NULL)); printf("readyok\n"); } else if (!strcmp("go", token)) { - - move mov[200]; - int cnt = knightMove(g, mov); - move *m = &mov[0]; + move mov[1500];//big dumb buffer + int cnt = 0; + cnt += pawnMove(g,mov); + cnt += knightMove(g,(mov+cnt)); + move *m = &mov[rand() % cnt]; char *end = ""; int yTo, xTo, yFrom, xFrom; @@ -64,9 +67,9 @@ int main() { xFrom = m->From % 8; yFrom = m->From / 8 + 1; - if ((g->whiteToMove && yTo == 8) || (!g->whiteToMove && yTo == 1)) { - // end = "q\n"; - end = "\n"; + long long bit = 1LL << m->From; + 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"; } From 49befc72b61af273df5e32ace3ea985d3e70fc49 Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 03:49:48 -0400 Subject: [PATCH 2/5] Rook movement --- headers/moves.h | 1 + src/main.c | 1 + src/moves.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/headers/moves.h b/headers/moves.h index 298db2b..95150df 100644 --- a/headers/moves.h +++ b/headers/moves.h @@ -3,4 +3,5 @@ #include "types.h" int pawnMove(game *g, move *moves); int knightMove(game *g, move* moves); +int rookMove(game *g, move *moves); #endif diff --git a/src/main.c b/src/main.c index 3b3e771..56bb3ad 100644 --- a/src/main.c +++ b/src/main.c @@ -58,6 +58,7 @@ int main() { int cnt = 0; cnt += pawnMove(g,mov); cnt += knightMove(g,(mov+cnt)); + cnt += rookMove(g,(mov+cnt)); move *m = &mov[rand() % cnt]; char *end = ""; diff --git a/src/moves.c b/src/moves.c index 2284924..a121203 100644 --- a/src/moves.c +++ b/src/moves.c @@ -4,6 +4,8 @@ #include #include +int rookScan(game *g, move *moves,long long w, long long b); + 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); @@ -41,7 +43,6 @@ int pawnMove(game *g, move *moves) { return index; } - int knightMove(game *g, move *moves) { long long knights = g->whiteToMove ? g->white.knights : g->black.knights; long long occupied = g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); @@ -75,7 +76,7 @@ int knightMove(game *g, move *moves) { continue; long long destBit = 1LL << to; - if (occupied & destBit) // Skip if destination has friendly piece + if (occupied & destBit) continue; moves[index++] = (move){.From = i, .To = to}; @@ -83,3 +84,69 @@ int knightMove(game *g, move *moves) { } return index; } + + +int rookMove(game *g, move *moves){ + return rookScan(g,moves,g->white.rooks,g->black.rooks); +} + +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); + int index = 0; + + for(int i = 0; i < 64; i++){ + long long bit = 1LL << i; + int x = i % 8; + int y = i / 8; + if(!(rooks & bit)) + continue; + + //fwd + for(int j = y + 1; j < 8; j++){ + int to = (j * 8) + x; + long long lbit = 1LL << to; + if(occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if(occupiedE & lbit) + break; + } + + //bck + for(int j = y - 1; j >= 0; j--){ + int to = (j * 8) + x; + long long lbit = 1LL << to; + if(occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if(occupiedE & lbit) + break; + } + + //rht + for(int j = x + 1; j < 8; j++){ + int to = (y * 8) + j; + long long lbit = 1LL << to; + if(occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if(occupiedE & lbit) + break; + } + + //lft + for(int j = x - 1; j >= 0; j--){ + int to = (y * 8) + j; + long long lbit = 1LL << to; + if(occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if(occupiedE & lbit) + break; + } + } + return index; +} + From 76c69dbf18ec61be21dbbcc9a6d96c856d3e2aa4 Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 04:00:17 -0400 Subject: [PATCH 3/5] bishop move + moves format --- headers/moves.h | 1 + src/main.c | 1 + src/moves.c | 166 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 128 insertions(+), 40 deletions(-) diff --git a/headers/moves.h b/headers/moves.h index 95150df..6ae9f31 100644 --- a/headers/moves.h +++ b/headers/moves.h @@ -4,4 +4,5 @@ int pawnMove(game *g, move *moves); int knightMove(game *g, move* moves); int rookMove(game *g, move *moves); +int bishopMove(game *g, move *moves); #endif diff --git a/src/main.c b/src/main.c index 56bb3ad..efc57e5 100644 --- a/src/main.c +++ b/src/main.c @@ -59,6 +59,7 @@ int main() { cnt += pawnMove(g,mov); cnt += knightMove(g,(mov+cnt)); cnt += rookMove(g,(mov+cnt)); + cnt += bishopMove(g,(mov+cnt)); move *m = &mov[rand() % cnt]; char *end = ""; diff --git a/src/moves.c b/src/moves.c index a121203..901a061 100644 --- a/src/moves.c +++ b/src/moves.c @@ -1,10 +1,11 @@ -#include "types.h" #include "moves.h" #include "help.h" +#include "types.h" #include #include -int rookScan(game *g, move *moves,long long w, long long b); +int rookScan(game *g, move *moves, long long w, long long b); +int bishopScan(game *g, move *moves, long long w, long long b); int pawnMove(game *g, move *moves) { long long pawns = g->whiteToMove ? g->white.pawns : g->black.pawns; @@ -47,12 +48,7 @@ int knightMove(game *g, move *moves) { long long knights = g->whiteToMove ? g->white.knights : g->black.knights; long long occupied = g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); - int kMoves[] = { - -17, -15, - -10, -6, - 6, 10, - 15, 17 - }; + int kMoves[] = {-17, -15, -10, -6, 6, 10, 15, 17}; int index = 0; for (int i = 0; i < 64; i++) { @@ -72,7 +68,8 @@ int knightMove(game *g, move *moves) { int fileDiff = abs(fromFile - toFile); int rankDiff = abs(fromRank - toRank); - if (!((fileDiff == 1 && rankDiff == 2) || (fileDiff == 2 && rankDiff == 1))) + if (!((fileDiff == 1 && rankDiff == 2) || + (fileDiff == 2 && rankDiff == 1))) continue; long long destBit = 1LL << to; @@ -85,68 +82,157 @@ int knightMove(game *g, move *moves) { return index; } - -int rookMove(game *g, move *moves){ - return rookScan(g,moves,g->white.rooks,g->black.rooks); +int rookMove(game *g, move *moves) { + return rookScan(g, moves, g->white.rooks, g->black.rooks); } -int rookScan(game *g, move *moves,long long w, long long b){ +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); + long long occupiedE = + !g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); int index = 0; - for(int i = 0; i < 64; i++){ + for (int i = 0; i < 64; i++) { long long bit = 1LL << i; int x = i % 8; int y = i / 8; - if(!(rooks & bit)) + if (!(rooks & bit)) continue; - //fwd - for(int j = y + 1; j < 8; j++){ + // fwd + for (int j = y + 1; j < 8; j++) { int to = (j * 8) + x; long long lbit = 1LL << to; - if(occupied & lbit) - break; + if (occupied & lbit) + break; moves[index++] = (move){.From = i, .To = to}; - if(occupiedE & lbit) - break; + if (occupiedE & lbit) + break; } - //bck - for(int j = y - 1; j >= 0; j--){ + // bck + for (int j = y - 1; j >= 0; j--) { int to = (j * 8) + x; long long lbit = 1LL << to; - if(occupied & lbit) - break; + if (occupied & lbit) + break; moves[index++] = (move){.From = i, .To = to}; - if(occupiedE & lbit) - break; + if (occupiedE & lbit) + break; } - //rht - for(int j = x + 1; j < 8; j++){ + // rht + for (int j = x + 1; j < 8; j++) { int to = (y * 8) + j; long long lbit = 1LL << to; - if(occupied & lbit) - break; + if (occupied & lbit) + break; moves[index++] = (move){.From = i, .To = to}; - if(occupiedE & lbit) - break; + if (occupiedE & lbit) + break; } - //lft - for(int j = x - 1; j >= 0; j--){ + // lft + for (int j = x - 1; j >= 0; j--) { int to = (y * 8) + j; long long lbit = 1LL << to; - if(occupied & lbit) - break; + if (occupied & lbit) + break; moves[index++] = (move){.From = i, .To = to}; - if(occupiedE & lbit) - break; + if (occupiedE & lbit) + break; } } return index; } +int bishopMove(game *g, move *moves) { + return bishopScan(g, moves, g->white.bishops, g->black.bishops); +} + +int bishopScan(game *g, move *moves, long long w, long long b) { + long long bishops = 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); + int index = 0; + + for (int i = 0; i < 64; i++) { + long long bit = 1LL << i; + int x = i % 8; + int y = i / 8; + + if (!(bishops & bit)) + continue; + + // ur + for (int j = 1;; j++) { + int xTo = x + j; + int yTo = y + j; + if (xTo >= 8 || yTo >= 8) + break; + + int to = (yTo * 8) + xTo; + long long lbit = 1LL << to; + + if (occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if (occupiedE & lbit) + break; + } + + // ul + for (int j = 1;; j++) { + int xTo = x - j; + int yTo = y + j; + if (xTo < 0 || yTo >= 8) + break; + + int to = (yTo * 8) + xTo; + long long lbit = 1LL << to; + + if (occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if (occupiedE & lbit) + break; + } + + // dr + for (int j = 1;; j++) { + int xTo = x + j; + int yTo = y - j; + if (xTo >= 8 || yTo < 0) + break; + + int to = (yTo * 8) + xTo; + long long lbit = 1LL << to; + + if (occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if (occupiedE & lbit) + break; + } + + // dl + for (int j = 1;; j++) { + int xTo = x - j; + int yTo = y - j; + if (xTo < 0 || yTo < 0) + break; + + int to = (yTo * 8) + xTo; + long long lbit = 1LL << to; + + if (occupied & lbit) + break; + moves[index++] = (move){.From = i, .To = to}; + if (occupiedE & lbit) + break; + } + } + return index; +} From 9f06b9d86c467c93cecd3bbb27a8ea3f703562b4 Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 04:33:40 -0400 Subject: [PATCH 4/5] king move --- headers/moves.h | 1 + src/main.c | 3 ++- src/moves.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/headers/moves.h b/headers/moves.h index 6ae9f31..5fa1b52 100644 --- a/headers/moves.h +++ b/headers/moves.h @@ -5,4 +5,5 @@ int pawnMove(game *g, move *moves); int knightMove(game *g, move* moves); int rookMove(game *g, move *moves); int bishopMove(game *g, move *moves); +int kingMove(game *g, move *moves); #endif diff --git a/src/main.c b/src/main.c index efc57e5..0cded1b 100644 --- a/src/main.c +++ b/src/main.c @@ -54,12 +54,13 @@ int main() { srand(time(NULL)); printf("readyok\n"); } else if (!strcmp("go", token)) { - move mov[1500];//big dumb buffer + static move mov[1500];//big dumb buffer 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)); move *m = &mov[rand() % cnt]; char *end = ""; diff --git a/src/moves.c b/src/moves.c index 901a061..7e6cc64 100644 --- a/src/moves.c +++ b/src/moves.c @@ -6,6 +6,7 @@ int rookScan(game *g, move *moves, long long w, long long b); int bishopScan(game *g, move *moves, long long w, long long b); +int kingScan(game *g, move *moves, long long w, long long b); int pawnMove(game *g, move *moves) { long long pawns = g->whiteToMove ? g->white.pawns : g->black.pawns; @@ -236,3 +237,38 @@ int bishopScan(game *g, move *moves, long long w, long long b) { } return index; } + +int kingMove(game *g, move *moves){ + return kingScan(g,moves,g->white.king,g->black.king); +} + +int kingScan(game *g, move *moves, long long w, long long b) { + long long king = g->whiteToMove ? w : b; + long long occupied = g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); + int index = 0; + + for (int i = 0; i < 64; i++){ + long long bit = 1LL << i; + int x = i % 8; + int y = i / 8; + int movesX[] = {-1, 0, 1, -1, 1, -1, 0, 1}; + int movesY[] = {-1, -1, -1, 0, 0, 1, 1, 1}; + + if(!(king & bit)) + continue; + + for (int j = 0; j < 8; ++j) { + int toX = x + movesX[j]; + int toY = y + movesY[j]; + int to = (toY * 8) + toX; + long long destBit = 1LL << to; + + if (toX >= 0 && toX < 8 && toY >= 0 && toY < 8) { + if (!(occupied & destBit)) { + moves[index++] = (move){.From = i, .To = to}; + } + } + } + } + return index; +} From 5dd8f042866e1c0c3f7ba19c3d76cbbfbdb59331 Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 04:45:30 -0400 Subject: [PATCH 5/5] queen Movement working --- headers/moves.h | 1 + src/main.c | 1 + src/moves.c | 15 +++++++++++---- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/headers/moves.h b/headers/moves.h index 5fa1b52..35f4730 100644 --- a/headers/moves.h +++ b/headers/moves.h @@ -6,4 +6,5 @@ int knightMove(game *g, move* moves); int rookMove(game *g, move *moves); int bishopMove(game *g, move *moves); int kingMove(game *g, move *moves); +int queenMove(game *g, move *moves); #endif diff --git a/src/main.c b/src/main.c index 0cded1b..49783ae 100644 --- a/src/main.c +++ b/src/main.c @@ -61,6 +61,7 @@ int main() { 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]; char *end = ""; diff --git a/src/moves.c b/src/moves.c index 7e6cc64..0ae4f2e 100644 --- a/src/moves.c +++ b/src/moves.c @@ -238,12 +238,19 @@ int bishopScan(game *g, move *moves, long long w, long long b) { return index; } -int kingMove(game *g, move *moves){ - return kingScan(g,moves,g->white.king,g->black.king); +int queenMove(game *g, move *moves){ + int size = 0; + long long w,b; + w = g->white.queen; + b = g->black.queen; + size += rookScan(g,moves,w,b); + size += bishopScan(g,moves,w,b); + return size; } -int kingScan(game *g, move *moves, long long w, long long b) { - long long king = g->whiteToMove ? w : b; + +int kingMove(game *g, move *moves){ + long long king = g->whiteToMove ? g->white.king : g->black.king; long long occupied = g->whiteToMove ? fullSet(&g->white) : fullSet(&g->black); int index = 0;