geekbrains_oop_cpp/lesson_4/Hand.hpp

91 lines
2.1 KiB
C++

#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<Card*> 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<Card*>::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<Card*>::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