refactor. make reverting possible in non-backtracking state
This commit is contained in:
parent
ec203198c0
commit
907fb3ae47
3 changed files with 8 additions and 11 deletions
|
@ -140,7 +140,7 @@ namespace Download {
|
|||
return game;
|
||||
}
|
||||
}
|
||||
game->normalize_draw_and_positions();
|
||||
game->init_backtracking_information();
|
||||
return game;
|
||||
}
|
||||
|
||||
|
|
10
game_state.h
10
game_state.h
|
@ -153,15 +153,10 @@ enum class ActionType {
|
|||
|
||||
class HanabiStateIF {
|
||||
public:
|
||||
virtual probability_t evaluate_state() = 0;
|
||||
|
||||
virtual void clue() = 0;
|
||||
virtual void discard(hand_index_t index) = 0;
|
||||
virtual void play(hand_index_t index) = 0;
|
||||
|
||||
/**
|
||||
* May only be used if the relative state is already initialized
|
||||
*/
|
||||
virtual void revert() = 0;
|
||||
|
||||
[[nodiscard]] virtual hand_index_t find_card_in_hand(const Card& card) const = 0;
|
||||
|
@ -173,7 +168,8 @@ public:
|
|||
[[nodiscard]] virtual std::uint64_t enumerated_states() const = 0;
|
||||
[[nodiscard]] virtual const std::unordered_map<unsigned long, probability_t>& position_tablebase() const = 0;
|
||||
|
||||
virtual void normalize_draw_and_positions() = 0;
|
||||
virtual void init_backtracking_information() = 0;
|
||||
virtual probability_t evaluate_state() = 0;
|
||||
|
||||
virtual ~HanabiStateIF() = default;
|
||||
|
||||
|
@ -206,7 +202,7 @@ public:
|
|||
[[nodiscard]] std::uint64_t enumerated_states() const final;
|
||||
[[nodiscard]] const std::unordered_map<unsigned long, probability_t>& position_tablebase() const final;
|
||||
|
||||
void normalize_draw_and_positions() final;
|
||||
void init_backtracking_information() final;
|
||||
|
||||
auto operator<=>(const HanabiState &) const = default;
|
||||
|
||||
|
|
|
@ -294,7 +294,7 @@ namespace Hanabi {
|
|||
_draw_pile.push_back({drawn, 1});
|
||||
}
|
||||
|
||||
if (!drawn.initial_trash) {
|
||||
if (_relative_representation.initialized && !drawn.initial_trash) {
|
||||
ASSERT(drawn.in_starting_hand == false);
|
||||
auto drawn_card_it = std::ranges::find(_relative_representation.card_positions_draw[drawn.local_index], _turn);
|
||||
ASSERT(drawn_card_it != _relative_representation.card_positions_draw[drawn.local_index].end());
|
||||
|
@ -307,7 +307,7 @@ namespace Hanabi {
|
|||
ASSERT(_hands[_turn][index] == discarded_card);
|
||||
}
|
||||
|
||||
if (!discarded_card.initial_trash) {
|
||||
if (_relative_representation.initialized && !discarded_card.initial_trash) {
|
||||
if (discarded_card.in_starting_hand) {
|
||||
ASSERT(_relative_representation.card_positions_hands[discarded_card.local_index] == false);
|
||||
_relative_representation.card_positions_hands[discarded_card.local_index] = true;
|
||||
|
@ -323,7 +323,7 @@ namespace Hanabi {
|
|||
}
|
||||
|
||||
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
||||
void HanabiState<num_suits, num_players, hand_size>::normalize_draw_and_positions() {
|
||||
void HanabiState<num_suits, num_players, hand_size>::init_backtracking_information() {
|
||||
// Note that this function does not have to be particularly performant, we only call it once to initialize.
|
||||
const Card trash = [this]() -> Card {
|
||||
for (suit_t suit = 0; suit < num_suits; suit++) {
|
||||
|
@ -454,6 +454,7 @@ namespace Hanabi {
|
|||
|
||||
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
||||
probability_t HanabiState<num_suits, num_players, hand_size>::evaluate_state() {
|
||||
ASSERT(_relative_representation.initialized);
|
||||
_enumerated_states++;
|
||||
const unsigned long id_of_state = unique_id();
|
||||
|
||||
|
|
Loading…
Reference in a new issue