From 30cc76f2e40208dd5e5e4c1aaae61f1448e6e7da Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 23 Aug 2026 19:15:00 +0200 Subject: [PATCH] feat(core): add precomputed bitboard tables --- Bitboards.scala | 131 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Bitboards.scala diff --git a/Bitboards.scala b/Bitboards.scala new file mode 100644 index 0000000..2afaa12 --- /dev/null +++ b/Bitboards.scala @@ -0,0 +1,131 @@ +package gambit + +object Bitboards: + inline def sq64(sq: Int): Int = Square.rankOf(sq) * 8 + Square.fileOf(sq) + inline def fileOf(s: Int): Int = s & 7 + inline def rankOf(s: Int): Int = s >> 3 + inline def bit(s: Int): Long = 1L << s + inline def count(bb: Long): Int = java.lang.Long.bitCount(bb) + + val fileMask: Array[Long] = + val out = new Array[Long](8) + var f = 0 + while f < 8 do + var r = 0 + while r < 8 do + out(f) |= bit(r * 8 + f) + r += 1 + f += 1 + out + + val rankMask: Array[Long] = + val out = new Array[Long](8) + var r = 0 + while r < 8 do + var f = 0 + while f < 8 do + out(r) |= bit(r * 8 + f) + f += 1 + r += 1 + out + + val adjacentFiles: Array[Long] = + val out = new Array[Long](8) + var f = 0 + while f < 8 do + if f > 0 then out(f) |= fileMask(f - 1) + if f < 7 then out(f) |= fileMask(f + 1) + f += 1 + out + + private val forwardRanksWhite: Array[Long] = + val out = new Array[Long](8) + var r = 0 + while r < 8 do + var rr = r + 1 + while rr < 8 do + out(r) |= rankMask(rr) + rr += 1 + r += 1 + out + + private val forwardRanksBlack: Array[Long] = + val out = new Array[Long](8) + var r = 0 + while r < 8 do + var rr = r - 1 + while rr >= 0 do + out(r) |= rankMask(rr) + rr -= 1 + r += 1 + out + + val passedWhite: Array[Long] = + val out = new Array[Long](64) + var s = 0 + while s < 64 do + val f = fileOf(s) + val span = fileMask(f) | adjacentFiles(f) + out(s) = span & forwardRanksWhite(rankOf(s)) + s += 1 + out + + val passedBlack: Array[Long] = + val out = new Array[Long](64) + var s = 0 + while s < 64 do + val f = fileOf(s) + val span = fileMask(f) | adjacentFiles(f) + out(s) = span & forwardRanksBlack(rankOf(s)) + s += 1 + out + + val frontFileWhite: Array[Long] = + val out = new Array[Long](64) + var s = 0 + while s < 64 do + out(s) = fileMask(fileOf(s)) & forwardRanksWhite(rankOf(s)) + s += 1 + out + + val frontFileBlack: Array[Long] = + val out = new Array[Long](64) + var s = 0 + while s < 64 do + out(s) = fileMask(fileOf(s)) & forwardRanksBlack(rankOf(s)) + s += 1 + out + + val kingRing: Array[Long] = + val out = new Array[Long](64) + val steps = Array((1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)) + var s = 0 + while s < 64 do + val f = fileOf(s) + val r = rankOf(s) + var mask = bit(s) + var i = 0 + while i < steps.length do + val nf = f + steps(i)._1 + val nr = r + steps(i)._2 + if nf >= 0 && nf < 8 && nr >= 0 && nr < 8 then mask |= bit(nr * 8 + nf) + i += 1 + out(s) = mask + s += 1 + out + + val knightAttacks: Array[Long] = + val out = new Array[Long](64) + val steps = Array((1, 2), (2, 1), (2, -1), (1, -2), (-1, -2), (-2, -1), (-2, 1), (-1, 2)) + var s = 0 + while s < 64 do + val f = fileOf(s) + val r = rankOf(s) + var i = 0 + while i < steps.length do + val nf = f + steps(i)._1 + val nr = r + steps(i)._2 + if nf >= 0 && nf < 8 && nr >= 0 && nr < 8 then out(s) |= bit(nr * 8 + nf) + i += 1 + s += 1 + out