This commit is contained in:
Henri Bourcereau 2024-05-27 19:54:58 +02:00
parent 9bf5cedfa0
commit a2b700db7c

View file

@ -1,3 +1,5 @@
use std::collections::HashMap;
use crate::board::{Board, EMPTY_MOVE}; use crate::board::{Board, EMPTY_MOVE};
use crate::dice::Dice; use crate::dice::Dice;
use crate::game_rules_moves::MoveRules; use crate::game_rules_moves::MoveRules;
@ -5,7 +7,7 @@ use crate::player::Color;
use crate::CheckerMove; use crate::CheckerMove;
use crate::Error; use crate::Error;
#[derive(std::cmp::PartialEq, Debug)] #[derive(PartialEq, Eq, Hash, Clone, Debug)]
enum Jan { enum Jan {
FilledQuarter, FilledQuarter,
TrueHit, TrueHit,
@ -20,10 +22,25 @@ enum Jan {
// - si on ne peut pas jouer ses deux dés // - si on ne peut pas jouer ses deux dés
} }
#[derive(Debug)] // #[derive(Debug)]
struct PossibleJan { // struct PossibleJan {
pub jan: Jan, // pub jan: Jan,
pub ways: Vec<(CheckerMove, CheckerMove)>, // pub ways: Vec<(CheckerMove, CheckerMove)>,
// }
#[derive(Default)]
struct PossibleJans(HashMap<Jan, Vec<(CheckerMove, CheckerMove)>>);
impl PossibleJans {
pub fn push(&mut self, jan: Jan, cmoves: (CheckerMove, CheckerMove)) {
if let Some(ways) = self.0.get_mut(&jan) {
if !ways.contains(&cmoves) {
ways.push(cmoves);
}
} else {
self.0.insert(jan, [cmoves].into());
}
}
} }
/// PointsRules always consider that the current player is White /// PointsRules always consider that the current player is White
@ -53,8 +70,8 @@ impl PointsRules {
} }
} }
fn get_jans(&self, board: &Board, dices: &Vec<u8>) -> Vec<PossibleJan> { fn get_jans(&self, board: &Board, dices: &Vec<u8>) -> PossibleJans {
let mut jans = Vec::new(); let mut jans = PossibleJans::default();
if dices.is_empty() { if dices.is_empty() {
return jans; return jans;
} }
@ -72,13 +89,13 @@ impl PointsRules {
if let Ok(cmove) = CheckerMove::new(from, to) { if let Ok(cmove) = CheckerMove::new(from, to) {
match board.move_checker(&color, cmove) { match board.move_checker(&color, cmove) {
Err(Error::FieldBlockedByOne) => { Err(Error::FieldBlockedByOne) => {
jans.push(PossibleJan { jans.push(Jan::TrueHit, (cmove, EMPTY_MOVE));
jan: Jan::TrueHit, }
ways: vec![(cmove, EMPTY_MOVE)], Err(_) => {
}); // let next_dice_jan = self.get_jans(&board, &dices);
// TODO : prise en puissance // jans possibles en tout d'une après un battage à vrai :
// truehit
} }
Err(_) => {}
Ok(()) => { Ok(()) => {
// TODO : check if it's a jan // TODO : check if it's a jan
let next_dice_jan = self.get_jans(&board, &dices); let next_dice_jan = self.get_jans(&board, &dices);
@ -88,7 +105,10 @@ impl PointsRules {
} }
} }
} }
// TODO : mouvement en puissance ? // 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
// - regarder les TrueHit qui nécessitent deux mouvemments non nuls
// TODO : tout d'une (sans doublons avec 1 + 1) ? // TODO : tout d'une (sans doublons avec 1 + 1) ?
jans jans
} }