diff options
| Commit | a1295f15503548758be351b52b54874537483f6a (patch) | |
|---|---|---|
| Author | 2025-01-12 18:46:02 +0200 | |
| Committer | 2025-01-12 18:46:02 +0200 | |
| Files | 2d4a89626db8191825991a27a03ba5eb4bb61254 | |
| uni-projects-a1295f15503548758be351b52b54874537483f6a.tar uni-projects-a1295f15503548758be351b52b54874537483f6a.tar.gz uni-projects-a1295f15503548758be351b52b54874537483f6a.zip | ||
| Parent | 1d22c53e6f73f34c299b5c9cb29288346d48aea6 (diff) | |
hw(AI/4): Fix depth
1 files changed, 14 insertions, 10 deletions
| -rw-r--r-- | Year 4/Artificial Intelligence/hw04/src/main.rs | 24 |
diff --git a/Year 4/Artificial Intelligence/hw04/src/main.rs b/Year 4/Artificial Intelligence/hw04/src/main.rs index 6bc55d0..933083b 100644 --- a/Year 4/Artificial Intelligence/hw04/src/main.rs +++ b/Year 4/Artificial Intelligence/hw04/src/main.rs @@ -57,8 +57,8 @@ fn game_over(board: &[[Tile; 3]; 3]) -> BoardResult { fn evaluate(board: &[[Tile; 3]; 3]) -> i32 { match game_over(board) { - BoardResult::WinO => 10, - BoardResult::WinX => -10, + BoardResult::WinO => 20, + BoardResult::WinX => -20, BoardResult::Continue => 0, } } @@ -70,8 +70,12 @@ fn minimax( mut beta: i32, maximizer: bool, ) -> (i32, usize, usize) { + if depth == 0 { + return (0, 0, 0); + } + let score = evaluate(board); - if score.abs() == 10 { + if score != 0 { return (score, 0, 0); } @@ -82,11 +86,11 @@ fn minimax( if board[row][col] != Tile::Empty { continue; } board[row][col] = Tile::O; - let eval = minimax(board, depth + 1, alpha, beta, false); + let eval = minimax(board, depth - 1, alpha, beta, false); board[row][col] = Tile::Empty; if eval.0 > max_eval.0 { - max_eval = (eval.0 - depth, row, col); + max_eval = (eval.0, row, col); } alpha = max(alpha, eval.0); @@ -104,11 +108,11 @@ fn minimax( if board[row][col] != Tile::Empty { continue; } board[row][col] = Tile::X; - let eval = minimax(board, depth + 1, alpha, beta, true); + let eval = minimax(board, depth - 1, alpha, beta, true); board[row][col] = Tile::Empty; if eval.0 < min_eval.0 { - min_eval = (eval.0 + depth, row, col); + min_eval = (eval.0, row, col); } beta = min(beta, eval.0); @@ -135,8 +139,8 @@ fn player_move(board: &mut [[Tile; 3]; 3]) { board[x][y] = Tile::X; } -fn computer_move(board: &mut [[Tile; 3]; 3]) { - let (_, x, y) = minimax(board, 0, i32::MIN, i32::MAX, false); +fn computer_move(board: &mut [[Tile; 3]; 3], turn: i32) { + let (_, x, y) = minimax(board, 9 - turn, i32::MIN, i32::MAX, true); println!("Computer move: {x} {y}"); board[x][y] = Tile::O; } @@ -162,7 +166,7 @@ fn main() { break; } - computer_move(&mut board); + computer_move(&mut board, turn); print_board(board); if game_over(&board) != BoardResult::Continue { println!("Computer won!"); |
