From 8afc1355db1e78d1f4c4d13071d23f43efe1f20d Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 11 Aug 2026 13:20:32 +0200 Subject: improving knight move gen code --- src/moves.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'src/moves.cpp') diff --git a/src/moves.cpp b/src/moves.cpp index 3cdeafa..a236536 100644 --- a/src/moves.cpp +++ b/src/moves.cpp @@ -13,23 +13,23 @@ constexpr std::array computeKnightAttacks() { std::array attacks{}; - for (int sq = 0; sq < 64; ++sq) { - const int f = sq % 8; // file (0=a, 7=h) - const int r = sq / 8; // rank (0=1, 7=8) - std::uint64_t bb = 0; - - // {df, dr} for all 8 knight leaps - const int leaps[8][2] = {{1, 2}, {2, 1}, {2, -1}, {1, -2}, - {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}}; - - for (int i = 0; i < 8; ++i) { - const int nf = f + leaps[i][0]; - const int nr = r + leaps[i][1]; - if (nf >= 0 && nf < 8 && nr >= 0 && nr < 8) { - bb |= 1ULL << (nr * 8 + nf); + constexpr std::array knight_moves{-10, 6, 15, 17, 10, -6, -15, -17}; + + for (int i = 0; i < 64; i++) { + uint64_t bb = 0; + for (int offset : knight_moves) { + int next = i + offset; + if (next >= 64 || next < 0) { + continue; } + const int fileDelta = (next % 8) - (i % 8); + if (fileDelta != 1 && fileDelta != 2 && fileDelta != -1 && + fileDelta != -2) { + continue; + }; + bb |= 1ULL << next; } - attacks[static_cast(sq)] = bb; + attacks[static_cast(i)] = bb; } return attacks; } @@ -38,6 +38,7 @@ constexpr std::array KNIGHT_ATTACKS = computeKnightAttacks(); static void GenerateKnightMoves(Game *b, std::vector &moves, bool GenerateQuietMoves) { + uint64_t knights = b->PieceBitboards[b->turn][KNIGHT]; while (knights != 0) { int from = __builtin_ctzll(knights); -- cgit v1.2.3