Files
Blackjack-Cli/main.cpp
2026-03-13 13:21:31 +01:00

210 lines
4.2 KiB
C++

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <chrono>
#include <thread>
int ran(int num0, int num1) {
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist(num0, num1);
return dist(rng);
}
int addScore(std::vector<char>&deck);
std::vector<char> playerCards = {};
std::vector<char> dealerCards = {};
int playerscore = addScore(playerCards);
int dealerScore = addScore(dealerCards);
// Club
// Dimon
// <3
// Shovels
std::vector<std::vector<char>> 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<std::vector<char>> emptyDeck = {{},{},{},{}};
std::vector<std::vector<char>> currentDeck = fullDeck;
int cardsleft(std::vector<std::vector<char>>& deck){
return deck[0].size()+deck[1].size()+deck[2].size()+deck[3].size();
}
// usage: playerscore = addScore(playerCards);
int addScore(std::vector<char>& 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<char>& 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<char>& 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;
}