94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
#include "playingcard.h"
|
|
|
|
PlayingCard::PlayingCard(const PlayingCard::Suit &suit, const PlayingCard::Value &value, QObject *parent)
|
|
: QObject{parent}, m_suit{suit}, m_value{value}
|
|
{ }
|
|
|
|
PlayingCard::Suit PlayingCard::suit() const
|
|
{
|
|
return m_suit;
|
|
}
|
|
|
|
QString PlayingCard::suitString() const
|
|
{
|
|
switch (m_suit) {
|
|
case Clubs: return "clubs";
|
|
case Diamonds: return "diamonds";
|
|
case Hearts: return "hearts";
|
|
case Spades: return "spades";
|
|
default: throw std::invalid_argument("Invalid Suit enum value");
|
|
}
|
|
}
|
|
|
|
void PlayingCard::setSuit(const PlayingCard::Suit &suit)
|
|
{
|
|
if (m_suit == suit)
|
|
return;
|
|
|
|
m_suit = suit;
|
|
emit suitChanged();
|
|
}
|
|
|
|
PlayingCard::Value PlayingCard::value() const
|
|
{
|
|
return m_value;
|
|
}
|
|
|
|
QString PlayingCard::valueString() const
|
|
{
|
|
switch (m_value) {
|
|
case Ace: return "ace";
|
|
case Two: return "2";
|
|
case Three: return "3";
|
|
case Four: return "4";
|
|
case Five: return "5";
|
|
case Six: return "6";
|
|
case Seven: return "7";
|
|
case Eight: return "8";
|
|
case Nine: return "9";
|
|
case Ten: return "10";
|
|
case Jack: return "jack";
|
|
case Queen: return "queen";
|
|
case King: return "king";
|
|
default: throw std::invalid_argument("Invalid Value enum value");
|
|
}
|
|
}
|
|
|
|
void PlayingCard::setValue(const PlayingCard::Value &value)
|
|
{
|
|
if (m_value == value)
|
|
return;
|
|
|
|
m_value = value;
|
|
emit valueChanged();
|
|
}
|
|
|
|
QString PlayingCard::toString() const
|
|
{
|
|
return valueString() + " of " + suitString();
|
|
}
|
|
|
|
QList<PlayingCard *> PlayingCard::createDeck()
|
|
{
|
|
QList<PlayingCard*> deck;
|
|
|
|
for (int suitIndex = PlayingCard::Suit::Clubs; suitIndex <= PlayingCard::Suit::Spades; ++suitIndex) {
|
|
for (int valueIndex = PlayingCard::Value::Ace; valueIndex <= PlayingCard::Value::King; ++valueIndex) {
|
|
PlayingCard *card = new PlayingCard();
|
|
card->setSuit(static_cast<PlayingCard::Suit>(suitIndex));
|
|
card->setValue(static_cast<PlayingCard::Value>(valueIndex));
|
|
deck.append(card);
|
|
}
|
|
}
|
|
|
|
return deck;
|
|
}
|
|
|
|
bool PlayingCard::areOppositeColors(const PlayingCard &card1, const PlayingCard &card2)
|
|
{
|
|
bool card1IsRed = (card1.suit() == Suit::Hearts || card1.suit() == Suit::Diamonds);
|
|
bool card2IsRed = (card2.suit() == Suit::Hearts || card2.suit() == Suit::Diamonds);
|
|
|
|
return card1IsRed != card2IsRed;
|
|
}
|