gtheler 5 лет назад
Родитель
Сommit
20d20a4b37
5 измененных файлов: 29 добавлений и 36 удалений
  1. +2
    -0
      blackjack.conf
  2. +16
    -25
      src/blackjack.cpp
  3. +3
    -3
      src/conf.cpp
  4. +7
    -7
      src/stdinout.cpp
  5. +1
    -1
      src/tty.cpp

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

flat_bet = 1 flat_bet = 1
no_insurance = true no_insurance = true
delay = 0 delay = 0
; arranged_cards = 2,0,3
; rng_seed = 1

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



void Blackjack::deal(void) { void Blackjack::deal(void) {
int playerTotal = 0;
int dealerTotal = 0;
bool playerBlackack = false;
bool playerBlackjack = false;
// let's start by assuming the player does not need to do anything // let's start by assuming the player does not need to do anything
player->actionRequired = Libreblackjack::PlayerActionRequired::None; player->actionRequired = Libreblackjack::PlayerActionRequired::None;


// 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);
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));
} }
// 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
playerTotal = playerStats.currentHand->value();
if ((card[upCard].value == 10 || card[upCard].value == 11) || std::abs(playerTotal) == 21) {
player->playerValue = playerStats.currentHand->value();
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;
return; return;
} }


// step 7.c. ask the player to play // step 7.c. ask the player to play
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play; player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
nextAction = Libreblackjack::DealerAction::AskForPlay; nextAction = Libreblackjack::DealerAction::AskForPlay;
return; return;
case Libreblackjack::DealerAction::CheckforBlackjacks: case Libreblackjack::DealerAction::CheckforBlackjacks:
// step 8. check if there are any blackjack // step 8. check if there are any blackjack
playerBlackack = playerStats.currentHand->blackjack();
playerBlackjack = playerStats.currentHand->blackjack();
if (hand.blackjack()) { if (hand.blackjack()) {
info(Libreblackjack::Info::CardDealerRevealsHole, holeCard); info(Libreblackjack::Info::CardDealerRevealsHole, holeCard);
info(Libreblackjack::Info::DealerBlackjack); info(Libreblackjack::Info::DealerBlackjack);
playerStats.winsInsured++; playerStats.winsInsured++;
} }


if (playerBlackack) {
if (playerBlackjack) {
info(Libreblackjack::Info::PlayerBlackjackAlso); info(Libreblackjack::Info::PlayerBlackjackAlso);


// give him his (her her) money back // give him his (her her) money back
player->actionRequired = Libreblackjack::PlayerActionRequired::None; player->actionRequired = Libreblackjack::PlayerActionRequired::None;
return; return;
} else if (playerBlackack) {
} else if (playerBlackjack) {


// pay him (her) // pay him (her)
playerStats.bankroll += (1.0 + blackjack_pays) * playerStats.currentHand->bet; playerStats.bankroll += (1.0 + blackjack_pays) * playerStats.currentHand->bet;
} }
nextAction = Libreblackjack::DealerAction::AskForPlay; nextAction = Libreblackjack::DealerAction::AskForPlay;
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play; player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
return; return;
} }
break; break;
case Libreblackjack::DealerAction::AskForPlay: case Libreblackjack::DealerAction::AskForPlay:
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play; player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
nextAction = Libreblackjack::DealerAction::AskForPlay; nextAction = Libreblackjack::DealerAction::AskForPlay;
return; return;
nextAction = Libreblackjack::DealerAction::MoveOnToNextHand; nextAction = Libreblackjack::DealerAction::MoveOnToNextHand;
return; return;
} else { } else {
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play; player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
nextAction = Libreblackjack::DealerAction::AskForPlay; nextAction = Libreblackjack::DealerAction::AskForPlay;
return; return;
info(Libreblackjack::Info::CardDealerRevealsHole, holeCard); info(Libreblackjack::Info::CardDealerRevealsHole, holeCard);


// 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)
dealerTotal = hand.value();
while ((std::abs(dealerTotal) < 17 || (hit_soft_17 && dealerTotal == -17)) && hand.busted() == 0) {
player->dealerValue = hand.value();
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);
dealerTotal = hand.value();
player->dealerValue = hand.value();
} }
if (hand.busted()) { if (hand.busted()) {
info(Libreblackjack::Info::DealerBusts, dealerTotal);
info(Libreblackjack::Info::DealerBusts, player->dealerValue);
playerStats.bustsDealer++; playerStats.bustsDealer++;
for (auto playerHand : playerStats.hands) { for (auto playerHand : playerStats.hands) {
if (playerHand.busted() == false) { if (playerHand.busted() == false) {
} else { } else {
for (auto playerHand : playerStats.hands) { for (auto playerHand : playerStats.hands) {
if (playerHand.busted() == false) { // busted hands have already been solved if (playerHand.busted() == false) { // busted hands have already been solved
playerTotal = std::abs(playerHand.value());
player->playerValue = std::abs(playerHand.value());
if (dealerTotal > playerTotal) {
if (std::abs(player->dealerValue) > std::abs(player->playerValue)) {
playerStats.result -= playerHand.bet; playerStats.result -= playerHand.bet;
info(Libreblackjack::Info::PlayerLosses, 1e3*playerHand.bet, playerTotal);
info(Libreblackjack::Info::PlayerLosses, 1e3*playerHand.bet, player->playerValue);
playerStats.losses++; playerStats.losses++;
} else if (dealerTotal == playerTotal) {
} else if (std::abs(player->dealerValue) == std::abs(player->playerValue)) {
// give him his (her her) money back // give him his (her her) money back
playerStats.bankroll += playerHand.bet; playerStats.bankroll += playerHand.bet;
// pay him (her) // pay him (her)
playerStats.bankroll += 2 * playerHand.bet; playerStats.bankroll += 2 * playerHand.bet;
playerStats.result += playerHand.bet; playerStats.result += playerHand.bet;
info(Libreblackjack::Info::PlayerWins, 1e3*playerHand.bet, playerTotal);
info(Libreblackjack::Info::PlayerWins, 1e3*playerHand.bet, player->playerValue);
playerStats.wins++; playerStats.wins++;
playerStats.winsDoubled += playerHand.doubled; playerStats.winsDoubled += playerHand.doubled;

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



int optc = 0; int optc = 0;
int option_index = 0; int option_index = 0;
// int opterr = 0;
opterr = 0;
while ((optc = getopt_long_only(argc, argv, "c:hvd:n:if:", longopts, &option_index)) != -1) { while ((optc = getopt_long_only(argc, argv, "c:hvd:n:if:", longopts, &option_index)) != -1) {
switch (optc) { switch (optc) {
case 'h': case 'h':
if (set(player, {"player"}) == false) { if (set(player, {"player"}) == false) {
// if we are on an interactive terminal we play through tty otherwise stdinout // if we are on an interactive terminal we play through tty otherwise stdinout
if (isatty(0)) {
if (isatty(0) && isatty(1)) {
player = "tty"; player = "tty";
} else { } else {
player = "stdio"; player = "stdio";
for (auto it : key) { for (auto it : key) {
if (exists(*(&it))) { if (exists(*(&it))) {
auto s = data[*(&it)]; auto s = data[*(&it)];
if (s == "true" || s == "yes" || s == "y") {
if (s == "true" || s == "yes" || s == "y" || s == "") {
*value = true; *value = true;
} else if (s == "false" || s == "no" || s == "n") { } else if (s == "false" || s == "no" || s == "n") {
*value = false; *value = false;

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

break; break;
case Libreblackjack::Info::CardDealerRevealsHole: case Libreblackjack::Info::CardDealerRevealsHole:
s = "card_dealer_hole " + card[p1].utf8();;
s = "card_dealer_hole " + card[p1].ascii();;
*(++(dealerHand.cards.begin())) = p1; *(++(dealerHand.cards.begin())) = p1;
currentHandId = 0; currentHandId = 0;
break; break;
} }
currentHandId = p1; currentHandId = p1;
s = "new_hand " + std::to_string(p2) + " " + card[cardToSplit].utf8();
s = "new_hand " + std::to_string(p2) + " " + card[cardToSplit].ascii();
break; break;


case Libreblackjack::Info::PlayerDoubleInvalid: case Libreblackjack::Info::PlayerDoubleInvalid:
break; break;
case Libreblackjack::Info::PlayerPushes: case Libreblackjack::Info::PlayerPushes:
s = "player_pushes";
s = "player_pushes " + std::to_string(playerValue) + " " + std::to_string(dealerValue);;
break; break;
case Libreblackjack::Info::PlayerLosses: case Libreblackjack::Info::PlayerLosses:
s = "player_losses";
s = "player_losses " + std::to_string(playerValue) + " " + std::to_string(dealerValue);
break; break;
case Libreblackjack::Info::PlayerBlackjack: case Libreblackjack::Info::PlayerBlackjack:
s = "blackjack_player"; s = "blackjack_player";
break; break;
case Libreblackjack::Info::PlayerWins: case Libreblackjack::Info::PlayerWins:
s = "player_wins";
s = "player_wins " + std::to_string(playerValue) + " " + std::to_string(dealerValue);;
break; break;
case Libreblackjack::Info::NoBlackjacks: case Libreblackjack::Info::NoBlackjacks:
break; break;


case Libreblackjack::Info::DealerBusts: case Libreblackjack::Info::DealerBusts:
s = "dealer_busts";
s = "dealer_busts " + std::to_string(playerValue) + " " + std::to_string(dealerValue);;
break; break;
case Libreblackjack::Info::Help: case Libreblackjack::Info::Help:
break; break;
case Libreblackjack::PlayerActionRequired::Play: case Libreblackjack::PlayerActionRequired::Play:
s = "play?" + std::to_string(dealerValue) + " " + std::to_string(playerValue);
s = "play? " + std::to_string(playerValue) + " " + std::to_string(dealerValue);
break; break;
case Libreblackjack::PlayerActionRequired::None: case Libreblackjack::PlayerActionRequired::None:

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

case Libreblackjack::PlayerActionRequired::Play: case Libreblackjack::PlayerActionRequired::Play:
renderTable(); renderTable();
s = "Play? " + std::to_string(dealerValue) + " " + std::to_string(playerValue);
s = "Play? " + std::to_string(playerValue) + " " + std::to_string(dealerValue);
break; break;
case Libreblackjack::PlayerActionRequired::None: case Libreblackjack::PlayerActionRequired::None:

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