monorepo/App/Examples/Cardgame.cpp

108 lines
2.2 KiB
C++

// Taken from: https://www.youtube.com/watch?v=b8V-WIjlScA
#include <iostream>
#include <vector>
#include <memory>
#include <random>
#include <ctime>
using namespace std;
enum Rank {
ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING
};
enum Suit {
HEARTS, DIAMONDS, CLUBS, SPADES
};
class Card {
public:
Card(Rank rank, Suit suit) : rank_(rank), suit_(suit) {}
Rank getRank() const { return rank_; }
Suit getSuit() const { return suit_; }
private:
Rank rank_;
Suit suit_;
};
class Deck {
public:
Deck() {
for (int suit = HEARTS; suit <= SPADES; ++suit) {
for (int rank = ACE; rank <= KING; ++rank) {
cards_.push_back(make_unique<Card>(static_cast<Rank>(rank), static_cast<Suit>(suit)));
}
}
}
void shuffledeck() {
random_device rd;
mt19937 g(rd());
shuffle(cards_.begin(), cards_.end(), g);
}
unique_ptr<Card> drawCard() {
if (cards_.empty()) {
return nullptr;
}
unique_ptr<Card> card = std::move(cards_.back());
cards_.pop_back();
return card;
}
private:
vector<unique_ptr<Card> > cards_;
};
class Player {
public:
void addCard(unique_ptr<Card> card) {
hand_.push_back(std::move(card));
}
int getHandValue() const {
int value = 0;
int aces = 0;
for (const auto& card : hand_) {
int cardValue = card->getRank();
if (cardValue >= 10) {
cardValue = 10;
} else if (cardValue == ACE) {
aces++;
cardValue = 11;
}
value += cardValue;
}
while (value > 21 && aces > 0) {
value -= 10;
aces--;
}
return value;
}
private:
vector<unique_ptr<Card> > hand_;
};
int main() {
Deck deck;
deck.shuffledeck();
Player player;
Player dealer;
player.addCard(deck.drawCard());
player.addCard(deck.drawCard());
dealer.addCard(deck.drawCard());
dealer.addCard(deck.drawCard());
cout << "Player hand value: " << player.getHandValue() << endl;
cout << "Dealer hand value: " << dealer.getHandValue() << endl;
return 0;
}