minimax done :D
This commit is contained in:
@@ -1,10 +1,44 @@
|
|||||||
use super::{heuristic, Board, Disk};
|
use super::{flip_disk, heuristic::get_score, Board, Disk};
|
||||||
pub fn minimax_decision(board: &Board, depth: i32) -> Board {
|
pub fn minimax_decision(board: &Board, disk: Disk, depth: &i32) -> Board {
|
||||||
todo!()
|
let (child, _) = maximise(board, &disk, depth);
|
||||||
|
match child {
|
||||||
|
Some(state) => state,
|
||||||
|
None => Board::default(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fn maximise(board: &Board, depth: &i32) -> (Board, i32) {
|
fn maximise(board: &Board, disk: &Disk, depth: &i32) -> (Option<Board>, i32) {
|
||||||
todo!()
|
match board.game_over() || *depth == 0 {
|
||||||
|
true => return (None, get_score(board, flip_disk(*disk))),
|
||||||
|
false => {
|
||||||
|
let (mut max_child, mut max_utility): (Option<Board>, 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) {
|
fn minimise(board: &Board, disk: &Disk, depth: &i32) -> (Option<Board>, i32) {
|
||||||
todo!()
|
match board.game_over() || *depth == 0 {
|
||||||
|
true => return (None, get_score(board, flip_disk(*disk))),
|
||||||
|
false => {
|
||||||
|
let (mut min_child, mut min_utility): (Option<Board>, 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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user