aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <adammegarules1@gmail.com>2026-08-11 13:20:32 +0200
committerAdam <adammegarules1@gmail.com>2026-08-11 13:20:32 +0200
commit8afc1355db1e78d1f4c4d13071d23f43efe1f20d (patch)
treebd301f944b8b069bbe749d3224a91d52a11deb72
parente10aa25f4246c1d570767404ddb2e5fe826c3050 (diff)
improving knight move gen code
-rw-r--r--src/moves.cpp31
1 files changed, 16 insertions, 15 deletions
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<std::uint64_t, 64> computeKnightAttacks() {
std::array<std::uint64_t, 64> 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<int, 8> 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<size_t>(sq)] = bb;
+ attacks[static_cast<size_t>(i)] = bb;
}
return attacks;
}
@@ -38,6 +38,7 @@ constexpr std::array<std::uint64_t, 64> KNIGHT_ATTACKS = computeKnightAttacks();
static void GenerateKnightMoves(Game *b, std::vector<Move> &moves,
bool GenerateQuietMoves) {
+
uint64_t knights = b->PieceBitboards[b->turn][KNIGHT];
while (knights != 0) {
int from = __builtin_ctzll(knights);