From 6be25f699c6829a1329b76d34acade468d2517d0 Mon Sep 17 00:00:00 2001 From: Henri Bourcereau Date: Tue, 28 May 2024 18:52:49 +0200 Subject: [PATCH] wip test get_jans --- Cargo.lock | 47 +++++++++++++++ store/Cargo.toml | 1 + store/src/game_rules_points.rs | 105 +++++++++++++++++++++++++-------- 3 files changed, 127 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba8d6aa..b11e932 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2358,6 +2358,28 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "merge" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10bbef93abb1da61525bbc45eeaff6473a41907d19f8f9aa5168d214e10693e9" +dependencies = [ + "merge_derive", + "num-traits", +] + +[[package]] +name = "merge_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209d075476da2e63b4b29e72a2ef627b840589588e71400a25e3565c4f849d07" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "metal" version = "0.24.0" @@ -2885,6 +2907,30 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.69" @@ -3297,6 +3343,7 @@ version = "0.1.0" dependencies = [ "base64 0.21.7", "log", + "merge", "rand", "serde", "transpose", diff --git a/store/Cargo.toml b/store/Cargo.toml index 4fef1f8..b728263 100644 --- a/store/Cargo.toml +++ b/store/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] base64 = "0.21.7" log = "0.4.20" +merge = "0.1.0" rand = "0.8.5" serde = { version = "1.0", features = ["derive"] } transpose = "0.2.2" diff --git a/store/src/game_rules_points.rs b/store/src/game_rules_points.rs index 251b397..8bc1d58 100644 --- a/store/src/game_rules_points.rs +++ b/store/src/game_rules_points.rs @@ -22,23 +22,29 @@ enum Jan { // - si on ne peut pas jouer ses deux dés } -// #[derive(Debug)] -// struct PossibleJan { -// pub jan: Jan, -// pub ways: Vec<(CheckerMove, CheckerMove)>, -// } +type PossibleJans = HashMap>; -#[derive(Default)] -struct PossibleJans(HashMap>); +trait PossibleJansMethods { + fn push(&mut self, jan: Jan, cmoves: (CheckerMove, CheckerMove)); + fn merge(&mut self, other: Self); +} -impl PossibleJans { - pub fn push(&mut self, jan: Jan, cmoves: (CheckerMove, CheckerMove)) { - if let Some(ways) = self.0.get_mut(&jan) { +impl PossibleJansMethods for PossibleJans { + fn push(&mut self, jan: Jan, cmoves: (CheckerMove, CheckerMove)) { + if let Some(ways) = self.get_mut(&jan) { if !ways.contains(&cmoves) { ways.push(cmoves); } } else { - self.0.insert(jan, [cmoves].into()); + self.insert(jan, [cmoves].into()); + } + } + + fn merge(&mut self, other: Self) { + for (jan, cmoves_list) in other { + for cmoves in cmoves_list { + self.push(jan.clone(), cmoves); + } } } } @@ -72,15 +78,11 @@ impl PointsRules { fn get_jans(&self, board: &Board, dices: &Vec) -> PossibleJans { let mut jans = PossibleJans::default(); - if dices.is_empty() { - return jans; - } - let color = Color::White; let mut dices = dices.clone(); - let mut board = board.clone(); - let fields = board.get_color_fields(color); if let Some(dice) = dices.pop() { - for (from, _) in fields { + let color = Color::White; + let mut board = board.clone(); + for (from, _) in board.get_color_fields(color) { let to = if from + dice as usize > 24 { 0 } else { @@ -98,13 +100,15 @@ impl PointsRules { } Ok(()) => { // TODO : check if it's a jan - let next_dice_jan = self.get_jans(&board, &dices); // TODO : merge jans du dé courant et du prochain dé } } + let next_dice_jan = self.get_jans(&board, &dices); + jans.merge(next_dice_jan); } } } + // TODO : mouvements en tout d'une asdf // - faire un dé d1+d2 et regarder si hit // - si hit : regarder s'il existe le truehit intermédiaire @@ -121,7 +125,8 @@ impl PointsRules { // Jans de remplissage let filling_moves_sequences = self.move_rules.get_quarter_filling_moves_sequences(); points += 4 * filling_moves_sequences.len(); - // Points par simple par moyen Points par doublet par moyen Nombre de moyens possibles Bénéficiaire + // cf. https://fr.wikipedia.org/wiki/Trictrac + // Points par simple par moyen | Points par doublet par moyen Nombre de moyens possibles Bénéficiaire // « JAN RARE » // Jan de six tables 4 n/a 1 Joueur // Jan de deux tables 4 6 1 Joueur @@ -129,12 +134,8 @@ impl PointsRules { // Contre jan de deux tables 4 6 1 Adversaire // Contre jan de mézéas 4 6 1 Adversaire // « JAN DE RÉCOMPENSE » - // Battre à vrai une dame - // située dans la table des grands jans 2 1, 2 ou 3 Joueur - // 4 1 ou 2 Joueur - // Battre à vrai une dame - // située dans la table des petits jans 4 1, 2 ou 3 Joueur - // 6 1 ou 2 Joueur + // Battre à vrai une dame située dans la table des grands jans 2 | 4 1, 2 ou 3 (sauf doublet) Joueur + // Battre à vrai une dame située dans la table des petits jans 4 | 6 1, 2 ou 3 Joueur // Battre le coin adverse 4 6 1 Joueur // « JAN QUI NE PEUT » // Battre à faux une dame @@ -152,3 +153,55 @@ impl PointsRules { points } } + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn get_jans() { + let mut rules = PointsRules::default(); + rules.board.set_positions([ + 2, 0, -1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + let jans = rules.get_jans(&rules.board, &vec![2, 3]); + assert_eq!(1, jans.len()); + assert_eq!(2, jans.get(&Jan::TrueHit).unwrap().len()); + + let jans = rules.get_jans(&rules.board, &vec![2, 2]); + assert_eq!(1, jans.len()); + assert_eq!(1, jans.get(&Jan::TrueHit).unwrap().len()); + + rules.board.set_positions([ + 2, 0, -1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + let jans = rules.get_jans(&rules.board, &vec![2, 3]); + assert_eq!(1, jans.len()); + assert_eq!(2, jans.get(&Jan::TrueHit).unwrap().len()); + + rules.board.set_positions([ + 2, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + let jans = rules.get_jans(&rules.board, &vec![2, 3]); + assert_eq!(1, jans.len()); + assert_eq!(2, jans.get(&Jan::TrueHit).unwrap().len()); + + rules.board.set_positions([ + 2, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + let jans = rules.get_jans(&rules.board, &vec![2, 3]); + assert_eq!(1, jans.len()); + assert_eq!(1, jans.get(&Jan::TrueHit).unwrap().len()); + + rules.board.set_positions([ + 2, 0, 1, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + let jans = rules.get_jans(&rules.board, &vec![2, 3]); + assert_eq!(1, jans.len()); + assert_eq!(3, jans.get(&Jan::TrueHit).unwrap().len()); + } +}