gtheler před 5 roky
rodič
revize
7a99f0ced3
5 změnil soubory, kde provedl 19 přidání a 23 odebrání
  1. +1
    -0
      TODO
  2. +2
    -6
      blackjack.conf
  3. +2
    -2
      src/base.h
  4. +13
    -14
      src/blackjack.cpp
  5. +1
    -1
      src/report.cpp

+ 1
- 0
TODO Zobrazit soubor

* handle no readline * handle no readline
* trap ctrl+c and write report anyway
* flag to see if a conf string was used or not * flag to see if a conf string was used or not
* to_string() for floats * to_string() for floats
* max_splits through conf (default 3) * max_splits through conf (default 3)

+ 2
- 6
blackjack.conf Zobrazit soubor

flat_bet = 1 flat_bet = 1
; arranged_cards = 6,5,4,10
; arranged_cards = 3,8,16,0,3
; arranged_cards = 4,1,5,10
; rng_seed = 5
; delay = 0
; bankroll = 10
no_insurance = true
delay = 0



+ 2
- 2
src/base.h Zobrazit soubor

std::list<PlayerHand> hands; std::list<PlayerHand> hands;
std::list<PlayerHand>::iterator currentHand; std::list<PlayerHand>::iterator currentHand;
unsigned int currentSplits = 0;
unsigned int splits = 0;
// unsigned int currentBet = 0; // unsigned int currentBet = 0;
unsigned int n_hands = 0; // this is different from the dealer's due to splitting unsigned int n_hands = 0; // this is different from the dealer's due to splitting
double bankroll = 0; double bankroll = 0;
double worstBankroll = 0; double worstBankroll = 0;
double totalMoneyWaged = 0; double totalMoneyWaged = 0;
double currentResult = 0;
double result = 0;
double mean = 0; double mean = 0;
double M2 = 0; double M2 = 0;
double variance = 0; double variance = 0;

+ 13
- 14
src/blackjack.cpp Zobrazit soubor

// https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm // https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm


if (n_hand != 0) { if (n_hand != 0) {
double delta = playerStats.currentResult - playerStats.mean;
double delta = playerStats.result - playerStats.mean;
playerStats.mean += delta / (double)(n_hand); playerStats.mean += delta / (double)(n_hand);
playerStats.M2 += delta * (playerStats.currentResult - playerStats.mean);
playerStats.M2 += delta * (playerStats.result - playerStats.mean);
playerStats.variance = playerStats.M2 / (double)(n_hand); playerStats.variance = playerStats.M2 / (double)(n_hand);
} }


playerStats.currentHand = playerStats.hands.begin(); playerStats.currentHand = playerStats.hands.begin();
// state that the player did not win anything nor split nor doubled down // state that the player did not win anything nor split nor doubled down
playerStats.currentResult = 0;
playerStats.currentSplits = 0;
playerStats.splits = 0;
if (lastPass) { if (lastPass) {
info(Libreblackjack::Info::Shuffle); info(Libreblackjack::Info::Shuffle);
// pay him (her) // pay him (her)
playerStats.bankroll += (1.0 + 0.5) * playerStats.currentHand->bet; playerStats.bankroll += (1.0 + 0.5) * playerStats.currentHand->bet;
playerStats.currentResult += playerStats.currentHand->bet;
playerStats.result += playerStats.currentHand->bet;
info(Libreblackjack::Info::PlayerWinsInsurance, 1e3*playerStats.currentHand->bet); info(Libreblackjack::Info::PlayerWinsInsurance, 1e3*playerStats.currentHand->bet);


playerStats.winsInsured++; playerStats.winsInsured++;
} else { } else {
playerStats.currentResult -= playerStats.currentHand->bet;
playerStats.result -= playerStats.currentHand->bet;
info(Libreblackjack::Info::PlayerLosses, 1e3*playerStats.currentHand->bet); info(Libreblackjack::Info::PlayerLosses, 1e3*playerStats.currentHand->bet);
playerStats.losses++; playerStats.losses++;


// pay him (her) // pay him (her)
playerStats.bankroll += (1.0 + blackjack_pays) * playerStats.currentHand->bet; playerStats.bankroll += (1.0 + blackjack_pays) * playerStats.currentHand->bet;
playerStats.currentResult += blackjack_pays * playerStats.currentHand->bet;
playerStats.result += blackjack_pays * playerStats.currentHand->bet;
info(Libreblackjack::Info::PlayerWins, 1e3 * blackjack_pays*playerStats.currentHand->bet); info(Libreblackjack::Info::PlayerWins, 1e3 * blackjack_pays*playerStats.currentHand->bet);
playerStats.blackjacksPlayer++; playerStats.blackjacksPlayer++;
if (playerHand.busted() == false) { if (playerHand.busted() == false) {
// pay him (her) // pay him (her)
playerStats.bankroll += 2 * playerHand.bet; playerStats.bankroll += 2 * playerHand.bet;
playerStats.currentResult += playerHand.bet;
playerStats.result += playerHand.bet;
info(Libreblackjack::Info::PlayerWins, 1e3*playerHand.bet); info(Libreblackjack::Info::PlayerWins, 1e3*playerHand.bet);
playerStats.wins++; playerStats.wins++;
if (dealerTotal > playerTotal) { if (dealerTotal > playerTotal) {
playerStats.currentResult -= playerHand.bet;
playerStats.result -= playerHand.bet;
info(Libreblackjack::Info::PlayerLosses, 1e3*playerHand.bet, playerTotal); info(Libreblackjack::Info::PlayerLosses, 1e3*playerHand.bet, playerTotal);
playerStats.losses++; playerStats.losses++;
// pay him (her) // pay him (her)
playerStats.bankroll += 2 * playerHand.bet; playerStats.bankroll += 2 * playerHand.bet;
playerStats.currentResult += playerHand.bet;
playerStats.result += playerHand.bet;
info(Libreblackjack::Info::PlayerWins, 1e3*playerHand.bet, playerTotal); info(Libreblackjack::Info::PlayerWins, 1e3*playerHand.bet, playerTotal);
playerStats.wins++; playerStats.wins++;
playerStats.winsDoubled += playerHand.doubled; playerStats.winsDoubled += playerHand.doubled;


if (playerStats.currentHand->busted()) { if (playerStats.currentHand->busted()) {
info(Libreblackjack::Info::PlayerLosses, 1e3*playerStats.currentHand->bet, playerTotal); info(Libreblackjack::Info::PlayerLosses, 1e3*playerStats.currentHand->bet, playerTotal);
playerStats.currentResult -= playerStats.currentHand->bet;
playerStats.result -= playerStats.currentHand->bet;
playerStats.bustsPlayer++; playerStats.bustsPlayer++;
playerStats.losses++; playerStats.losses++;
} }
// up to three splits (i.e. four hands) // up to three splits (i.e. four hands)
// TODO: choose through conf // TODO: choose through conf
// TODO: check bankroll to see if player can split // TODO: check bankroll to see if player can split
if (playerStats.currentSplits < 3 && playerStats.currentHand->cards.size() == 2 && card[firstCard].value == card[secondCard].value) {
if (playerStats.splits < 3 && playerStats.currentHand->cards.size() == 2 && card[firstCard].value == card[secondCard].value) {
// take player's money // take player's money
playerStats.bankroll -= playerStats.currentHand->bet; playerStats.bankroll -= playerStats.currentHand->bet;
info(Libreblackjack::Info::PlayerSplitOk, playerStats.currentHand->id); info(Libreblackjack::Info::PlayerSplitOk, playerStats.currentHand->id);
// mark that we split to put ids in the hands and to limi the number of spltis // mark that we split to put ids in the hands and to limi the number of spltis
playerStats.currentSplits++;
playerStats.splits++;


// the first hand is id=1, the rest have the id of the size of the list // the first hand is id=1, the rest have the id of the size of the list
if (playerStats.currentHand == playerStats.hands.begin()) { if (playerStats.currentHand == playerStats.hands.begin()) {


if (playerStats.currentHand->busted()) { if (playerStats.currentHand->busted()) {
playerStats.currentResult -= playerStats.currentHand->bet;
playerStats.result -= playerStats.currentHand->bet;
info(Libreblackjack::Info::PlayerLosses, 1e3*playerStats.currentHand->bet); info(Libreblackjack::Info::PlayerLosses, 1e3*playerStats.currentHand->bet);
playerStats.bustsPlayer++; playerStats.bustsPlayer++;
playerStats.losses++; playerStats.losses++;

+ 1
- 1
src/report.cpp Zobrazit soubor



void Dealer::reportPrepare(void) { void Dealer::reportPrepare(void) {


double ev = (double) playerStats.currentResult / (double) n_hand;
double ev = (double) playerStats.result / (double) n_hand;
double error = error_standard_deviations * sqrt (playerStats.variance / (double) n_hand); double error = error_standard_deviations * sqrt (playerStats.variance / (double) n_hand);
insert("result", std::to_string(ev)); insert("result", std::to_string(ev));

Načítá se…
Zrušit
Uložit