From a3b836265a5b22e9e48a0157f3b73bf8a361d5ae Mon Sep 17 00:00:00 2001 From: nils <48135649+Nilstrieb@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:20:18 +0100 Subject: [PATCH] more things --- .gitignore | 1 + src/main.rs | 6 ++++-- src/minmax.rs | 16 ++++++++++++---- src/tic_tac_toe/mod.rs | 4 ++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index ea8c4bf..3071078 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +perf.* diff --git a/src/main.rs b/src/main.rs index aa35a45..7c38d22 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,6 +61,8 @@ struct Args { x: PlayerConfig, #[arg(short)] o: PlayerConfig, + #[arg(long)] + no_print_time: bool, } fn main() { @@ -72,7 +74,7 @@ fn main() { match player { PlayerConfig::Human => Box::new(connect4::HumanPlayer), PlayerConfig::Perfect { depth } => { - Box::new(PerfectPlayer::new().with_max_depth(depth)) + Box::new(PerfectPlayer::new(!args.no_print_time).with_max_depth(depth)) } } }; @@ -87,7 +89,7 @@ fn main() { match player { PlayerConfig::Human => Box::new(tic_tac_toe::HumanPlayer), PlayerConfig::Perfect { depth } => { - Box::new(PerfectPlayer::new().with_max_depth(depth)) + Box::new(PerfectPlayer::new(!args.no_print_time).with_max_depth(depth)) } } }; diff --git a/src/minmax.rs b/src/minmax.rs index 7a78d76..07ed8ff 100644 --- a/src/minmax.rs +++ b/src/minmax.rs @@ -1,22 +1,26 @@ +use std::time::Instant; + use crate::{Game, GamePlayer, Player, Score, State}; #[derive(Clone)] pub struct PerfectPlayer { best_move: Option, max_depth: Option, + print_time: bool, } impl Default for PerfectPlayer { fn default() -> Self { - Self::new() + Self::new(true) } } impl PerfectPlayer { - pub fn new() -> Self { + pub fn new(print_time: bool) -> Self { Self { best_move: None, max_depth: G::REASONABLE_SEARCH_DEPTH, + print_time, } } @@ -64,11 +68,15 @@ impl PerfectPlayer { impl GamePlayer for PerfectPlayer { fn next_move(&mut self, board: &mut G, this_player: Player) { - println!("{board}"); - + let start = Instant::now(); self.best_move = None; self.minmax(board, this_player, 0); board.make_move(self.best_move.expect("could not make move"), this_player); + + if self.print_time { + let duration = start.elapsed(); + println!("Move took {duration:?}"); + } } } diff --git a/src/tic_tac_toe/mod.rs b/src/tic_tac_toe/mod.rs index ccc7bca..e8325b9 100644 --- a/src/tic_tac_toe/mod.rs +++ b/src/tic_tac_toe/mod.rs @@ -33,11 +33,11 @@ mod tests { #[test] fn perfect_always_beats_greedy() { - assert_win_ratio(20, 1.0, || PerfectPlayer::new(), || GreedyPlayer); + assert_win_ratio(20, 1.0, || PerfectPlayer::new(false), || GreedyPlayer); } #[test] fn perfect_beats_random() { - assert_win_ratio(10, 0.95, || PerfectPlayer::new(), || RandomPlayer); + assert_win_ratio(10, 0.95, || PerfectPlayer::new(false), || RandomPlayer); } }