diff --git a/main.c b/main.c index 432df5b..0190fc5 100644 --- a/main.c +++ b/main.c @@ -33,6 +33,7 @@ void playMoves(game *g, char *moves); long long *findSet(game *g, long long bit); long long *charToSet(game *g, char c); int pawnMove(game *g, move *moves); +int knightMove(game *g, move* moves); long long fullSet(sets *s) { return s->bishops ^ s->king ^ s->knights ^ s->pawns ^ s->queen ^ s->rooks; @@ -90,16 +91,13 @@ int main() { g = fenGame("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); } playMoves(g, lineRest); - printf("info pawns\n"); - // print_bitboard(fullSetBoth(g)); - } else if (!strcmp("ucinewgame", token)) { } else if (!strcmp("isready", token)) { printf("readyok\n"); } else if (!strcmp("go", token)) { - move mov[64]; - int cnt = pawnMove(g, mov); + move mov[200]; + int cnt = knightMove(g, mov); move *m = &mov[0]; char *end = ""; @@ -110,7 +108,8 @@ int main() { yFrom = m->From / 8 + 1; if ((g->whiteToMove && yTo == 8) || (!g->whiteToMove && yTo == 1)) { - end = "q\n"; + // end = "q\n"; + end = "\n"; } else { end = "\n"; } @@ -246,6 +245,48 @@ long long *findSet(game *g, long long bit) { } } +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 index = 0; + + for (int i = 0; i < 64; i++) { + long long bit = 1LL << i; + if (!(knights & bit)) + continue; + + for (int j = 0; j < 8; ++j) { + int to = i + kMoves[j]; + if (to < 0 || to > 64) + continue; + + int fromFile = i % 8; + int toFile = to % 8; + int fromRank = i / 8; + int toRank = to / 8; + + int fileDiff = abs(fromFile - toFile); + int rankDiff = abs(fromRank - toRank); + if (!((fileDiff == 1 && rankDiff == 2) || (fileDiff == 2 && rankDiff == 1))) + continue; + + long long destBit = 1LL << to; + if (occupied & destBit) // Skip if destination has friendly piece + continue; + + moves[index++] = (move){.From = i, .To = to}; + } + } + return index; +} + 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);