From 76c69dbf18ec61be21dbbcc9a6d96c856d3e2aa4 Mon Sep 17 00:00:00 2001 From: k Date: Thu, 19 Jun 2025 04:00:17 -0400 Subject: [PATCH] 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; +}