From d4e924175a4c897c777f0c82fa96f37b7397a03f Mon Sep 17 00:00:00 2001 From: Micha White Date: Wed, 4 Oct 2023 22:26:03 -0400 Subject: Temporary functions used for UI --- engine/src/eval.rs | 44 +++++++++++++++++++++++++++++++++++++++++++- engine/src/lib.rs | 3 ++- 2 files changed, 45 insertions(+), 2 deletions(-) (limited to 'engine/src') diff --git a/engine/src/eval.rs b/engine/src/eval.rs index a3265bf..f7d1f36 100644 --- a/engine/src/eval.rs +++ b/engine/src/eval.rs @@ -2,7 +2,7 @@ use std::{mem::MaybeUninit, num::NonZeroU8, ops::Neg}; use model::{CheckersBitBoard, Move, PieceColor, PossibleMoves}; -use crate::transposition_table::TranspositionTableRef; +use crate::{transposition_table::TranspositionTableRef, TranspositionTable}; const KING_WORTH: u32 = 2; @@ -143,3 +143,45 @@ pub fn negamax( best_eval } } + +pub fn current_evaluation(depth: u8, board: CheckersBitBoard, table: TranspositionTableRef) -> f32 { + let mut alpha = -1.0; + let mut beta = 1.0; + for i in 0..depth { + let mut eval = negamax(i, alpha, beta, board, table); + + if (eval <= alpha) || (eval >= beta) { + eval = negamax(i, -1.0, 1.0, board, table); + } + + alpha = f32::max(eval + 0.125, -1.0); + beta = f32::min(eval + 0.125, 1.0); + } + + let mut eval = negamax(depth, alpha, beta, board, table); + if (eval <= alpha) || (eval >= beta) { + eval = negamax(depth, -1.0, 1.0, board, table); + } + eval +} + +pub fn best_move(depth: u8, board: CheckersBitBoard, table: TranspositionTableRef) -> Move { + let moves = PossibleMoves::moves(board).into_iter(); + let mut best_move = None; + let mut best_eval = std::f32::NEG_INFINITY; + for current_move in moves { + let current_board = unsafe { current_move.apply_to(board) }; + let current_eval = if board.turn() == current_board.turn() { + current_evaluation(depth - 1, current_board, table) + } else { + -current_evaluation(depth - 1, current_board, table) + }; + + if current_eval >= best_eval { + best_eval = current_eval; + best_move = Some(current_move); + } + } + + best_move.unwrap() +} diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 06f0818..d29169b 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -1,9 +1,10 @@ #![feature(new_uninit)] #![feature(get_mut_unchecked)] -pub use eval::negamax; +pub use eval::{best_move, current_evaluation, negamax}; pub use model::{CheckersBitBoard, Move, PieceColor, PossibleMoves}; pub use transposition_table::{TranspositionTable, TranspositionTableRef}; mod eval; +mod tablebase; mod transposition_table; -- cgit v1.2.3