summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/src/eval.rs44
-rw-r--r--engine/src/lib.rs3
2 files changed, 45 insertions, 2 deletions
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;