From 9797a4daaffd8bafc2f8b47c6844fc233378ddbc Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Fri, 5 May 2023 21:59:43 +0300 Subject: [PATCH] minimax done :D --- src/gamedata/algorithms.rs | 48 ++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/gamedata/algorithms.rs b/src/gamedata/algorithms.rs index 6620595..c2a89da 100644 --- a/src/gamedata/algorithms.rs +++ b/src/gamedata/algorithms.rs @@ -1,10 +1,44 @@ -use super::{heuristic, Board, Disk}; -pub fn minimax_decision(board: &Board, depth: i32) -> Board { - todo!() +use super::{flip_disk, heuristic::get_score, Board, Disk}; +pub fn minimax_decision(board: &Board, disk: Disk, depth: &i32) -> Board { + let (child, _) = maximise(board, &disk, depth); + match child { + Some(state) => state, + None => Board::default(), + } } -fn maximise(board: &Board, depth: &i32) -> (Board, i32) { - todo!() +fn maximise(board: &Board, disk: &Disk, depth: &i32) -> (Option, i32) { + match board.game_over() || *depth == 0 { + true => return (None, get_score(board, flip_disk(*disk))), + false => { + let (mut max_child, mut max_utility): (Option, i32) = (None, i32::MIN); + for child in board.get_children(*disk) { + let (_, utility) = minimise(&child, &flip_disk(*disk), &(depth - 1)); + if utility > max_utility { + (max_child, max_utility) = (Some(child), utility) + } + } + (max_child, max_utility) + } + } } -fn minimise(board: &Board, depth: &i32) -> (Board, i32) { - todo!() +fn minimise(board: &Board, disk: &Disk, depth: &i32) -> (Option, i32) { + match board.game_over() || *depth == 0 { + true => return (None, get_score(board, flip_disk(*disk))), + false => { + let (mut min_child, mut min_utility): (Option, i32) = (None, i32::MIN); + for child in board.get_children(*disk) { + let (_, utility) = maximise(&child, &flip_disk(*disk), &(depth - 1)); + if utility > min_utility { + (min_child, min_utility) = (Some(child), utility) + } + } + (min_child, min_utility) + } + } +} +#[test] +fn minimax_test() { + let mut board = Board::default(); + dbg!(minimax_decision(&board, Disk::BLU, &4).columns.as_rows()); + assert!(false); }