feat(core): add board geometry and piece encoding
This commit is contained in:
1 parent
d6d1a59259
commit
c10a9d821f
1 file changed
+65
+65
@@ -0,0 +1,65 @@
|
||||
package gambit
|
||||
|
||||
object Color:
|
||||
val White = 0
|
||||
val Black = 1
|
||||
inline def opposite(c: Int): Int = c ^ 1
|
||||
|
||||
object Piece:
|
||||
val Empty = 0
|
||||
val Pawn = 1
|
||||
val Knight = 2
|
||||
val Bishop = 3
|
||||
val Rook = 4
|
||||
val Queen = 5
|
||||
val King = 6
|
||||
|
||||
inline def make(color: Int, pieceType: Int): Int = (color << 3) | pieceType
|
||||
inline def typeOf(piece: Int): Int = piece & 7
|
||||
inline def colorOf(piece: Int): Int = piece >> 3
|
||||
|
||||
val WhitePawn = make(Color.White, Pawn)
|
||||
val WhiteKnight = make(Color.White, Knight)
|
||||
val WhiteBishop = make(Color.White, Bishop)
|
||||
val WhiteRook = make(Color.White, Rook)
|
||||
val WhiteQueen = make(Color.White, Queen)
|
||||
val WhiteKing = make(Color.White, King)
|
||||
val BlackPawn = make(Color.Black, Pawn)
|
||||
val BlackKnight = make(Color.Black, Knight)
|
||||
val BlackBishop = make(Color.Black, Bishop)
|
||||
val BlackRook = make(Color.Black, Rook)
|
||||
val BlackQueen = make(Color.Black, Queen)
|
||||
val BlackKing = make(Color.Black, King)
|
||||
|
||||
object Square:
|
||||
inline def make(file: Int, rank: Int): Int = rank * 16 + file
|
||||
inline def fileOf(sq: Int): Int = sq & 7
|
||||
inline def rankOf(sq: Int): Int = sq >> 4
|
||||
inline def onBoard(sq: Int): Boolean = (sq & 0x88) == 0
|
||||
|
||||
def name(sq: Int): String =
|
||||
val file = ('a' + fileOf(sq)).toChar
|
||||
val rank = ('1' + rankOf(sq)).toChar
|
||||
s"$file$rank"
|
||||
|
||||
def fromName(s: String): Int = make(s(0) - 'a', s(1) - '1')
|
||||
|
||||
object Castling:
|
||||
val WhiteKing = 1
|
||||
val WhiteQueen = 2
|
||||
val BlackKing = 4
|
||||
val BlackQueen = 8
|
||||
|
||||
val mask: Array[Int] = Array.fill(128)(15)
|
||||
mask(Square.make(4, 0)) = 15 & ~(WhiteKing | WhiteQueen)
|
||||
mask(Square.make(7, 0)) = 15 & ~WhiteKing
|
||||
mask(Square.make(0, 0)) = 15 & ~WhiteQueen
|
||||
mask(Square.make(4, 7)) = 15 & ~(BlackKing | BlackQueen)
|
||||
mask(Square.make(7, 7)) = 15 & ~BlackKing
|
||||
mask(Square.make(0, 7)) = 15 & ~BlackQueen
|
||||
|
||||
object Directions:
|
||||
val knight: Array[Int] = Array(33, 31, 18, 14, -14, -18, -31, -33)
|
||||
val bishop: Array[Int] = Array(17, 15, -15, -17)
|
||||
val rook: Array[Int] = Array(16, 1, -1, -16)
|
||||
val king: Array[Int] = Array(17, 16, 15, 1, -1, -15, -16, -17)
|
||||
Reference in new issue
Block a user