From 932db6050e520167d4ebc3dbf88b0d0630dfa497 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 25 Jul 2025 10:47:31 -0700 Subject: [PATCH] Initial --- Blackjack.cpp | 51 +++++++++++++++++++++++++++++++++++++++++ Blackjack.h | 37 ++++++++++++++++++++++++++++++ CMakeLists.txt | 14 ++++++++++++ Card.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ Card.h | 42 ++++++++++++++++++++++++++++++++++ Deck.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++ Deck.h | 46 +++++++++++++++++++++++++++++++++++++ GameDeck.cpp | 19 ++++++++++++++++ GameDeck.h | 20 ++++++++++++++++ main.cpp | 39 +++++++++++++++++++++++++++++++ 10 files changed, 382 insertions(+) create mode 100644 Blackjack.cpp create mode 100644 Blackjack.h create mode 100644 CMakeLists.txt create mode 100644 Card.cpp create mode 100644 Card.h create mode 100644 Deck.cpp create mode 100644 Deck.h create mode 100644 GameDeck.cpp create mode 100644 GameDeck.h create mode 100644 main.cpp diff --git a/Blackjack.cpp b/Blackjack.cpp new file mode 100644 index 0000000..7b6ac8a --- /dev/null +++ b/Blackjack.cpp @@ -0,0 +1,51 @@ +// +// Created by alex on 7/21/25. +// + +#include "Blackjack.h" + +Blackjack::Blackjack(int numDecks) : deck(numDecks) { } + + +void Blackjack::play() { + std::vector playerCards; + std::vector dealerCards; + bool playerwin=false; + bool dealerwin=false; + + //player gets 2 cards + playerCards.push_back(deck.draw()); + playerCards.push_back(deck.draw()); + displayCards(playerCards); + + //dealer gets 2 cards + dealerCards.push_back(deck.draw()); + dealerCards.push_back(deck.draw()); + displayCards(dealerCards); + + while (!playerwin && !dealerwin) { + if (sum_cards(playerCards) == 21) + playerwin=true; + if (sum_cards(dealerCards) == 21) + dealerwin=true; + + } + + + +} + + +void Blackjack::displayCards(std::vector &cards) { + for (const Card& card : cards) { + std::cout << card << std::endl; + } +} + +int Blackjack::sum_cards(std::vector &cards) { + int sum = 0; + for (const Card& card : cards) { + sum+=card.getValue(); + } + return sum; +} diff --git a/Blackjack.h b/Blackjack.h new file mode 100644 index 0000000..a991d7f --- /dev/null +++ b/Blackjack.h @@ -0,0 +1,37 @@ +// +// Created by alex on 7/21/25. +// +/* + *Game loop: + *idk bets yet + * player draws cards, displayed + * dealer draws cards, display one (add flipped to card?) + * if blackjacks, win/lose/tie + * else + * hit, stand, [LATER] DD, Split + * hit gets card and adds and checks + * if over 21, lose[OR DOES DEALER DRAW? CHECK] + * if 21, stand + * once stand commanded + * dealer begins drawing until point where it dont, or bust + * compare, get winner + */ + + +#ifndef BLACKJACK_H +#define BLACKJACK_H +#include "GameDeck.h" + + +class Blackjack { +public: + Blackjack(int numDecks); + void play(); +private: + void displayCards(std::vector &cards); + int sum_cards(std::vector &cards); + GameDeck deck; +}; + + +#endif //BLACKJACK_H diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ce2080b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 4.0) +project(Blackjack) + +set(CMAKE_CXX_STANDARD 20) + +add_executable(Blackjack main.cpp + Deck.cpp + Deck.h + Card.cpp + Card.h + GameDeck.cpp + GameDeck.h + Blackjack.cpp + Blackjack.h) diff --git a/Card.cpp b/Card.cpp new file mode 100644 index 0000000..5c34b40 --- /dev/null +++ b/Card.cpp @@ -0,0 +1,62 @@ +// +// Created by alex on 7/14/25. +// + +#include "Card.h" + +Card::Card(Suit s, Rank r) : suit(s), rank(r) { + value = static_cast(r) + 1; +} + +Suit Card::getSuit() const { + return suit; +} +Rank Card::getRank() const { + return rank; +} +int Card::getValue() const { + return value; +} + +// Getters + +// Setter for changing value to 1 for ace? + +// Overload operator<< +std::ostream& operator<<(std::ostream& os, const Card& card) { + std::string rankString; + std::string clubString; + switch (card.getRank()) { + case Rank::Ace: rankString = "Ace"; break; + case Rank::Jack: rankString = "Jack"; break; + case Rank::Queen: rankString = "Queen"; break; + case Rank::King: rankString = "King"; break; + default: rankString = std::to_string(card.getValue()); break; + } + + + switch (card.getRank()) { + case Rank::Ace: rankString = "Ace"; break; + case Rank::Two: rankString = "2"; break; + case Rank::Three: rankString = "3"; break; + case Rank::Four: rankString = "4"; break; + case Rank::Five: rankString = "5"; break; + case Rank::Six: rankString = "6"; break; + case Rank::Seven: rankString = "7"; break; + case Rank::Eight: rankString = "8"; break; + case Rank::Nine: rankString = "9"; break; + case Rank::Ten: rankString = "10"; break; + case Rank::Jack: rankString = "Jack"; break; + case Rank::Queen: rankString = "Queen"; break; + case Rank::King: rankString = "King"; break; + } + switch (card.getSuit()) { + case Suit::Clubs: clubString = "Clubs"; break; + case Suit::Diamonds: clubString = "Diamonds"; break; + case Suit::Hearts: clubString = "Hearts"; break; + case Suit::Spades: clubString = "Spades"; break; + } + os << rankString << " of " << clubString; + return os; +} + diff --git a/Card.h b/Card.h new file mode 100644 index 0000000..5aefb56 --- /dev/null +++ b/Card.h @@ -0,0 +1,42 @@ +// +// Created by alex on 7/14/25. +// + +#ifndef CARD_H +#define CARD_H +#include +#include + +enum class Suit { + Clubs, Diamonds, Hearts, Spades +}; +enum class Rank { + Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, + Ten, Jack, Queen, King +}; + + +class Card { +public: + Card(Suit s, Rank r); + // Getters + Suit getSuit() const; + Rank getRank() const; + int getValue() const; + + friend std::ostream& operator<<(std::ostream& os, const Card& card); + + // These arrays exist to store all types of cards + static std::array constexpr Suits = {Suit::Clubs, Suit::Diamonds, Suit::Hearts, Suit::Spades}; + static std::array constexpr Ranks = {Rank::Ace, Rank::Two, Rank::Three, Rank::Four, Rank::Five, Rank::Six, + Rank::Seven, Rank::Eight, Rank::Nine, Rank::Ten, Rank::Jack, Rank::Queen, Rank::King}; + +private: + Suit suit; + Rank rank; + int value; +}; + + + +#endif //CARD_H diff --git a/Deck.cpp b/Deck.cpp new file mode 100644 index 0000000..1f2b4d3 --- /dev/null +++ b/Deck.cpp @@ -0,0 +1,52 @@ +// +// Created by alex on 7/14/25. +// + +#include "Deck.h" + +Deck::Deck() : Deck(false) { } + + +Deck::Deck(bool shuffled) { + initialize_deck(); + if (shuffled) { + shuffle(); + } + cards_in_deck = deck.size(); +} + + + +void Deck::initialize_deck() { + for (auto r : Card::Ranks) { + for (auto c : Card::Suits) { + deck.emplace_back(c, r); + } + } +} +void Deck::print_deck() { + std::cout << deck.size() << std::endl; + for (auto c : deck) { + std::cout << c << std::endl; + } +} + +void Deck::shuffle() { + std::random_device rd; + std::mt19937 g(rd()); + + std::ranges::shuffle(deck, g); +} + +/** + * + * @return The card drawn from the top of the deck + */ +Card Deck::draw() { + const Card temp = deck.at(cards_in_deck - 1); + deck.pop_back(); + cards_in_deck--; + return temp; +} + + diff --git a/Deck.h b/Deck.h new file mode 100644 index 0000000..efa0deb --- /dev/null +++ b/Deck.h @@ -0,0 +1,46 @@ + +#ifndef DECK_H +#define DECK_H +#include +#include +#include +#include +#include "Card.h" + + +// Standard deck with 52 cards + +class Deck { +public: + Deck(); + + Deck(bool shuffled); + + void print_deck(); + + Card draw(); + + void shuffle(); + + auto begin() { return deck.begin(); } + + auto end() { return deck.end(); } + + // Getters + int get_num_cards() { return cards_in_deck; } +private: + void initialize_deck(); + + + +protected: + int cards_in_deck; + std::vector deck; + + + +}; + + + +#endif //DECK_H diff --git a/GameDeck.cpp b/GameDeck.cpp new file mode 100644 index 0000000..c36f9f9 --- /dev/null +++ b/GameDeck.cpp @@ -0,0 +1,19 @@ +// +// Created by alex on 7/17/25. +// + +#include "GameDeck.h" + +// THIS HAS LAZY FIX FOR DECK CONSTRUCTOR BEING CALLED + +GameDeck::GameDeck(int numDecks) { + for (int i = 1; i < numDecks; i++) { + Deck tempDeck(true); + + for (Card &c : tempDeck) { + deck.push_back(std::move(c)); + } + } + cards_in_deck = deck.size(); +} + diff --git a/GameDeck.h b/GameDeck.h new file mode 100644 index 0000000..9a827e7 --- /dev/null +++ b/GameDeck.h @@ -0,0 +1,20 @@ +// +// Created by alex on 7/17/25. +// + +#ifndef GAMEDECK_H +#define GAMEDECK_H +#include "Deck.h" + +class GameDeck : public Deck { +public: + GameDeck(int numDecks); + +private: + + +}; + + + +#endif //GAMEDECK_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..21f8dba --- /dev/null +++ b/main.cpp @@ -0,0 +1,39 @@ +#include + +#include "Blackjack.h" +#include "Card.h" +#include "Deck.h" +#include "GameDeck.h" +using namespace std; + +/* + * + * A deck class which has + * - Cards in deck in vector + * - Shuffle deck function + * - A map of cards to numerical values + * + * A Game class + * - Adds decks to game and calls their shuffles + * + * Blackjack class, not sure hierarchy yet + * - has a gamedeck + * - game() method with main loop + * - + * + * Game deck is-a deck, inherits functions, difference is constructor takes amount of decks, + * creates that many, and slaps them into one bigger deck + * +*/ + + + +int main() { + Blackjack bj(4); + bj.play(); + + + return 0; +} + +