浏览代码

fix payout

master
gtheler 5 年前
父节点
当前提交
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 查看文件

@@ -1,3 +1,5 @@
flat_bet = 1
no_insurance = true
delay = 0
; arranged_cards = 2,0,3
; rng_seed = 1

+ 16
- 25
src/blackjack.cpp 查看文件

@@ -76,9 +76,7 @@ Blackjack::~Blackjack() {

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
player->actionRequired = Libreblackjack::PlayerActionRequired::None;

@@ -172,6 +170,7 @@ void Blackjack::deal(void) {
// step 4. show dealer's upcard
upCard = drawCard(&hand);
info(Libreblackjack::Info::CardDealer, upCard);
player->dealerValue = hand.value();

// step 5. deal the second card to each player
playerSecondCard = drawCard(&(*playerStats.currentHand));
@@ -205,16 +204,14 @@ void Blackjack::deal(void) {
}
// 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;
nextAction = Libreblackjack::DealerAction::CheckforBlackjacks;
return;
}

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

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

// give him his (her her) money back
@@ -260,7 +257,7 @@ void Blackjack::deal(void) {
player->actionRequired = Libreblackjack::PlayerActionRequired::None;
return;
} else if (playerBlackack) {
} else if (playerBlackjack) {

// pay him (her)
playerStats.bankroll += (1.0 + blackjack_pays) * playerStats.currentHand->bet;
@@ -282,16 +279,12 @@ void Blackjack::deal(void) {
}
nextAction = Libreblackjack::DealerAction::AskForPlay;
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
return;
}
break;
case Libreblackjack::DealerAction::AskForPlay:
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
nextAction = Libreblackjack::DealerAction::AskForPlay;
return;
@@ -308,8 +301,6 @@ void Blackjack::deal(void) {
nextAction = Libreblackjack::DealerAction::MoveOnToNextHand;
return;
} else {
player->playerValue = playerTotal;
player->dealerValue = dealerTotal;
player->actionRequired = Libreblackjack::PlayerActionRequired::Play;
nextAction = Libreblackjack::DealerAction::AskForPlay;
return;
@@ -344,15 +335,15 @@ void Blackjack::deal(void) {
info(Libreblackjack::Info::CardDealerRevealsHole, holeCard);

// 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);
info(Libreblackjack::Info::CardDealer, dealerCard);
dealerTotal = hand.value();
player->dealerValue = hand.value();
}
if (hand.busted()) {
info(Libreblackjack::Info::DealerBusts, dealerTotal);
info(Libreblackjack::Info::DealerBusts, player->dealerValue);
playerStats.bustsDealer++;
for (auto playerHand : playerStats.hands) {
if (playerHand.busted() == false) {
@@ -368,15 +359,15 @@ void Blackjack::deal(void) {
} else {
for (auto playerHand : playerStats.hands) {
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;
info(Libreblackjack::Info::PlayerLosses, 1e3*playerHand.bet, playerTotal);
info(Libreblackjack::Info::PlayerLosses, 1e3*playerHand.bet, player->playerValue);
playerStats.losses++;
} else if (dealerTotal == playerTotal) {
} else if (std::abs(player->dealerValue) == std::abs(player->playerValue)) {
// give him his (her her) money back
playerStats.bankroll += playerHand.bet;
@@ -388,7 +379,7 @@ void Blackjack::deal(void) {
// pay him (her)
playerStats.bankroll += 2 * 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.winsDoubled += playerHand.doubled;

+ 3
- 3
src/conf.cpp 查看文件

@@ -71,7 +71,7 @@ Configuration::Configuration(int argc, char **argv) {

int optc = 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) {
switch (optc) {
case 'h':
@@ -139,7 +139,7 @@ Configuration::Configuration(int argc, char **argv) {
if (set(player, {"player"}) == false) {
// if we are on an interactive terminal we play through tty otherwise stdinout
if (isatty(0)) {
if (isatty(0) && isatty(1)) {
player = "tty";
} else {
player = "stdio";
@@ -198,7 +198,7 @@ bool Configuration::set(bool *value, std::list<std::string> key) {
for (auto it : key) {
if (exists(*(&it))) {
auto s = data[*(&it)];
if (s == "true" || s == "yes" || s == "y") {
if (s == "true" || s == "yes" || s == "y" || s == "") {
*value = true;
} else if (s == "false" || s == "no" || s == "n") {
*value = false;

+ 7
- 7
src/stdinout.cpp 查看文件

@@ -112,7 +112,7 @@ void StdInOut::info(Libreblackjack::Info msg, int p1, int p2) {
break;
case Libreblackjack::Info::CardDealerRevealsHole:
s = "card_dealer_hole " + card[p1].utf8();;
s = "card_dealer_hole " + card[p1].ascii();;
*(++(dealerHand.cards.begin())) = p1;
currentHandId = 0;
break;
@@ -163,7 +163,7 @@ void StdInOut::info(Libreblackjack::Info msg, int p1, int p2) {
}
currentHandId = p1;
s = "new_hand " + std::to_string(p2) + " " + card[cardToSplit].utf8();
s = "new_hand " + std::to_string(p2) + " " + card[cardToSplit].ascii();
break;

case Libreblackjack::Info::PlayerDoubleInvalid:
@@ -175,17 +175,17 @@ void StdInOut::info(Libreblackjack::Info msg, int p1, int p2) {
break;
case Libreblackjack::Info::PlayerPushes:
s = "player_pushes";
s = "player_pushes " + std::to_string(playerValue) + " " + std::to_string(dealerValue);;
break;
case Libreblackjack::Info::PlayerLosses:
s = "player_losses";
s = "player_losses " + std::to_string(playerValue) + " " + std::to_string(dealerValue);
break;
case Libreblackjack::Info::PlayerBlackjack:
s = "blackjack_player";
break;
case Libreblackjack::Info::PlayerWins:
s = "player_wins";
s = "player_wins " + std::to_string(playerValue) + " " + std::to_string(dealerValue);;
break;
case Libreblackjack::Info::NoBlackjacks:
@@ -193,7 +193,7 @@ void StdInOut::info(Libreblackjack::Info msg, int p1, int p2) {
break;

case Libreblackjack::Info::DealerBusts:
s = "dealer_busts";
s = "dealer_busts " + std::to_string(playerValue) + " " + std::to_string(dealerValue);;
break;
case Libreblackjack::Info::Help:
@@ -237,7 +237,7 @@ int StdInOut::play(void) {
break;
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;
case Libreblackjack::PlayerActionRequired::None:

+ 1
- 1
src/tty.cpp 查看文件

@@ -313,7 +313,7 @@ int Tty::play() {
case Libreblackjack::PlayerActionRequired::Play:
renderTable();
s = "Play? " + std::to_string(dealerValue) + " " + std::to_string(playerValue);
s = "Play? " + std::to_string(playerValue) + " " + std::to_string(dealerValue);
break;
case Libreblackjack::PlayerActionRequired::None:

正在加载...
取消
保存