Parcourir la source

report

master
gtheler il y a 5 ans
Parent
révision
d3240dc6ea
7 fichiers modifiés avec 160 ajouts et 8 suppressions
  1. +1
    -0
      Makefile.am
  2. +2
    -1
      TODO
  3. +1
    -1
      blackjack.conf
  4. +15
    -0
      src/base.h
  5. +1
    -5
      src/blackjack.h
  6. +2
    -1
      src/main.cpp
  7. +138
    -0
      src/report.cpp

+ 1
- 0
Makefile.am Voir le fichier

@@ -18,6 +18,7 @@ blackjack_LDADD = $(all_libraries)
blackjack_SOURCES = \
src/main.cpp \
src/conf.cpp \
src/report.cpp \
src/version.cpp \
src/blackjack.cpp \
src/cards.cpp \

+ 2
- 1
TODO Voir le fichier

@@ -1,5 +1,6 @@
* handle no readline
* to_string() para floats
* flag to see if a conf string was used or not
* to_string() for floats
* max_splits through conf (default 3)
* DAS
* shoes (and arranged shoes)

+ 1
- 1
blackjack.conf Voir le fichier

@@ -4,5 +4,5 @@ flat_bet = 1
; arranged_cards = 4,1,5,10
; rng_seed = 5
; delay = 0
bankroll = 10
; bankroll = 10


+ 15
- 0
src/base.h Voir le fichier

@@ -25,6 +25,7 @@

#include <string>
#include <list>
#include <unordered_map>
#include <random>
#include <cmath>

@@ -260,6 +261,9 @@ class Dealer {
Libreblackjack::DealerAction nextAction = Libreblackjack::DealerAction::None;
void reportPrepare(void);
int writeReportYAML(void);
protected:
// TODO: multiple players
@@ -269,6 +273,11 @@ class Dealer {
// there are games where the dealer has more than one hand
// std::list <Hand> hands;
Hand hand;

double error_standard_deviations = 1.0;
int n_decks = -1;
unsigned long int n_hands = 0;
unsigned long int n_hand = 0;
struct {
std::list<PlayerHand> hands;
@@ -308,6 +317,12 @@ class Dealer {

private:
bool done = false;
std::unordered_map<std::string, std::string> results;

void insert(std::string key, std::string value) {
results.insert(std::pair<std::string, std::string>(key, value));
}
};


+ 1
- 5
src/blackjack.h Voir le fichier

@@ -50,11 +50,7 @@ class Blackjack : public Dealer {
unsigned int holeCard;
unsigned int playerFirstCard;
unsigned int playerSecondCard;
int n_decks = -1;
unsigned long int n_hands = 0;
unsigned long int n_hand = 0;
bool hit_soft_17 = true;
bool double_after_split = true;
bool shuffle_every_hand = false;

+ 2
- 1
src/main.cpp Voir le fichier

@@ -87,7 +87,8 @@ int main(int argc, char **argv) {
}
}
// TODO: write report
dealer->reportPrepare();
dealer->writeReportYAML();
delete player;
delete dealer;

+ 138
- 0
src/report.cpp Voir le fichier

@@ -0,0 +1,138 @@
#include <iostream>
// #include <sys/time.h>
// #include <sys/resource.h>

#include "base.h"


void Dealer::reportPrepare(void) {

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

int Dealer::writeReportYAML(void) {
// FILE *file;
// struct rusage usage;
// double wall;
// double ev, error;
// int precision;
// char format[32];

// if ((file = blackjack_conf.yaml_report) == NULL) {
// file = stderr;
// }

// TODO: choose if comments with explanations are to be added
std::cerr << "---" << std::endl;
for (auto it = results.begin(); it != results.end(); ++it) {
std::cerr << it->first << ": " << it->second << std::endl;
}
// std::cerr << "rules:" << std::endl;
// std::cerr << " decks: " << decks << std::endl;
// std::cerr << " hands: " << n_hands << std::endl;
// std::cerr << " hit_soft_17: %d\n",
// blackjack_conf.hit_soft_17);
// std::cerr << " double_after_split: %d\n",
// blackjack_conf.double_after_split);
// std::cerr << " blackjack_pays: %g\n",
// blackjack_conf.blackjack_pays);
// std::cerr << " rng_seed: %d\n", blackjack_conf.rng_seed);
// std::cerr << " number_of_burnt_cards: %d\n",
// blackjack_conf.number_of_burnt_cards);
// std::cerr << " no_negative_bankroll: %d\n",
// blackjack_conf.no_negative_bankroll);
// std::cerr << " max_bet: %d\n", blackjack_conf.max_bet);

// if (blackjack_conf.decks > 0)
// {
// std::cerr << " penetration: %g\n",
// blackjack_conf.penetration);
// std::cerr << " penetration_sigma: %g\n",
// blackjack_conf.penetration_sigma);
// }

// TODO
// if (getrusage (RUSAGE_SELF, &usage) == 0) {
// std::cerr << "cpu:" << std::endl;
// std::cerr << " user: " + (usage.ru_utime.tv_sec + 1e-6 * usage.ru_utime.tv_usec) << std::endl;
// std::cerr << " system: " + (usage.ru_stime.tv_sec + 1e-6 * usage.ru_stime.tv_usec) << std::endl;

// measue final wall time
// TODO: chrono
// gettimeofday (&wall_time_final, NULL);
// wall = (blackjack.wall_time_final.tv_sec -
// blackjack.wall_time_initial.tv_sec) +
// 1e-6 * (blackjack.wall_time_final.tv_usec -
// blackjack.wall_time_initial.tv_usec);
// std::cerr << " wall: %g\n", wall);

// speed
// std::cerr << " second_per_hand: %.1e\n", wall / blackjack.hand);
// std::cerr << " hands_per_second: %.1e\n", blackjack.hand / wall);
// }

// std::cerr << "player: " << std::endl;
// std::cerr << " wins: " ((double) player->wins / (double) player->number_of_hands)) << std::endl;
// std::cerr << " pushes: %g\n",
// (double) player->pushes / (double) player->number_of_hands);
// std::cerr << " losses: %g\n",
// (double) player->losses / (double) player->number_of_hands);
// std::cerr << " dealer_blackjacks: %g\n",
// (double) player->dealer_blackjacks /
// (double) player->number_of_hands);
// std::cerr << " player_blackjacks: %g\n",
// (double) player->player_blackjacks /
// (double) player->number_of_hands);
// std::cerr << " dealer_busts: %g\n",
// (double) player->dealer_busts / (double) player->number_of_hands);
// std::cerr << " player_busts: %g\n",
// (double) player->player_busts / (double) player->number_of_hands);
// std::cerr << " doubled_hands: %g\n",
// (double) player->doubled_hands / (double) player->number_of_hands);
// std::cerr << " doubled_wins: %g\n",
// (double) player->doubled_wins / (double) player->number_of_hands);
// std::cerr << " insured_hands: %g\n",
// (double) player->insured_hands / (double) player->number_of_hands);
// std::cerr << " insured_wins: %g\n",
// (double) player->insured_wins / (double) player->number_of_hands);

// std::cerr << " number_of_hands: %g\n",
// (double) player->number_of_hands);
// std::cerr << " number_of_shuffles: %g\n", (double) blackjack.shuffles);
// std::cerr << " total_money_waged: %g\n",
// (double) player->total_money_waged);
// std::cerr << " worst_bankroll: %g\n",
// (double) player->worst_bankroll);
// std::cerr << " final_bankroll: %g\n", (double) player->bankroll);

// return is a keyword!

// precision = (int) (ceil (-log10 (error))) - 2;
// if (precision >= 0) {
// snprintf (format, 32, ("%%+.%df ± %%.%df"), precision, precision);
// } else {
// snprintf (format, 32, ("%%+.0f ± %%.0f"));
// }


// std::cerr << " variance: % g\n", player->variance);
// std::cerr << " deviation: % g\n", sqrt (player->variance));
// std::cerr << " error: % g\n",
// sqrt (player->variance / (double) (blackjack.hand)));
// std::cerr << " result: \"("), std::cerr << format,
// 100.0 * ev,
// 100 * error);
// std::cerr << ") %%\"" << std::endl;
std::cerr << "..." << std::endl;

return 0;
}

Chargement…
Annuler
Enregistrer