| flat_bet = 1 | |||||
| # flat_bet = 1 | |||||
| # max_bet = 2 | # max_bet = 2 | ||||
| arranged_cards = 2,4,11,1,7 | |||||
| arranged_cards = 9,8,13,12 | |||||
| delay = 0 | |||||
| DealerBlackjack, | DealerBlackjack, | ||||
| PlayerWinsInsurance, | PlayerWinsInsurance, | ||||
| PlayerBlackjackAlso, | PlayerBlackjackAlso, | ||||
| PlayerNextHand, | |||||
| PlayerPushes, | PlayerPushes, | ||||
| PlayerLosses, | PlayerLosses, | ||||
| PlayerBlackjack, | PlayerBlackjack, | ||||
| std::string singleUTF8; | std::string singleUTF8; | ||||
| }; | }; | ||||
| // TODO: static inside a class | |||||
| extern Card card[52]; | |||||
| // TODO: class static? which class? | |||||
| extern Card card[53]; | |||||
| class Hand { | class Hand { | ||||
| public: | public: | ||||
| unsigned int losses = 0; | unsigned int losses = 0; | ||||
| // TODO: blackjack_pushes? | // TODO: blackjack_pushes? | ||||
| unsigned int flat_bet = 1; | |||||
| unsigned int flat_bet = 0; | |||||
| bool no_insurance = false; | bool no_insurance = false; | ||||
| bool always_insure = false; | bool always_insure = false; | ||||
| virtual void deal(Player *) = 0; | virtual void deal(Player *) = 0; | ||||
| virtual unsigned int drawCard(Hand * = nullptr) = 0; | virtual unsigned int drawCard(Hand * = nullptr) = 0; | ||||
| virtual int process(Player *) = 0; | virtual int process(Player *) = 0; | ||||
| /* | |||||
| void setNextAction(DealerAction a) { | |||||
| next_action = a; | |||||
| } | |||||
| void getNextAction(DealerAction a) { | |||||
| next_action = a; | |||||
| } | |||||
| */ | |||||
| bool finished(void) { | bool finished(void) { | ||||
| return done; | return done; | ||||
| } | } |
| #include "blackjack.h" | #include "blackjack.h" | ||||
| Blackjack::Blackjack(Configuration &conf) : rng(dev_random()), fiftyTwoCards(0, 51) { | |||||
| Blackjack::Blackjack(Configuration &conf) : rng(dev_random()), fiftyTwoCards(1, 52) { | |||||
| conf.set(&n_hands, {"n_hands", "hands"}); | conf.set(&n_hands, {"n_hands", "hands"}); | ||||
| conf.set(&n_decks, {"decks", "n_decks"}); | conf.set(&n_decks, {"decks", "n_decks"}); | ||||
| // state that the player did not win anything nor splitted nor doubled down | // state that the player did not win anything nor splitted nor doubled down | ||||
| player->current_result = 0; | player->current_result = 0; | ||||
| player->currentSplits = 0; | player->currentSplits = 0; | ||||
| // player->hasDoubled = 0; | |||||
| if (lastPass) { | if (lastPass) { | ||||
| player->info(Info::Shuffle); | player->info(Info::Shuffle); | ||||
| if (player->flat_bet) { | if (player->flat_bet) { | ||||
| player->currentHand->bet = player->flat_bet; | player->currentHand->bet = player->flat_bet; | ||||
| player->actionRequired = PlayerActionRequired::None; | |||||
| nextAction = DealerAction::DealPlayerFirstCard; | nextAction = DealerAction::DealPlayerFirstCard; | ||||
| } else { | } else { | ||||
| player->actionRequired = PlayerActionRequired::Bet; | |||||
| nextAction = DealerAction::AskForBets; | nextAction = DealerAction::AskForBets; | ||||
| } | } | ||||
| player->info(Info::NewHand, player->bankroll); | player->info(Info::NewHand, player->bankroll); | ||||
| // deal a card to the first hand | // deal a card to the first hand | ||||
| playerCard = drawCard(&(*player->currentHand)); | playerCard = drawCard(&(*player->currentHand)); | ||||
| std::cout << "card_player_second " << card[playerCard].utf8() << std::endl; | |||||
| player->info(Info::CardPlayer, playerCard); | |||||
| // aces get dealt only one card | // aces get dealt only one card | ||||
| // also, if the player gets 21 then we move on to the next hand | // also, if the player gets 21 then we move on to the next hand | ||||
| if (card[*player->currentHand->cards.begin()].value == 11 || std::abs(player->currentHand->total()) == 21) { | if (card[*player->currentHand->cards.begin()].value == 11 || std::abs(player->currentHand->total()) == 21) { | ||||
| if (++player->currentHand != player->hands.end()) { | if (++player->currentHand != player->hands.end()) { | ||||
| player->info(Info::PlayerNextHand, (*player->currentHand).id); | |||||
| playerCard = drawCard(&(*player->currentHand)); | playerCard = drawCard(&(*player->currentHand)); | ||||
| std::cout << "card_player_second " << card[playerCard].utf8() << std::endl; | |||||
| player->info(Info::CardPlayer, playerCard); | |||||
| // if the player got an ace or 21 again, we are done | // if the player got an ace or 21 again, we are done | ||||
| if (card[*player->currentHand->cards.begin()].value == 11 || std::abs(player->currentHand->total()) == 21) { | if (card[*player->currentHand->cards.begin()].value == 11 || std::abs(player->currentHand->total()) == 21) { | ||||
| if (n_decks == -1) { | if (n_decks == -1) { | ||||
| if (n_arranged_cards != 0 && i_arranged_cards < n_arranged_cards) { | if (n_arranged_cards != 0 && i_arranged_cards < n_arranged_cards) { | ||||
| // negative (or invalid) values are placeholder for random cards | // negative (or invalid) values are placeholder for random cards | ||||
| if ((tag = arranged_cards[i_arranged_cards++]) < 0 || tag > 51) { | |||||
| if ((tag = arranged_cards[i_arranged_cards++]) <= 0 || tag > 52) { | |||||
| tag = fiftyTwoCards(rng); | tag = fiftyTwoCards(rng); | ||||
| } | } | ||||
| } else { | } else { |
| static std::string numbers[14] = {"", "ace", "deuce", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king"}; | static std::string numbers[14] = {"", "ace", "deuce", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king"}; | ||||
| Card::Card(unsigned int tag) { | Card::Card(unsigned int tag) { | ||||
| number = 1 + (tag % 13); | |||||
| suit = static_cast<Suit>(tag/13); | |||||
| if (tag <= 0 || tag > 52) { | |||||
| return; | |||||
| } | |||||
| number = 1 + ((tag-1) % 13); | |||||
| suit = static_cast<Suit>((tag-1)/13); | |||||
| value = (number == 1) ? 11 : ((number > 10) ? 10 : number); | value = (number == 1) ? 11 : ((number > 10) ? 10 : number); | ||||
| numberASCII = (number == 1) ? "A" : ((number < 11) ? std::to_string(number) : TJQK[number-10]); | numberASCII = (number == 1) ? "A" : ((number < 11) ? std::to_string(number) : TJQK[number-10]); | ||||
| // it would be hacky but hard to understand for humans | // it would be hacky but hard to understand for humans | ||||
| // UNIX rule of representation! | // UNIX rule of representation! | ||||
| switch(tag) { | switch(tag) { | ||||
| case 0: singleUTF8 = "🃑"; break; | |||||
| case 1: singleUTF8 = "🃒"; break; | |||||
| case 2: singleUTF8 = "🃓"; break; | |||||
| case 3: singleUTF8 = "🃔"; break; | |||||
| case 4: singleUTF8 = "🃕"; break; | |||||
| case 5: singleUTF8 = "🃖"; break; | |||||
| case 6: singleUTF8 = "🃗"; break; | |||||
| case 7: singleUTF8 = "🃘"; break; | |||||
| case 8: singleUTF8 = "🃙"; break; | |||||
| case 9: singleUTF8 = "🃚"; break; | |||||
| case 10: singleUTF8 = "🃛"; break; | |||||
| case 11: singleUTF8 = "🃝"; break; | |||||
| case 12: singleUTF8 = "🃞"; break; | |||||
| case 1: singleUTF8 = "🃑"; break; | |||||
| case 2: singleUTF8 = "🃒"; break; | |||||
| case 3: singleUTF8 = "🃓"; break; | |||||
| case 4: singleUTF8 = "🃔"; break; | |||||
| case 5: singleUTF8 = "🃕"; break; | |||||
| case 6: singleUTF8 = "🃖"; break; | |||||
| case 7: singleUTF8 = "🃗"; break; | |||||
| case 8: singleUTF8 = "🃘"; break; | |||||
| case 9: singleUTF8 = "🃙"; break; | |||||
| case 10: singleUTF8 = "🃚"; break; | |||||
| case 11: singleUTF8 = "🃛"; break; | |||||
| case 12: singleUTF8 = "🃝"; break; | |||||
| case 13: singleUTF8 = "🃞"; break; | |||||
| case 13: singleUTF8 = "🃁"; break; | |||||
| case 14: singleUTF8 = "🃂"; break; | |||||
| case 15: singleUTF8 = "🃃"; break; | |||||
| case 16: singleUTF8 = "🃄"; break; | |||||
| case 17: singleUTF8 = "🃅"; break; | |||||
| case 18: singleUTF8 = "🃆"; break; | |||||
| case 19: singleUTF8 = "🃇"; break; | |||||
| case 20: singleUTF8 = "🃈"; break; | |||||
| case 21: singleUTF8 = "🃉"; break; | |||||
| case 22: singleUTF8 = "🃊"; break; | |||||
| case 23: singleUTF8 = "🃋"; break; | |||||
| case 24: singleUTF8 = "🃍"; break; | |||||
| case 14: singleUTF8 = "🃁"; break; | |||||
| case 15: singleUTF8 = "🃂"; break; | |||||
| case 16: singleUTF8 = "🃃"; break; | |||||
| case 17: singleUTF8 = "🃄"; break; | |||||
| case 18: singleUTF8 = "🃅"; break; | |||||
| case 19: singleUTF8 = "🃆"; break; | |||||
| case 20: singleUTF8 = "🃇"; break; | |||||
| case 21: singleUTF8 = "🃈"; break; | |||||
| case 22: singleUTF8 = "🃉"; break; | |||||
| case 23: singleUTF8 = "🃊"; break; | |||||
| case 24: singleUTF8 = "🃋"; break; | |||||
| case 25: singleUTF8 = "🃍"; break; | case 25: singleUTF8 = "🃍"; break; | ||||
| case 26: singleUTF8 = "🃍"; break; | |||||
| case 26: singleUTF8 = "🂱"; break; | |||||
| case 27: singleUTF8 = "🂲"; break; | |||||
| case 28: singleUTF8 = "🂳"; break; | |||||
| case 29: singleUTF8 = "🂴"; break; | |||||
| case 30: singleUTF8 = "🂵"; break; | |||||
| case 31: singleUTF8 = "🂶"; break; | |||||
| case 32: singleUTF8 = "🂷"; break; | |||||
| case 33: singleUTF8 = "🂸"; break; | |||||
| case 34: singleUTF8 = "🂹"; break; | |||||
| case 35: singleUTF8 = "🂺"; break; | |||||
| case 36: singleUTF8 = "🂻"; break; | |||||
| case 37: singleUTF8 = "🂽"; break; | |||||
| case 38: singleUTF8 = "🂾"; break; | |||||
| case 27: singleUTF8 = "🂱"; break; | |||||
| case 28: singleUTF8 = "🂲"; break; | |||||
| case 29: singleUTF8 = "🂳"; break; | |||||
| case 30: singleUTF8 = "🂴"; break; | |||||
| case 31: singleUTF8 = "🂵"; break; | |||||
| case 32: singleUTF8 = "🂶"; break; | |||||
| case 33: singleUTF8 = "🂷"; break; | |||||
| case 34: singleUTF8 = "🂸"; break; | |||||
| case 35: singleUTF8 = "🂹"; break; | |||||
| case 36: singleUTF8 = "🂺"; break; | |||||
| case 37: singleUTF8 = "🂻"; break; | |||||
| case 38: singleUTF8 = "🂽"; break; | |||||
| case 39: singleUTF8 = "🂾"; break; | |||||
| case 39: singleUTF8 = "🂡"; break; | |||||
| case 40: singleUTF8 = "🂢"; break; | |||||
| case 41: singleUTF8 = "🂣"; break; | |||||
| case 42: singleUTF8 = "🂤"; break; | |||||
| case 43: singleUTF8 = "🂥"; break; | |||||
| case 44: singleUTF8 = "🂦"; break; | |||||
| case 45: singleUTF8 = "🂧"; break; | |||||
| case 46: singleUTF8 = "🂨"; break; | |||||
| case 47: singleUTF8 = "🂩"; break; | |||||
| case 48: singleUTF8 = "🂪"; break; | |||||
| case 49: singleUTF8 = "🂫"; break; | |||||
| case 50: singleUTF8 = "🂭"; break; | |||||
| case 51: singleUTF8 = "🂮"; break; | |||||
| case 40: singleUTF8 = "🂡"; break; | |||||
| case 41: singleUTF8 = "🂢"; break; | |||||
| case 42: singleUTF8 = "🂣"; break; | |||||
| case 43: singleUTF8 = "🂤"; break; | |||||
| case 44: singleUTF8 = "🂥"; break; | |||||
| case 45: singleUTF8 = "🂦"; break; | |||||
| case 46: singleUTF8 = "🂧"; break; | |||||
| case 47: singleUTF8 = "🂨"; break; | |||||
| case 48: singleUTF8 = "🂩"; break; | |||||
| case 49: singleUTF8 = "🂪"; break; | |||||
| case 50: singleUTF8 = "🂫"; break; | |||||
| case 51: singleUTF8 = "🂭"; break; | |||||
| case 52: singleUTF8 = "🂮"; break; | |||||
| } | } | ||||
| }; | }; | ||||
| return numbers[number] + " of " + suitName; | return numbers[number] + " of " + suitName; | ||||
| } | } | ||||
| Card card[52] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, | |||||
| 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, | |||||
| 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, | |||||
| 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51}; | |||||
| Card card[53] = { 0, | |||||
| 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, | |||||
| 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, | |||||
| 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, | |||||
| 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52}; |
| if (optarg != NULL) { | if (optarg != NULL) { | ||||
| data["flat_bet"] = optarg; | data["flat_bet"] = optarg; | ||||
| } else { | } else { | ||||
| data["flat_bet"] = "1"; | |||||
| data["flat_bet"] = "yes"; | |||||
| } | } | ||||
| break; | break; | ||||
| case '?': | case '?': |
| #include <thread> | #include <thread> | ||||
| #include <chrono> | #include <chrono> | ||||
| #include <algorithm> | |||||
| #include <functional> | |||||
| #include <cctype> | |||||
| #include <locale> | |||||
| #ifdef HAVE_LIBREADLINE | #ifdef HAVE_LIBREADLINE | ||||
| #include <readline/readline.h> | #include <readline/readline.h> | ||||
| #include <readline/history.h> | #include <readline/history.h> | ||||
| std::vector<std::string> commands; | std::vector<std::string> commands; | ||||
| // trim from start (in place) | |||||
| static inline void ltrim(std::string &s) { | |||||
| s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { | |||||
| return !std::isspace(ch); | |||||
| })); | |||||
| } | |||||
| // trim from end (in place) | |||||
| static inline void rtrim(std::string &s) { | |||||
| s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { | |||||
| return !std::isspace(ch); | |||||
| }).base(), s.end()); | |||||
| } | |||||
| // trim from both ends (in place) | |||||
| static inline void trim(std::string &s) { | |||||
| ltrim(s); | |||||
| rtrim(s); | |||||
| } | |||||
| Tty::Tty(Configuration &conf) { | Tty::Tty(Configuration &conf) { | ||||
| Libreblackjack::shortversion(); | Libreblackjack::shortversion(); | ||||
| conf.set(&flat_bet, {"flat_bet", "flatbet"}); | conf.set(&flat_bet, {"flat_bet", "flatbet"}); | ||||
| conf.set(&no_insurance, {"no_insurance", "dont_insure"}); | conf.set(&no_insurance, {"no_insurance", "dont_insure"}); | ||||
| conf.set(&delay, {"delay"}); | |||||
| if (commands.size() == 0) { | if (commands.size() == 0) { | ||||
| // commands.push_back("help"); | // commands.push_back("help"); | ||||
| return; | return; | ||||
| } | } | ||||
| void Tty::info(Info msg, int intData) { | |||||
| void Tty::info(Info msg, int p) { | |||||
| std::string s; | std::string s; | ||||
| // TODO: choose utf8 or other representation | // TODO: choose utf8 or other representation | ||||
| switch (msg) { | switch (msg) { | ||||
| case Info::InvalidBet: | case Info::InvalidBet: | ||||
| if (intData < 0) { | |||||
| if (p < 0) { | |||||
| // s = "bet_negative"; | // s = "bet_negative"; | ||||
| s = "Your bet is negative (" + std::to_string(intData) + ")"; | |||||
| } else if (intData > 0) { | |||||
| s = "Your bet is negative (" + std::to_string(p) + ")"; | |||||
| } else if (p > 0) { | |||||
| // s = "bet_maximum"; | // s = "bet_maximum"; | ||||
| s = "Your bet is larger than the maximum allowed (" + std::to_string(intData) + ")"; | |||||
| s = "Your bet is larger than the maximum allowed (" + std::to_string(p) + ")"; | |||||
| } else { | } else { | ||||
| // s = "bet_zero"; | // s = "bet_zero"; | ||||
| s = "Your bet is zero"; | s = "Your bet is zero"; | ||||
| case Info::NewHand: | case Info::NewHand: | ||||
| // s = "new_hand"; | // s = "new_hand"; | ||||
| std::cout << std::endl; | std::cout << std::endl; | ||||
| s = "Starting new hand, bankroll " + std::to_string(intData); | |||||
| s = "Starting new hand, bankroll " + std::to_string(p); | |||||
| dealerHand.cards.clear(); | dealerHand.cards.clear(); | ||||
| break; | break; | ||||
| switch (currentHand->cards.size()) { | switch (currentHand->cards.size()) { | ||||
| case 1: | case 1: | ||||
| // s = "card_player_first"; | // s = "card_player_first"; | ||||
| s = "Player's first card is " + card[intData].utf8(); | |||||
| s = "Player's first card is " + card[p].utf8(); | |||||
| break; | break; | ||||
| case 2: | case 2: | ||||
| // s = "card_player_second"; | // s = "card_player_second"; | ||||
| s = "Player's second card is " + card[intData].utf8(); | |||||
| s = "Player's second card is " + card[p].utf8(); | |||||
| break; | break; | ||||
| default: | default: | ||||
| // s = "card_player"; | // s = "card_player"; | ||||
| s = "Player's card is " + card[intData].utf8(); | |||||
| s = "Player's card is " + card[p].utf8(); | |||||
| break; | break; | ||||
| } | } | ||||
| break; | break; | ||||
| case Info::CardDealer: | case Info::CardDealer: | ||||
| if (intData != -1) { | |||||
| if (p != -1) { | |||||
| switch (dealerHand.cards.size()) { | switch (dealerHand.cards.size()) { | ||||
| case 0: | case 0: | ||||
| // s = "card_dealer_up"; | // s = "card_dealer_up"; | ||||
| s = "Dealer's up card is " + card[intData].utf8(); | |||||
| s = "Dealer's up card is " + card[p].utf8(); | |||||
| break; | break; | ||||
| default: | default: | ||||
| // s = "card_dealer"; | // s = "card_dealer"; | ||||
| s = "Dealer's card is " + card[intData].utf8(); | |||||
| s = "Dealer's card is " + card[p].utf8(); | |||||
| break; | break; | ||||
| } | } | ||||
| } else { | } else { | ||||
| s = "Dealer's hole card is dealt"; | s = "Dealer's hole card is dealt"; | ||||
| } | } | ||||
| dealerHand.cards.push_back(intData); | |||||
| dealerHand.cards.push_back(p); | |||||
| break; | break; | ||||
| case Info::CardDealerRevealsHole: | case Info::CardDealerRevealsHole: | ||||
| // s = "card_dealer_hole"; | // s = "card_dealer_hole"; | ||||
| s = "Dealer's hole card was " + card[intData].utf8(); | |||||
| *(++(dealerHand.cards.begin())) = intData; | |||||
| s = "Dealer's hole card was " + card[p].utf8(); | |||||
| *(++(dealerHand.cards.begin())) = p; | |||||
| // renderTable(); | // renderTable(); | ||||
| break; | break; | ||||
| s = "Player also has Blackjack"; | s = "Player also has Blackjack"; | ||||
| renderTable(); | renderTable(); | ||||
| break; | break; | ||||
| case Info::PlayerNextHand: | |||||
| // s = "player_pushes"; | |||||
| s = "Playing next hand #" + std::to_string(p); | |||||
| renderTable(); | |||||
| break; | |||||
| case Info::PlayerPushes: | case Info::PlayerPushes: | ||||
| // s = "player_pushes"; | // s = "player_pushes"; | ||||
| break; | break; | ||||
| case Info::PlayerWins: | case Info::PlayerWins: | ||||
| // s = "player_wins"; | // s = "player_wins"; | ||||
| s = "Player wins " + std::to_string(intData); | |||||
| s = "Player wins " + std::to_string(p); | |||||
| renderTable(); | renderTable(); | ||||
| break; | break; | ||||
| std::cout << " -- Dealer's hand: --------" << std::endl; | std::cout << " -- Dealer's hand: --------" << std::endl; | ||||
| renderHand(&dealerHand); | renderHand(&dealerHand); | ||||
| std::cout << " Total: " << dealerHand.total() << std::endl; | |||||
| std::cout << " Total: " << ((dealerHand.total() < 0)?"soft ":"") << std::abs(dealerHand.total()) << std::endl; | |||||
| std::cout << " -- Player's hand --------" << std::endl; | std::cout << " -- Player's hand --------" << std::endl; | ||||
| for (auto hand : hands) { | for (auto hand : hands) { | ||||
| renderHand(&hand); | renderHand(&hand); | ||||
| std::cout << " Total: " << hand.total() << std::endl; | |||||
| std::cout << " Total: " << ((hand.total() < 0)?"soft ":"") << std::abs(hand.total()) << std::endl; | |||||
| } | } | ||||
| return; | return; |
| #ifndef TTY_H | #ifndef TTY_H | ||||
| #define TTY_H | #define TTY_H | ||||
| #include <algorithm> | |||||
| #include <functional> | |||||
| #include <cctype> | |||||
| #include <locale> | |||||
| #include "blackjack.h" | #include "blackjack.h" | ||||
| extern std::vector<std::string> commands; | extern std::vector<std::string> commands; | ||||
| std::string cyan; | std::string cyan; | ||||
| std::string white; | std::string white; | ||||
| std::string reset; | std::string reset; | ||||
| inline void ltrim(std::string &s) { | |||||
| s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); | |||||
| }; | |||||
| inline void rtrim(std::string &s) { | |||||
| s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), s.end()); | |||||
| }; | |||||
| inline void trim(std::string &s) { ltrim(s); rtrim(s); }; | |||||
| }; | }; | ||||
| #endif | #endif |
| std::cout << "LibreBlackjack "; | std::cout << "LibreBlackjack "; | ||||
| #ifdef LIBREBLACKJACK_VCS_BRANCH | #ifdef LIBREBLACKJACK_VCS_BRANCH | ||||
| std::cout << LIBREBLACKJACK_VCS_VERSION << ((LIBREBLACKJACK_VCS_CLEAN == 0) ? "" : "+Δ") << ((strcmp(LIBREBLACKJACK_VCS_BRANCH, "master") == 0) ? LIBREBLACKJACK_VCS_BRANCH : "") << std::endl; | |||||
| std::cout << LIBREBLACKJACK_VCS_VERSION << ((LIBREBLACKJACK_VCS_CLEAN == 0) ? "" : "+Δ") << ((strcmp(LIBREBLACKJACK_VCS_BRANCH, "master")) ? LIBREBLACKJACK_VCS_BRANCH : "") << std::endl; | |||||
| #else | #else | ||||
| std::cout << PACKAGE_VERSION << std::endl; | std::cout << PACKAGE_VERSION << std::endl; | ||||
| #endif | #endif |