#include #include #include #include #include #include #include int ran(int num0, int num1) { std::random_device dev; std::mt19937 rng(dev()); std::uniform_int_distribution dist(num0, num1); return dist(rng); } int addScore(std::vector&deck); std::vector playerCards = {}; std::vector dealerCards = {}; int playerscore = addScore(playerCards); int dealerScore = addScore(dealerCards); // Club // Dimon // <3 // Shovels std::vector> fullDeck = { { '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'A', 'J', 'K', 'Q', }, { '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'A', 'J', 'K', 'Q', }, { '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'A', 'J', 'K', 'Q', }, { '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'A', 'J', 'K', 'Q', }, }; std::vector> emptyDeck = {{},{},{},{}}; std::vector> currentDeck = fullDeck; int cardsleft(std::vector>& deck){ return deck[0].size()+deck[1].size()+deck[2].size()+deck[3].size(); } // usage: playerscore = addScore(playerCards); int addScore(std::vector& deck) { int out = 0; bool ac = false; for (int i = 0; i < deck.size(); i++) { if (deck[i] == 'A') { ac = true; out++; }else if(deck[i] == 'X' || deck[i] == 'J' || deck[i] == 'Q' || deck[i] == 'K'){ out += 10; }else{ out += deck[i] - '0'; } } return (ac && (out <= 11)) ? out + 10 : out; } void addCard(std::vector& deck) { int cate = ran(0, 3); if (currentDeck[cate].empty()) { addCard(deck); return; } int ca = ran(0, currentDeck[cate].size() - 1); deck.push_back(currentDeck[cate][ca]); currentDeck[cate].erase(currentDeck[cate].begin() + ca); } // usage: cardsAvail(deck, score): num void cardsAvail(std::vector& deck, int& score) { if (currentDeck == emptyDeck) { // Reshuffle currentDeck = fullDeck; } addCard(deck); score = addScore(deck); } void dealerLogic() { if (playerscore > 21) { cardsAvail(dealerCards, dealerScore); return; } while(dealerScore < 17){ cardsAvail(dealerCards, dealerScore); } } void status() { std::system("clear"); std::cout << "Welcome to Blackjack!\n\nTo exit type: " "[0] [q] [quit] [exit]"; std::cout << "\n----------------\n"; std::cout << " Decksize: " << cardsleft(currentDeck); std::cout << "\n----------------"; //std::cout << "\nSize P: " << playerCards.size(); std::cout << "\nPlayer: " << addScore(playerCards); //std::cout << "\nSize D: " << dealerCards.size(); std::cout << "\nDealer: " << addScore(dealerCards) << ((dealerCards.size() == 1) ? " + ?\n" : "\n"); } int main() { using namespace std::this_thread; using namespace std::chrono_literals; using std::chrono::system_clock; cardsAvail(dealerCards, dealerScore); cardsAvail(playerCards, playerscore); cardsAvail(playerCards, playerscore); std::string inp; status(); while (inp != "q" && inp != "0" && inp != "quit" && inp != "exit") { if (playerscore == 21 && dealerCards.size() == 1) { inp = "q"; status(); std::cout << "!!!BLACKJACK!!!\n"; } else { std::cout << "[1]Hit or [2]Stand?\n"; std::getline(std::cin, inp); } if (inp == "hit" || inp == "1") { cardsAvail(playerCards, playerscore); if (playerscore > 21) { dealerLogic(); inp = "q"; std::cout << "los\n"; } status(); } else if (inp == "stand" || inp == "2"){ dealerLogic(); status(); if (playerscore <= 21 && playerscore > dealerScore) { std::cout << "win\n"; } else if (dealerScore <= 21 && playerscore < dealerScore) { std::cout << "lose\n"; } else if (dealerScore <= 21 && dealerScore == playerscore) { std::cout << "push\n"; } inp = "q"; }else if(inp != "q"){ status(); } // sleep_for(5s); //std::getline(std::cin, inp); } //std::cout << std::endl; }