diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-02-02 15:27:02 +0100 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-02-02 15:27:02 +0100 |
| commit | 9d979e4df14f90128e3522ef31b1fca07fb81f8c (patch) | |
| tree | 16d4149afc5def79ac7f9f3045c7a5664afdf517 /src/solve.rs | |
| parent | 15efc494b99492df189389474bb981d0ec5ce2b3 (diff) | |
| download | connect4-9d979e4df14f90128e3522ef31b1fca07fb81f8c.tar.gz connect4-9d979e4df14f90128e3522ef31b1fca07fb81f8c.tar.bz2 connect4-9d979e4df14f90128e3522ef31b1fca07fb81f8c.zip | |
Moved solver in a struct
Diffstat (limited to 'src/solve.rs')
| -rw-r--r-- | src/solve.rs | 67 |
1 files changed, 0 insertions, 67 deletions
diff --git a/src/solve.rs b/src/solve.rs deleted file mode 100644 index 9561ff1..0000000 --- a/src/solve.rs +++ /dev/null @@ -1,67 +0,0 @@ -use std::collections::HashMap; - -use crate::position::{Position, WIDTH, HEIGHT, MIN_SCORE}; - -const COLUMNS_ORDER: [u64; 7] = [3, 2, 4, 1, 5, 0, 6]; - -pub fn solve(p: Position) -> i32 { - let mut cache = HashMap::with_capacity(30000); - solve_rec(p, -1000, 1000, &mut cache) -} - -// the weak solver only tells if the position is a win/lose/draw -// it's faster but less precise -pub fn solve_weak(p: Position) -> i32 { - let mut cache = HashMap::with_capacity(30000); - solve_rec(p, -1, 1, &mut cache) -} - -fn solve_rec(p: Position, a: i32, b: i32, cache: &mut HashMap<u64, i32>) -> i32 { - if p.is_draw() { - return 0; - } - for x in 0..WIDTH { - if p.is_valid_play(x) && p.is_winning_play(x) { - return (((WIDTH * HEIGHT + 1) as i32) - (p.play_count as i32)) / 2; - } - } - - let mut alpha = a; - let mut beta = b; - - if let Some(max_score) = cache.get(&p.key()) { - // can't return max_score directly - // because the alpha-beta context in the cache may be - // different than the current alpha-beta - if beta > *max_score { - beta = *max_score; - if alpha >= beta { - return beta; - } - } - } - - let mut best = MIN_SCORE; - for x in (0..(WIDTH as usize)) - .map(|x| COLUMNS_ORDER[x]) - .filter(|x| p.is_valid_play(*x)) - { - // using negamax, variante of minimax where: - // max(player1, player2) == -min(-player1, -player2) - let score = -solve_rec(p.play(x), -beta, -alpha, cache); - if score > best { - best = score; - } - // reduce alpha-beta range if found better score - if best > alpha { - alpha = best; - } - // impossible alpha-beta range reached (alpha is supposed to be < to beta) - if alpha >= beta { - return score; - } - } - cache.insert(p.key(), best); - return best; -} - |
