App: re-add cmakelists directive, add cardgame example

This commit is contained in:
Eero Holmala 2023-04-30 17:33:24 +03:00
parent 61b9558c47
commit a5f1298567
3 changed files with 111 additions and 1 deletions

3
App/.gitignore vendored
View File

@ -1 +1,2 @@
/build
/build
/Examples/*.exe

View File

@ -22,6 +22,7 @@ target_link_libraries(App PRIVATE
GLEW::GLEW
)
target_include_directories(App PUBLIC "${CMAKE_SOURCE_DIR}/App/include/")
target_include_directories(App PUBLIC "${CMAKE_SOURCE_DIR}/AppLib/include/AppLib")
if (CMAKE_VERSION VERSION_GREATER 3.12)

108
App/Examples/Cardgame.cpp Normal file
View File

@ -0,0 +1,108 @@
// 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;
}