commit 932db6050e520167d4ebc3dbf88b0d0630dfa497 Author: Alex Date: Fri Jul 25 10:47:31 2025 -0700 Initial 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; +} + +