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; +} +