34 lines
907 B
Scala
34 lines
907 B
Scala
package gambit
|
|
|
|
object Perft:
|
|
def perft(pos: Position, depth: Int): Long =
|
|
if depth == 0 then 1L
|
|
else
|
|
val moves = new MoveList()
|
|
MoveGen.generateLegal(pos, moves)
|
|
if depth == 1 then moves.size.toLong
|
|
else
|
|
var nodes = 0L
|
|
var i = 0
|
|
while i < moves.size do
|
|
val m = moves(i)
|
|
val undo = pos.make(m)
|
|
nodes += perft(pos, depth - 1)
|
|
pos.unmake(m, undo)
|
|
i += 1
|
|
nodes
|
|
|
|
def divide(pos: Position, depth: Int): List[(String, Long)] =
|
|
val moves = new MoveList()
|
|
MoveGen.generateLegal(pos, moves)
|
|
val out = List.newBuilder[(String, Long)]
|
|
var i = 0
|
|
while i < moves.size do
|
|
val m = moves(i)
|
|
val undo = pos.make(m)
|
|
val count = if depth <= 1 then 1L else perft(pos, depth - 1)
|
|
pos.unmake(m, undo)
|
|
out += (Move.uci(m) -> count)
|
|
i += 1
|
|
out.result()
|