feat(core): add move encoding and move list
This commit is contained in:
1 parent
30cc76f2e4
commit
49db5ba8b6
1 file changed
+60
+60
@@ -0,0 +1,60 @@
|
|||||||
|
package gambit
|
||||||
|
|
||||||
|
object Move:
|
||||||
|
private val ToShift = 7
|
||||||
|
private val PromoShift = 14
|
||||||
|
private val CaptureBit = 1 << 17
|
||||||
|
private val EnPassantBit = 1 << 18
|
||||||
|
private val DoubleBit = 1 << 19
|
||||||
|
private val CastleBit = 1 << 20
|
||||||
|
|
||||||
|
def make(
|
||||||
|
from: Int,
|
||||||
|
to: Int,
|
||||||
|
promo: Int = 0,
|
||||||
|
capture: Boolean = false,
|
||||||
|
enPassant: Boolean = false,
|
||||||
|
double: Boolean = false,
|
||||||
|
castle: Boolean = false
|
||||||
|
): Int =
|
||||||
|
from |
|
||||||
|
(to << ToShift) |
|
||||||
|
(promo << PromoShift) |
|
||||||
|
(if capture then CaptureBit else 0) |
|
||||||
|
(if enPassant then EnPassantBit else 0) |
|
||||||
|
(if double then DoubleBit else 0) |
|
||||||
|
(if castle then CastleBit else 0)
|
||||||
|
|
||||||
|
inline def from(m: Int): Int = m & 0x7f
|
||||||
|
inline def to(m: Int): Int = (m >> ToShift) & 0x7f
|
||||||
|
inline def promo(m: Int): Int = (m >> PromoShift) & 7
|
||||||
|
inline def isCapture(m: Int): Boolean = (m & CaptureBit) != 0
|
||||||
|
inline def isEnPassant(m: Int): Boolean = (m & EnPassantBit) != 0
|
||||||
|
inline def isDouble(m: Int): Boolean = (m & DoubleBit) != 0
|
||||||
|
inline def isCastle(m: Int): Boolean = (m & CastleBit) != 0
|
||||||
|
inline def isPromotion(m: Int): Boolean = promo(m) != 0
|
||||||
|
|
||||||
|
def uci(m: Int): String =
|
||||||
|
val base = Square.name(from(m)) + Square.name(to(m))
|
||||||
|
if isPromotion(m) then base + promoChar(promo(m)) else base
|
||||||
|
|
||||||
|
private def promoChar(t: Int): String = t match
|
||||||
|
case Piece.Knight => "n"
|
||||||
|
case Piece.Bishop => "b"
|
||||||
|
case Piece.Rook => "r"
|
||||||
|
case Piece.Queen => "q"
|
||||||
|
case _ => ""
|
||||||
|
|
||||||
|
final class MoveList(capacity: Int = 256):
|
||||||
|
private val data = new Array[Int](capacity)
|
||||||
|
var size = 0
|
||||||
|
|
||||||
|
def add(m: Int): Unit =
|
||||||
|
data(size) = m
|
||||||
|
size += 1
|
||||||
|
|
||||||
|
def apply(i: Int): Int = data(i)
|
||||||
|
|
||||||
|
def update(i: Int, m: Int): Unit = data(i) = m
|
||||||
|
|
||||||
|
def clear(): Unit = size = 0
|
||||||
Reference in new issue
Block a user