From 50f4f7edd73b5792cdf4f5e68ce1f0d6468d11ea Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sat, 14 Jan 2023 20:05:30 +0100 Subject: [PATCH] works --- minmax-rs/src/connect4/board.rs | 73 ++++++++++++++++++++++++++++++--- minmax-rs/src/minmax.rs | 8 +++- 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/minmax-rs/src/connect4/board.rs b/minmax-rs/src/connect4/board.rs index 002cd0e..eb26e97 100644 --- a/minmax-rs/src/connect4/board.rs +++ b/minmax-rs/src/connect4/board.rs @@ -101,7 +101,7 @@ impl Connect4 { 3, 4, 6, 7, 6, 4, 3, 2, 4, 6, 7, 6, 4, 2, 2, 4, 6, 7, 6, 4, 2, - 3, 4, 6, 7, 6, 4, 2, + 3, 4, 6, 7, 6, 4, 3, ]; let score_player = |player: Player| { @@ -209,7 +209,7 @@ impl Display for Connect4 { #[cfg(test)] mod tests { - use crate::{Player, State}; + use crate::{Player, Score, State}; use super::Connect4; @@ -233,14 +233,19 @@ mod tests { Connect4 { positions } } - fn test(board: &str, state: State) { + fn test_result(board: &str, state: State) { let board = parse_board(board); assert_eq!(board.result(), state); } + fn test_rate(board: &str, player: Player, score: Score) { + let board = parse_board(board); + assert_eq!(board.rate(player), score); + } + #[test] fn draw() { - test( + test_result( " XOOOXOX XOOOXOX @@ -253,7 +258,7 @@ mod tests { #[test] fn full_winner() { - test( + test_result( " XOOOXOX XOOOXOX @@ -266,7 +271,7 @@ mod tests { #[test] fn three_rows() { - test( + test_result( " XXX_OOO _XXX___ @@ -276,4 +281,60 @@ mod tests { State::InProgress, ); } + + #[test] + fn rate_alone_edge() { + test_rate( + " + _______ + _______ + _______ + ______X + ", + Player::X, + Score(3), + ) + } + + #[test] + fn rate_alone_center() { + test_rate( + " + _______ + _______ + _______ + ___X___ + ", + Player::X, + Score(7), + ) + } + + #[test] + fn rate_pair_center() { + test_rate( + " + _______ + _______ + _______ + O__X___ + ", + Player::X, + Score(4), + ) + } + + #[test] + fn rate_pair_edge() { + test_rate( + " + _______ + _______ + _______ + O_____X + ", + Player::X, + Score(0), + ) + } } diff --git a/minmax-rs/src/minmax.rs b/minmax-rs/src/minmax.rs index 72a928d..94017f7 100644 --- a/minmax-rs/src/minmax.rs +++ b/minmax-rs/src/minmax.rs @@ -71,7 +71,7 @@ impl PerfectPlayer { board.undo_move(pos); - if value >= max_value { + if value > max_value { max_value = value; if depth == 0 { self.best_move = Some(pos); @@ -107,7 +107,11 @@ impl GamePlayer for PerfectPlayer { self.best_move = None; self.minmax(board, this_player, Score::LOST, Score::WON, 0); - board.make_move(self.best_move.expect("could not make move"), this_player); + board.make_move( + self.best_move + .unwrap_or_else(|| board.possible_moves().next().expect("cannot make move")), + this_player, + ); if self.print_time { let duration = start.elapsed();