This commit is contained in:
2025-07-25 10:47:31 -07:00
commit 932db6050e
10 changed files with 382 additions and 0 deletions

51
Blackjack.cpp Normal file
View File

@@ -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<Card> playerCards;
std::vector<Card> 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<Card> &cards) {
for (const Card& card : cards) {
std::cout << card << std::endl;
}
}
int Blackjack::sum_cards(std::vector<Card> &cards) {
int sum = 0;
for (const Card& card : cards) {
sum+=card.getValue();
}
return sum;
}

37
Blackjack.h Normal file
View File

@@ -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<Card> &cards);
int sum_cards(std::vector<Card> &cards);
GameDeck deck;
};
#endif //BLACKJACK_H

14
CMakeLists.txt Normal file
View File

@@ -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)

62
Card.cpp Normal file
View File

@@ -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<int>(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;
}

42
Card.h Normal file
View File

@@ -0,0 +1,42 @@
//
// Created by alex on 7/14/25.
//
#ifndef CARD_H
#define CARD_H
#include <array>
#include <iostream>
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<Suit, 4> constexpr Suits = {Suit::Clubs, Suit::Diamonds, Suit::Hearts, Suit::Spades};
static std::array<Rank, 13> 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

52
Deck.cpp Normal file
View File

@@ -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;
}

46
Deck.h Normal file
View File

@@ -0,0 +1,46 @@
#ifndef DECK_H
#define DECK_H
#include <random>
#include <algorithm>
#include <iterator>
#include <vector>
#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<Card> deck;
};
#endif //DECK_H

19
GameDeck.cpp Normal file
View File

@@ -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();
}

20
GameDeck.h Normal file
View File

@@ -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

39
main.cpp Normal file
View File

@@ -0,0 +1,39 @@
#include <iostream>
#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;
}