210 lines
4.2 KiB
C++
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;
|
|
}
|