backtracking: consider striking at 8 clues
This commit is contained in:
parent
863baf3acd
commit
47d59464cd
1 changed files with 11 additions and 4 deletions
|
@ -215,6 +215,7 @@ namespace Hanabi
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_num_strikes++;
|
_num_strikes++;
|
||||||
|
assert(_num_strikes <= max_num_strikes);
|
||||||
_num_copies_left[played_card]--;
|
_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
|
// If we misplayed, then we lost the card and have to regain it now
|
||||||
_num_copies_left[last_action.discarded]++;
|
_num_copies_left[last_action.discarded]++;
|
||||||
_num_strikes--;
|
_num_strikes--;
|
||||||
|
assert(_num_strikes >= 0);
|
||||||
}
|
}
|
||||||
CHECK_DRAW_PILE_INTEGRITY;
|
CHECK_DRAW_PILE_INTEGRITY;
|
||||||
}
|
}
|
||||||
|
@ -1033,8 +1035,9 @@ namespace Hanabi
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for discards now
|
// 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
|
// This will hold the index of trash to discard
|
||||||
std::uint8_t const invalid_index = std::numeric_limits<std::uint8_t>::max();
|
std::uint8_t const invalid_index = std::numeric_limits<std::uint8_t>::max();
|
||||||
std::uint8_t discard_index = invalid_index;
|
std::uint8_t discard_index = invalid_index;
|
||||||
|
@ -1068,7 +1071,7 @@ namespace Hanabi
|
||||||
|
|
||||||
// Discard if we found trash now
|
// Discard if we found trash now
|
||||||
if (discard_index != invalid_index) {
|
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);
|
best_probability = std::max(best_probability, probability_discard);
|
||||||
if (best_probability == 1)
|
if (best_probability == 1)
|
||||||
|
@ -1081,7 +1084,7 @@ namespace Hanabi
|
||||||
// sacrifice cards in hand
|
// sacrifice cards in hand
|
||||||
for(hand_index_t index = 0; index < hand_size; ++index) {
|
for(hand_index_t index = 0; index < hand_size; ++index) {
|
||||||
if(!is_critical(hand[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);
|
best_probability = std::max(best_probability, probability_sacrifice);
|
||||||
if (best_probability == 1)
|
if (best_probability == 1)
|
||||||
|
@ -1176,7 +1179,8 @@ 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>
|
||||||
std::uint64_t HanabiState<num_suits, num_players, hand_size>::unique_id() const
|
std::uint64_t HanabiState<num_suits, num_players, hand_size>::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
|
// encode all positions of cards that started in draw pile
|
||||||
ASSERT(_relative_representation.card_positions_draw.size() == _relative_representation.good_cards_draw.size());
|
ASSERT(_relative_representation.card_positions_draw.size() == _relative_representation.good_cards_draw.size());
|
||||||
|
@ -1259,6 +1263,9 @@ namespace Hanabi
|
||||||
std::vector<std::uint64_t> ret;
|
std::vector<std::uint64_t> ret;
|
||||||
std::vector<Card> cards;
|
std::vector<Card> cards;
|
||||||
|
|
||||||
|
// encode strikes first
|
||||||
|
ret.push_back(_num_strikes);
|
||||||
|
|
||||||
// encode all positions of cards that started in draw pile
|
// encode all positions of cards that started in draw pile
|
||||||
ASSERT(_relative_representation.card_positions_draw.size() == _relative_representation.good_cards_draw.size());
|
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++)
|
for (size_t i = 0; i < _relative_representation.card_positions_draw.size(); i++)
|
||||||
|
|
Loading…
Reference in a new issue