more code cleanup: remove copy member from card

This commit is contained in:
Maximilian Keßler 2023-08-06 22:20:20 +02:00
parent 423be6c01b
commit ffcdea4eb0
Signed by: max
GPG key ID: BCC5A619923C0BA5
2 changed files with 26 additions and 75 deletions

View file

@ -42,10 +42,8 @@ constexpr std::array<std::string, 6> suit_initials{"r", "y", "g", "b", "p", "t"}
struct Card {
suit_t suit;
rank_t rank;
uint8_t copy;
Card &operator++();
Card successor() const;
const Card operator++(int);
auto operator<=>(const Card &) const = default;
@ -56,16 +54,16 @@ std::ostream &operator<<(std::ostream &os, const Card &card) {
return os;
}
constexpr Card r0 = {0, 0, 0};
constexpr Card r1 = {0, 1, 0};
constexpr Card r2 = {0, 2, 0};
constexpr Card r3 = {0, 3, 0};
constexpr Card r4 = {0, 4, 0};
constexpr Card y0 = {1, 0, 0};
constexpr Card y1 = {1, 1, 0};
constexpr Card y2 = {1, 2, 0};
constexpr Card y3 = {1, 3, 0};
constexpr Card y4 = {1, 4, 0};
constexpr Card r0 = {0, 0};
constexpr Card r1 = {0, 1};
constexpr Card r2 = {0, 2};
constexpr Card r3 = {0, 3};
constexpr Card r4 = {0, 4};
constexpr Card y0 = {1, 0};
constexpr Card y1 = {1, 1};
constexpr Card y2 = {1, 2};
constexpr Card y3 = {1, 3};
constexpr Card y4 = {1, 4};
/**
* To store:
@ -87,24 +85,7 @@ struct CardMultiplicity {
auto operator<=>(const CardMultiplicity &) const = default;
};
template <std::size_t num_suits, typename T, bool respect_card_duplicity>
struct CardArrayMember {
};
template <std::size_t num_suits, typename T>
struct CardArrayMember<num_suits, T, true> {
auto operator<=>(const CardArrayMember &) const = default;
std::array<std::array<std::array<T , max_card_duplicity>, starting_card_rank>, num_suits> array {};
};
template <std::size_t num_suits, typename T>
struct CardArrayMember<num_suits, T, false> {
auto operator<=>(const CardArrayMember &) const = default;
std::array<std::array<T, starting_card_rank>, num_suits> array {};
};
template <std::size_t num_suits, typename T, bool respect_card_duplicity = true> struct CardArray {
template <std::size_t num_suits, typename T> struct CardArray {
using value_type = T;
CardArray() = default;
@ -117,7 +98,7 @@ template <std::size_t num_suits, typename T, bool respect_card_duplicity = true>
auto operator<=>(const CardArray &) const = default;
private:
CardArrayMember<num_suits, T, respect_card_duplicity> _vals;
std::array<std::array<T, starting_card_rank>, num_suits> _array {};
};
enum class ActionType {

View file

@ -16,8 +16,6 @@ namespace Hanabi {
return *this;
}
Card Card::successor() const { return {suit, static_cast<rank_t>(rank + 1)}; }
const Card Card::operator++(int) {
Card ret = *this;
rank++;
@ -33,35 +31,23 @@ namespace Hanabi {
return os;
}
template<std::size_t num_suits, typename T, bool respect_card_duplicity>
CardArray<num_suits, T, respect_card_duplicity>::CardArray(T default_val) {
template<std::size_t num_suits, typename T>
CardArray<num_suits, T>::CardArray(T default_val) {
for(size_t suit = 0; suit < num_suits; suit++) {
for (rank_t rank = 0; rank < starting_card_rank; rank++) {
if constexpr (respect_card_duplicity) {
std::ranges::fill(_vals.array[suit][rank], default_val);
} else {
_vals.array[suit][rank] = default_val;
}
_array[suit][rank] = default_val;
}
}
}
template<std::size_t num_suits, typename T, bool respect_card_duplicity>
const T& CardArray<num_suits, T, respect_card_duplicity>::operator[](const Card &card) const {
if constexpr (respect_card_duplicity) {
return _vals.array[card.suit][card.rank][card.copy];
} else {
return _vals.array[card.suit][card.rank];
}
template<std::size_t num_suits, typename T>
const T& CardArray<num_suits, T>::operator[](const Card &card) const {
return _array[card.suit][card.rank];
};
template<std::size_t num_suits, typename T, bool respect_card_duplicity>
T& CardArray<num_suits, T, respect_card_duplicity>::operator[](const Card &card) {
if constexpr (respect_card_duplicity) {
return _vals.array[card.suit][card.rank][card.copy];
} else {
return _vals.array[card.suit][card.rank];
}
template<std::size_t num_suits, typename T>
T& CardArray<num_suits, T>::operator[](const Card &card) {
return _array[card.suit][card.rank];
};
template<size_t num_suits, player_t num_players, size_t hand_size>
@ -200,8 +186,6 @@ namespace Hanabi {
std::uint8_t HanabiState<num_suits, num_players, hand_size>::draw(uint8_t index) {
ASSERT(index < _hands[_turn].size());
const Card& discarded = _hands[_turn][index];
// draw a new card if the draw pile is not empty
if (!_draw_pile.empty()) {
--_weighted_draw_pile_size;
@ -215,9 +199,7 @@ namespace Hanabi {
_draw_pile.back().multiplicity--;
}
Card& card_in_hand = _hands[_turn][index];
card_in_hand = draw.card;
card_in_hand.copy = draw.multiplicity - 1;
_hands[_turn][index] = draw.card;
if(_draw_pile.empty()) {
// Note the +1, since we will immediately decrement this when moving to the next player
@ -253,13 +235,13 @@ namespace Hanabi {
const Card trash = [this]() -> Card {
for(suit_t suit = 0; suit < num_suits; suit++) {
if(_stacks[suit] < starting_card_rank) {
return {suit, starting_card_rank - 1, 0};
return {suit, starting_card_rank - 1};
}
}
return {0,0,0};
return {0,0};
}();
CardArray<num_suits, std::uint8_t, false> nums_in_draw_pile;
CardArray<num_suits, std::uint8_t> nums_in_draw_pile;
std::uint8_t num_trash_in_draw_pile = 0;
for(const auto [card, multiplicity] : _draw_pile) {
if (_stacks[card.suit] > card.rank) {
@ -272,25 +254,13 @@ namespace Hanabi {
_draw_pile.clear();
for(suit_t suit = 0; suit < num_suits; suit++) {
for(rank_t rank = 0; rank < starting_card_rank; rank++) {
Card card {suit, rank, 0};
Card card {suit, rank};
if (nums_in_draw_pile[card] > 0) {
_draw_pile.push_back({card, nums_in_draw_pile[card]});
for (std::uint8_t copy = 0; copy < nums_in_draw_pile[card]; copy++) {
card.copy = copy;
}
}
}
}
_draw_pile.push_back({trash, num_trash_in_draw_pile});
for(player_t player = 0; player < num_players; player++) {
for(Card& card : _hands[player]) {
if (_stacks[card.suit] > card.rank) {
card.copy = nums_in_draw_pile[card];
nums_in_draw_pile[card]++;
}
}
}
}
template<std::size_t num_suits, player_t num_players, std::size_t hand_size>