diff --git a/include/game_state.hpp b/include/game_state.hpp index a48cb42..5cab931 100644 --- a/include/game_state.hpp +++ b/include/game_state.hpp @@ -215,6 +215,7 @@ namespace Hanabi } } else { _num_strikes++; + assert(_num_strikes <= max_num_strikes); _num_copies_left[played_card]--; } @@ -646,6 +647,7 @@ namespace Hanabi // If we misplayed, then we lost the card and have to regain it now _num_copies_left[last_action.discarded]++; _num_strikes--; + assert(_num_strikes >= 0); } CHECK_DRAW_PILE_INTEGRITY; } @@ -1033,8 +1035,9 @@ namespace Hanabi } // Check for discards now - if (_pace > 0 and _num_clues < max_num_clues) + if (_pace > 0 and (_num_clues < max_num_clues or _num_strikes < max_num_strikes)) { + bool const play_card_instead_of_discarding = _num_clues == max_num_clues; // This will hold the index of trash to discard std::uint8_t const invalid_index = std::numeric_limits::max(); std::uint8_t discard_index = invalid_index; @@ -1068,7 +1071,7 @@ namespace Hanabi // Discard if we found trash now if (discard_index != invalid_index) { - probability_t const probability_discard = check_play_or_discard(discard_index, false); + probability_t const probability_discard = check_play_or_discard(discard_index, play_card_instead_of_discarding); best_probability = std::max(best_probability, probability_discard); if (best_probability == 1) @@ -1081,7 +1084,7 @@ namespace Hanabi // sacrifice cards in hand for(hand_index_t index = 0; index < hand_size; ++index) { if(!is_critical(hand[index])) { - probability_t const probability_sacrifice = check_play_or_discard(index, false); + probability_t const probability_sacrifice = check_play_or_discard(index, play_card_instead_of_discarding); best_probability = std::max(best_probability, probability_sacrifice); if (best_probability == 1) @@ -1176,7 +1179,8 @@ namespace Hanabi template std::uint64_t HanabiState::unique_id() const { - unsigned long id = 0; + // Encode strikes first, since they will often be zero. + unsigned long id = _num_strikes; // encode all positions of cards that started in draw pile ASSERT(_relative_representation.card_positions_draw.size() == _relative_representation.good_cards_draw.size()); @@ -1259,6 +1263,9 @@ namespace Hanabi std::vector ret; std::vector cards; + // encode strikes first + ret.push_back(_num_strikes); + // encode all positions of cards that started in draw pile ASSERT(_relative_representation.card_positions_draw.size() == _relative_representation.good_cards_draw.size()); for (size_t i = 0; i < _relative_representation.card_positions_draw.size(); i++)