feat(core): add precomputed bitboard tables
This commit is contained in:
1 parent
384de06847
commit
30cc76f2e4
1 file changed
+131
+131
@@ -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
|
||||
Reference in new issue
Block a user