diff --git a/doc/refs/journal.md b/doc/refs/journal.md index a677fff..75b028a 100644 --- a/doc/refs/journal.md +++ b/doc/refs/journal.md @@ -23,4 +23,34 @@ lib ## Algorithme de détermination des coups -- get_possible_moves_sequences(with_excedents: bool) +- strategy::choose_move + - GameRules.get_possible_moves_sequences(with_excedents: bool) + - get_possible_moves_sequences_by_dices(dice_max, dice_min, with_excedents, false); + - get_possible_moves_sequences_by_dices(dice_min, dice_max, with_excedents, true); + - has_checkers_outside_last_quarter() ok + - board.get_possible_moves ok + - check_corner_rules(&(first_move, second_move)) ok + +- handle_event + - state.validate (ok) + - rules.moves_follow_rules (ok) + - moves_possible ok + - moves_follows_dices ok + - moves_allowed (ok) + - check_corner_rules ok + - can_take_corner_by_effect ok + - get_possible_moves_sequences -> cf. l.15 + - check_exit_rules + - get_possible_moves_sequences -> cf l.15 + - get_quarter_filling_moves_sequences + - get_possible_moves_sequences -> cf l.15 + - state.consume (RollResult) (ok) + - get_rollresult_jans -> points_rules.get_result_jans (ok) + - get_jans (ok) + - get_jans_by_ordered_dice (ok) + - get_jans_by_ordered_dice ( dices.poped ) + - move_rules.get_scoring_quarter_filling_moves_sequences (ok) + - get_quarter_filling_moves_sequences cf l.8 (ok) + - board.get_quarter_filling_candidate -> is_quarter_fillable ok + - move_rules.get_possible_moves_sequence -> cf l.15 + - get_jans_points -> jan.get_points ok diff --git a/store/src/game_rules_moves.rs b/store/src/game_rules_moves.rs index 378bf3e..bd6c0f7 100644 --- a/store/src/game_rules_moves.rs +++ b/store/src/game_rules_moves.rs @@ -432,19 +432,31 @@ impl MoveRules { continue; } + // XXX : the goal here is to replicate moves_allowed() checks without using get_possible_moves_sequences to + // avoid an infinite loop... let mut has_second_dice_move = false; for second_move in board2.get_possible_moves(*color, dice2, with_excedents, true, forbid_exits) { - if self.check_corner_rules(&(first_move, second_move)).is_ok() { + if self.check_corner_rules(&(first_move, second_move)).is_ok() + && !(self.is_move_by_puissance(&(first_move, second_move)) + && self.can_take_corner_by_effect()) + { moves_seqs.push((first_move, second_move)); has_second_dice_move = true; } + // TODO : autres règles à vérifier (cf. moves_allowed) + // - check_exit_rules -> utilise get_possible_moves_sequences ! + // - get_quarter_filling_moves_sequences -> utilise get_possible_moves_sequences ! } if !has_second_dice_move && with_excedents && !ignore_empty && self.check_corner_rules(&(first_move, EMPTY_MOVE)).is_ok() + // TODO : autres règles à vérifier (cf. moves_allowed) + // - can_take_corner_by_effect + // - check_exit_rules + // - get_quarter_filling_moves_sequences { // empty move moves_seqs.push((first_move, EMPTY_MOVE));