// Eryn Wells use crate::{GeneratedMove, Position, ValidateMove}; pub trait Perft { fn perft(&mut self, depth: usize) -> u64; } impl Perft for Position { fn perft(&mut self, depth: usize) -> u64 { if depth == 0 { return 1; } let mut total_nodes_counted = 0u64; let legal_moves: Vec = self.all_legal_moves(None).collect(); for generated_ply in legal_moves { let ply = generated_ply.ply(); let has_seen_position = self .make_move(ply, ValidateMove::No) .expect("unable to make generated move"); // Do not recursive into trees where board positions repeat. let nodes_counted = if has_seen_position { 1 } else { self.perft(depth - 1) }; total_nodes_counted += nodes_counted; self.unmake_last_move().expect("unable to unmake last move"); } total_nodes_counted } } impl Position { fn perft_recursive(&mut self, depth: usize) -> u64 { if depth == 0 { return 1; } let mut total_nodes_counted: u64 = 0; let legal_moves: Vec = self.all_legal_moves(None).collect(); for generated_ply in legal_moves { let ply = generated_ply.ply(); self.make_move(ply, ValidateMove::No) .expect("unable to make generated move"); let nodes_counted = self.perft_recursive(depth - 1); total_nodes_counted += nodes_counted; self.unmake_last_move().expect("unable to unmake last move"); } total_nodes_counted } }