Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commita1295f15503548758be351b52b54874537483f6a (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-01-12 18:46:02 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-01-12 18:46:02 +0200
Files2d4a89626db8191825991a27a03ba5eb4bb61254
uni-projects-a1295f15503548758be351b52b54874537483f6a.tar
uni-projects-a1295f15503548758be351b52b54874537483f6a.tar.gz
uni-projects-a1295f15503548758be351b52b54874537483f6a.zip
Parent1d22c53e6f73f34c299b5c9cb29288346d48aea6 (diff)
hw(AI/4): Fix depth
1 files changed, 14 insertions, 10 deletions
-rw-r--r--Year 4/Artificial Intelligence/hw04/src/main.rs24
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!");