#ifndef HAND_HPP_ #define HAND_HPP_ #include "Card.hpp" class Hand { public: Hand(); virtual ~Hand(); // Добавляет карту в руку void Add(Card* pCard); // Очищает руку от карт void Clear(); // Получает сумму очков карт в руке, присваивая тузу // значение 1 или 11 в зависимости от ситуации int GetTotal() const; protected: // Коллекция карт std::vector m_Cards; }; Hand::Hand() { m_Cards.reserve(7); } Hand::~Hand() { Clear(); } void Hand::Add(Card* pCard) { m_Cards.push_back(pCard); } void Hand::Clear() { // Проходит по вектору, освобождая всю память в куче std::vector::iterator iter = m_Cards.begin(); for (iter = m_Cards.begin(); iter != m_Cards.end(); ++iter) { delete *iter; *iter = nullptr; } // Очищает вектор указателей m_Cards.clear(); } int Hand::GetTotal() const { // Если в руке нет карт if (m_Cards.empty()) { return 0; } // Если первая карта имеет значение 0, то она лежит рубашкой вверх; // Вернуть значение 0 if (m_Cards[0]->GetValue() == 0) { return 0; } // Находит сумму очков всех карт, каждый туз (Card::ACE == 1) дает 1 очко int total = 0; std::vector::const_iterator iter; for (iter = m_Cards.begin(); iter != m_Cards.end(); ++iter) { total += (*iter)->GetValue(); } // Определяет. держит ли рука туз bool containsAce = false; for (iter = m_Cards.begin(); iter != m_Cards.end(); ++iter) { if ((*iter)->GetValue() == Card::ACE) { containsAce = true; } } // Если сумма очков всех карт в руке меньше 11 // то туз учитывается, как 11 очков (1 + 10) if (containsAce && total <= 11) { total += 10; } return total; } #endif