add 8 clue state to backtrack action
This commit is contained in:
parent
a4ee7ace1d
commit
b1963967a7
2 changed files with 22 additions and 12 deletions
13
game_state.h
13
game_state.h
|
@ -146,13 +146,22 @@ enum class ActionType {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BacktrackAction {
|
struct BacktrackAction {
|
||||||
BacktrackAction(ActionType action_type, Card discarded_or_played, hand_index_t index);
|
explicit BacktrackAction(
|
||||||
|
ActionType action_type,
|
||||||
|
Card discarded_or_played = unknown_card,
|
||||||
|
hand_index_t index = 0,
|
||||||
|
bool was_on_8_clues = false
|
||||||
|
);
|
||||||
|
|
||||||
ActionType action_type{};
|
ActionType action_type{};
|
||||||
// The card that was discarded or played
|
// The card that was discarded or played
|
||||||
Card discarded{};
|
Card discarded{};
|
||||||
// Index of card in hand that was discarded or played
|
// Index of card in hand that was discarded or played
|
||||||
hand_index_t index{};
|
hand_index_t index{};
|
||||||
|
|
||||||
|
// Indicates whether before the action was taken, we had 8 clues.
|
||||||
|
// This is important so that we know if we go back to 7 or 8 clues when we revert playing a 5
|
||||||
|
bool was_on_8_clues {false};
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Would like to have 2 versions:
|
/** Would like to have 2 versions:
|
||||||
|
@ -201,7 +210,7 @@ public:
|
||||||
void discard(hand_index_t index) final;
|
void discard(hand_index_t index) final;
|
||||||
|
|
||||||
void revert_clue();
|
void revert_clue();
|
||||||
void revert_play(bool was_on_8_clues);
|
void revert_play();
|
||||||
void revert_discard();
|
void revert_discard();
|
||||||
|
|
||||||
[[nodiscard]] hand_index_t find_card_in_hand(const Card& card) const final;
|
[[nodiscard]] hand_index_t find_card_in_hand(const Card& card) const final;
|
||||||
|
|
|
@ -62,11 +62,13 @@ namespace Hanabi {
|
||||||
};
|
};
|
||||||
|
|
||||||
BacktrackAction::BacktrackAction(
|
BacktrackAction::BacktrackAction(
|
||||||
Hanabi::ActionType action_type, Hanabi::Card discarded_or_played, Hanabi::hand_index_t index
|
Hanabi::ActionType action_type, Hanabi::Card discarded_or_played, Hanabi::hand_index_t index,
|
||||||
|
bool was_on_8_clues
|
||||||
):
|
):
|
||||||
action_type(action_type),
|
action_type(action_type),
|
||||||
discarded(discarded_or_played),
|
discarded(discarded_or_played),
|
||||||
index(index) {
|
index(index),
|
||||||
|
was_on_8_clues(was_on_8_clues) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
||||||
|
@ -156,6 +158,8 @@ namespace Hanabi {
|
||||||
const Card played_card = _hands[_turn][index];
|
const Card played_card = _hands[_turn][index];
|
||||||
ASSERT(is_playable(played_card));
|
ASSERT(is_playable(played_card));
|
||||||
|
|
||||||
|
_actions_log.emplace(ActionType::play, played_card, index, _num_clues == 8);
|
||||||
|
|
||||||
--_stacks[played_card.suit];
|
--_stacks[played_card.suit];
|
||||||
_score++;
|
_score++;
|
||||||
|
|
||||||
|
@ -165,7 +169,6 @@ namespace Hanabi {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long multiplicity = draw<update_card_positions>(index);
|
unsigned long multiplicity = draw<update_card_positions>(index);
|
||||||
_actions_log.emplace(ActionType::play, played_card, index);
|
|
||||||
|
|
||||||
incr_turn();
|
incr_turn();
|
||||||
return multiplicity;
|
return multiplicity;
|
||||||
|
@ -388,14 +391,14 @@ namespace Hanabi {
|
||||||
|
|
||||||
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
||||||
void
|
void
|
||||||
HanabiState<num_suits, num_players, hand_size>::revert_play(bool was_on_8_clues) {
|
HanabiState<num_suits, num_players, hand_size>::revert_play() {
|
||||||
const BacktrackAction last_action = _actions_log.top();
|
const BacktrackAction last_action = _actions_log.top();
|
||||||
_actions_log.pop();
|
_actions_log.pop();
|
||||||
ASSERT(last_action.action_type == ActionType::play);
|
ASSERT(last_action.action_type == ActionType::play);
|
||||||
ASSERT(!was_on_8_clues or _num_clues == 8);
|
ASSERT(!last_action.was_on_8_clues or _num_clues == 8);
|
||||||
|
|
||||||
decr_turn();
|
decr_turn();
|
||||||
if (last_action.discarded.rank == 0 and not was_on_8_clues) {
|
if (last_action.discarded.rank == 0 and not last_action.was_on_8_clues) {
|
||||||
_num_clues--;
|
_num_clues--;
|
||||||
}
|
}
|
||||||
revert_draw(last_action.index, last_action.discarded);
|
revert_draw(last_action.index, last_action.discarded);
|
||||||
|
@ -471,20 +474,18 @@ namespace Hanabi {
|
||||||
for(std::uint8_t index = 0; index < hand_size; index++) {
|
for(std::uint8_t index = 0; index < hand_size; index++) {
|
||||||
if(is_playable(hand[index])) {
|
if(is_playable(hand[index])) {
|
||||||
if (_draw_pile.empty()) {
|
if (_draw_pile.empty()) {
|
||||||
bool on_8_clues = _num_clues == 8;
|
|
||||||
play_and_potentially_update<true>(index);
|
play_and_potentially_update<true>(index);
|
||||||
const probability_t probability_for_this_play = backtrack(depth + 1);
|
const probability_t probability_for_this_play = backtrack(depth + 1);
|
||||||
revert_play(on_8_clues);
|
revert_play();
|
||||||
UPDATE_PROBABILITY(probability_for_this_play);
|
UPDATE_PROBABILITY(probability_for_this_play);
|
||||||
} else {
|
} else {
|
||||||
probability_t sum_of_probabilities = 0;
|
probability_t sum_of_probabilities = 0;
|
||||||
uint8_t sum_of_mults = 0;
|
uint8_t sum_of_mults = 0;
|
||||||
for (size_t i = 0; i < _draw_pile.size(); i++) {
|
for (size_t i = 0; i < _draw_pile.size(); i++) {
|
||||||
bool on_8_clues = _num_clues == 8;
|
|
||||||
const unsigned long multiplicity = play_and_potentially_update<true>(index);
|
const unsigned long multiplicity = play_and_potentially_update<true>(index);
|
||||||
sum_of_probabilities += backtrack(depth + 1) * multiplicity;
|
sum_of_probabilities += backtrack(depth + 1) * multiplicity;
|
||||||
sum_of_mults += multiplicity;
|
sum_of_mults += multiplicity;
|
||||||
revert_play(on_8_clues);
|
revert_play();
|
||||||
ASSERT(sum_of_mults <= _weighted_draw_pile_size);
|
ASSERT(sum_of_mults <= _weighted_draw_pile_size);
|
||||||
}
|
}
|
||||||
ASSERT(sum_of_mults == _weighted_draw_pile_size);
|
ASSERT(sum_of_mults == _weighted_draw_pile_size);
|
||||||
|
|
Loading…
Reference in a new issue