gtheler 5 лет назад
Родитель
Сommit
a19e0f0144
5 измененных файлов: 33 добавлений и 10 удалений
  1. +2
    -2
      blackjack.conf
  2. +1
    -0
      src/base.h
  3. +11
    -1
      src/blackjack.cpp
  4. +2
    -2
      src/internal.cpp
  5. +17
    -5
      src/tty.cpp

+ 2
- 2
blackjack.conf Просмотреть файл

flat_bet = 1 flat_bet = 1
no_insurance = true no_insurance = true
; delay = 0
arranged_cards = 1,1,10,5
delay = 0
arranged_cards = 2,1,11
; rng_seed = 1 ; rng_seed = 1

+ 1
- 0
src/base.h Просмотреть файл

}; };


template <typename ... Args> std::string string_format( const std::string& format, Args ... args); template <typename ... Args> std::string string_format( const std::string& format, Args ... args);
template <typename ... Args> std::string string_format2( const std::string& format, Args ... args);


#endif #endif

+ 11
- 1
src/blackjack.cpp Просмотреть файл

} }


info(Libreblackjack::Info::NewHand, n_hand, 1e3*playerStats.bankroll); info(Libreblackjack::Info::NewHand, n_hand, 1e3*playerStats.bankroll);
// std::cout << "new hand #" << n_hand << std::endl;
if (player->flat_bet) { if (player->flat_bet) {
// step 3. deal the first card to each player // step 3. deal the first card to each player
playerFirstCard = drawCard(&(*playerStats.currentHand)); playerFirstCard = drawCard(&(*playerStats.currentHand));
info(Libreblackjack::Info::CardPlayer, playerFirstCard); info(Libreblackjack::Info::CardPlayer, playerFirstCard);
// std::cout << "first card " << card[playerFirstCard].utf8() << std::endl;
// step 4. show dealer's upcard // step 4. show dealer's upcard
upCard = drawCard(&hand); upCard = drawCard(&hand);
info(Libreblackjack::Info::CardDealer, upCard); info(Libreblackjack::Info::CardDealer, upCard);
// std::cout << "up card " << card[upCard].utf8() << std::endl;
player->dealerValue = hand.value(); player->dealerValue = hand.value();


// step 5. deal the second card to each player // step 5. deal the second card to each player
playerSecondCard = drawCard(&(*playerStats.currentHand)); playerSecondCard = drawCard(&(*playerStats.currentHand));
info(Libreblackjack::Info::CardPlayer, playerSecondCard); info(Libreblackjack::Info::CardPlayer, playerSecondCard);
player->playerValue = playerStats.currentHand->value();
// std::cout << "second card " << card[playerSecondCard].utf8() << std::endl;
// step 6. deal the dealer's hole card // step 6. deal the dealer's hole card
holeCard = drawCard(&hand); holeCard = drawCard(&hand);
} }
// step 7.b. if either the dealer or the player has a chance to have a blackjack, check // step 7.b. if either the dealer or the player has a chance to have a blackjack, check
player->playerValue = playerStats.currentHand->value();
if ((card[upCard].value == 10 || card[upCard].value == 11) || std::abs(player->playerValue) == 21) { if ((card[upCard].value == 10 || card[upCard].value == 11) || std::abs(player->playerValue) == 21) {
player->actionRequired = Libreblackjack::PlayerActionRequired::None; player->actionRequired = Libreblackjack::PlayerActionRequired::None;
nextAction = Libreblackjack::DealerAction::CheckforBlackjacks; nextAction = Libreblackjack::DealerAction::CheckforBlackjacks;
if (hand.blackjack()) { if (hand.blackjack()) {
info(Libreblackjack::Info::CardDealerRevealsHole, holeCard); info(Libreblackjack::Info::CardDealerRevealsHole, holeCard);
info(Libreblackjack::Info::DealerBlackjack); info(Libreblackjack::Info::DealerBlackjack);
// std::cout << "dealer blakjack " << card[holeCard].utf8() << std::endl;
playerStats.blackjacksDealer++; playerStats.blackjacksDealer++;


if (playerStats.currentHand->insured) { if (playerStats.currentHand->insured) {


if (playerBlackjack) { if (playerBlackjack) {
info(Libreblackjack::Info::PlayerBlackjackAlso); info(Libreblackjack::Info::PlayerBlackjackAlso);
// std::cout << "both blackjack " << card[holeCard].utf8() << std::endl;


// give him his (her her) money back // give him his (her her) money back
playerStats.bankroll += playerStats.currentHand->bet; playerStats.bankroll += playerStats.currentHand->bet;
unsigned int playerCard = drawCard(&(*playerStats.currentHand)); unsigned int playerCard = drawCard(&(*playerStats.currentHand));
player->playerValue = playerStats.currentHand->value(); player->playerValue = playerStats.currentHand->value();
info(Libreblackjack::Info::CardPlayer, playerCard, playerStats.currentHand->id); info(Libreblackjack::Info::CardPlayer, playerCard, playerStats.currentHand->id);
// std::cout << "card player " << card[playerCard].utf8() << std::endl;


if (std::abs(player->playerValue) == 21) { if (std::abs(player->playerValue) == 21) {
player->actionRequired = Libreblackjack::PlayerActionRequired::None; player->actionRequired = Libreblackjack::PlayerActionRequired::None;


if (bustedAllHands) { if (bustedAllHands) {
info(Libreblackjack::Info::CardDealerRevealsHole, holeCard); info(Libreblackjack::Info::CardDealerRevealsHole, holeCard);
// std::cout << "hole " << card[holeCard].utf8() << std::endl;
player->actionRequired = Libreblackjack::PlayerActionRequired::None; player->actionRequired = Libreblackjack::PlayerActionRequired::None;
nextAction = Libreblackjack::DealerAction::StartNewHand; nextAction = Libreblackjack::DealerAction::StartNewHand;
case Libreblackjack::DealerAction::HitDealerHand: case Libreblackjack::DealerAction::HitDealerHand:
info(Libreblackjack::Info::CardDealerRevealsHole, holeCard); info(Libreblackjack::Info::CardDealerRevealsHole, holeCard);
// std::cout << "hole " << card[holeCard].utf8() << std::endl;


// hit while count is less than 17 (or equal to soft 17 if hit_soft_17 is true) // hit while count is less than 17 (or equal to soft 17 if hit_soft_17 is true)
player->dealerValue = hand.value(); player->dealerValue = hand.value();
while ((std::abs(player->dealerValue) < 17 || (hit_soft_17 && player->dealerValue == -17)) && hand.busted() == 0) { while ((std::abs(player->dealerValue) < 17 || (hit_soft_17 && player->dealerValue == -17)) && hand.busted() == 0) {
unsigned int dealerCard = drawCard(&hand); unsigned int dealerCard = drawCard(&hand);
info(Libreblackjack::Info::CardDealer, dealerCard); info(Libreblackjack::Info::CardDealer, dealerCard);
// std::cout << "dealer " << card[dealerCard].utf8() << std::endl;
player->dealerValue = hand.value(); player->dealerValue = hand.value();
} }

+ 2
- 2
src/internal.cpp Просмотреть файл

case Libreblackjack::PlayerActionRequired::Play: case Libreblackjack::PlayerActionRequired::Play:


std::cout << "player " << playerValue << " dealer " << dealerValue << std::endl;
// std::cout << "player " << playerValue << " dealer " << dealerValue << std::endl;
// TODO: split // TODO: split
actionTaken = Libreblackjack::PlayerActionTaken::Hit; actionTaken = Libreblackjack::PlayerActionTaken::Hit;
} }
} }
std::cout << (int)(actionTaken) << std::endl;
// std::cout << (int)(actionTaken) << std::endl;
break; break;

+ 17
- 5
src/tty.cpp Просмотреть файл

// TODO: make class static // TODO: make class static
std::vector<std::string> commands; std::vector<std::string> commands;


// https://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprintf
template<typename ... Args>
std::string string_format2( const std::string& format, Args ... args)
{
size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
if (size <= 0) {
return std::string("");
}
std::unique_ptr<char[]> buf(new char[size]);
snprintf(buf.get(), size, format.c_str(), args ...);
return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}


Tty::Tty(Configuration &conf) { Tty::Tty(Configuration &conf) {


case Libreblackjack::Info::NewHand: case Libreblackjack::Info::NewHand:
std::cout << std::endl; std::cout << std::endl;
s = "Starting new hand #" + std::to_string(p1) + " with bankroll " + string_format("%g", 1e-3*p2, 0.0);
s = "Starting new hand #" + std::to_string(p1) + " with bankroll " + string_format2("%g", 1e-3*p2);
// clear dealer's hand // clear dealer's hand
dealerHand.cards.clear(); dealerHand.cards.clear();
break; break;
case Libreblackjack::Info::PlayerPushes: case Libreblackjack::Info::PlayerPushes:
s = "Player pushes " + string_format("%g", 1e-3*p1, 0.0) + ((p2 > 0) ? (" with " + std::to_string(p2)) : "");
s = "Player pushes " + string_format2("%g", 1e-3*p1) + ((p2 > 0) ? (" with " + std::to_string(p2)) : "");
render = true; render = true;
break; break;
case Libreblackjack::Info::PlayerLosses: case Libreblackjack::Info::PlayerLosses:
s = "Player losses " + string_format("%g", 1e-3*p1, 0.0) + ((p2 > 0) ? (" with " + std::to_string(p2)) : "");
s = "Player losses " + string_format2("%g", 1e-3*p1) + ((p2 > 0) ? (" with " + std::to_string(p2)) : "");
render = true; render = true;
break; break;
case Libreblackjack::Info::PlayerBlackjack: case Libreblackjack::Info::PlayerBlackjack:
render = true; render = true;
break; break;
case Libreblackjack::Info::PlayerWins: case Libreblackjack::Info::PlayerWins:
s = "Player wins " + string_format("%g", 1e-3*p1, 0.0) + ((p2 > 0) ? (" with " + std::to_string(p2)) : "");
s = "Player wins " + string_format2("%g", 1e-3*p1) + ((p2 > 0) ? (" with " + std::to_string(p2)) : "");
render = true; render = true;
break; break;
break; break;


case Libreblackjack::Info::Bankroll: case Libreblackjack::Info::Bankroll:
std::cout << "Your bankroll is " << string_format("%g", 1e-3*p1, 0.0) << std::endl;
std::cout << "Your bankroll is " << string_format2("%g", 1e-3*p1) << std::endl;
break; break;

Загрузка…
Отмена
Сохранить