/blackjack

Blackjack game and strategy calculator

Primary LanguageC++

Blackjack version 7.6
Copyright (C) 2017 Eric Farmer (erfarmer@gmail.com)

Blackjack game written using the Allegro Game Programming Library
Original card images Copyright 2011 Chris Aguilar
Thanks to London Colin for many improvements and bug fixes

************************************************************************

*** License ***

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Original Vectorized Playing Cards 1.3 Copyright 2011 Chris Aguilar
http://code.google.com/p/vectorized-playing-cards/
Licensed under LGPL 3: http://www.gnu.org/copyleft/lesser.html

************************************************************************

*** Documentation ***

    *** Blackjack Game (blackjack.exe) ***

Press Esc at any time to quit.

In Blackjack, you can play any of various styles of casino blackjack,
with a number of decks and rule variations of your choosing.  As you
play, exact probabilities of outcomes of the dealer's hand and exact
expected values for your hand(s) are displayed.

When you run Blackjack, you must first select the file containing the
rule variations for the casino you want.  See the casinos subfolder for
examples, with comments to explain how the rule variations are
specified.

Note that the "counting" practice modes, -1 and -2, will cause the
overall expected value to be recomputed and displayed before each hand.
Practice mode -2 computes the current expected value using "full shoe"
composition-dependent basic strategy; practice mode -1 computes the
expected value using the optimal composition-dependent strategy for the
current shoe.  (More precisely, in all cases, the strategy is CDZ-,
where the optimal strategy for non-split hands is applied to post-split
hands as well.)  In other words, mode -2 allows you to vary your wager
perfectly, and mode -1 allows you to vary both your wager and playing
strategy perfectly.

Once basic strategy for the selected casino has been computed, you are
ready to begin playing.  Press the F1 key at any time to toggle the help
display of each key's function, or press Esc at any time to quit.

To play a hand, use the up and down arrows to set your initial wager.
The table limit is $500.  Your current balance is displayed in the lower
right corner.  This is essentially the "money in your pocket;" it
decreases as you increase your wager, and vice versa.  Press Enter to
deal the hand.

The numbers to the right of the dealer's hand are the exact
probabilities of each possible outcome of the dealer's hand.  These
probabilities take into account all cards dealt from the shoe.  (Tip:
insurance has positive expected return only when the probability of
dealer blackjack is greater than 1/3.)

The numbers to the right of your hand are the exact expected values (in
percent of initial bet) of each available option.  These values take
into account all cards in your current hand and the dealer's up card.
For example, suppose the number displayed for standing is -12.3.  This
means that if you played out the current situation many, many times,
standing each time, with a $10 initial wager, then on average you would
lose $1.23.

Note that if you select an option other than the one which maximizes the
expected value of the hand, the suggested option is displayed below your
hand, and you are given another chance to select the correct option.

Once all hands have been settled, your new balance is displayed in the
lower right corner.  Press Enter to clear the table and play another
hand.  The shoe, displayed in the upper right corner, will be
automatically reshuffled when the "new shoe" card (indicated by the red
line) has been reached.

************************************************************************

    *** Basic Strategy Calculator (strategy.exe) ***

Press Ctrl-C at any time to quit.

When you run the Basic Strategy Calculator, you must first enter the
casino rule variations, similar to those specified in the data files for
the Blackjack game (see above).

In addition to the rule variations available in the game, you may
specify the playing strategy for split hands, which may be any of three
possibilities:

1. CDZ-, or composition-dependent zero-memory, where "pre-split" optimal
   strategy is also applied to all split hands (this is the default used
   in the game);
2. CDP1, where post-split strategy is optimized for the first split hand
   and then applied to all subsequent splits; or
3. CDP, where post-split strategy is allowed to vary as a function of
   the number of additional pair cards removed.

Once basic strategy for the selected rule variations has been computed,
enter the name of a file in which to save the basic strategy table.
This will be a text file, so a '.txt' extension is suggested.  (Tip: the
basic strategy table prints nicely on three pages when opened in Word,
with Courier New font and 0.75-inch margins.)

In addition to the table of basic strategy for all possible two-card
player hands and all possible dealer up cards, the saved file also
contains the expected values against each dealer up card (and overall),
as well as the probabilities of each possible outcome of the dealer's
hand.

When no resplits and CDZ- strategy are selected, it is also feasible to
compute the probability of each possible outcome of the round.  In this
case, the standard deviation is also displayed with the overall expected
value as "mu +/- sigma".

You may then enter individual hands to display the corresponding expected
values.  Enter the dealer's up card, the number of cards in your hand,
and the values of those cards.  For example, suppose you have a 10, 4,
and 2 against a dealer's 7:

Enter dealer up card and player hand (Ctrl-C to exit): 7 3 10 4 2

where:
    7 is the dealer' up card,
    3 is the number of cards in the player's hand,
    10 is the player's first card,
    4 is the player's second card,
    2 is the player's third card.

Note that all tens and face cards are to be entered as 10, and all aces
are to be entered as 1, not 11.

To exit, enter "0 0" for the dealer up card and player hand.

************************************************************************

    *** Card Counting Analyzer (count.exe) ***

Press Ctrl-C at any time to quit.

When you run the Card Counting Analyzer, you must first enter the casino
rule variations, similar to those specified in the Basic Strategy
Calculator (see above).

In addition to the rule variations available in the game, you may
specify indices for total-dependent strategy variations based on the
true count.  Each strategy variation is specified beginning with 5
values indicating the player hand:

1. Count = hand total, with negative total indicating a soft hand.
2. Dealer up card (1-10).
3. Double down = 1 if doubling down is allowed on the hand, 0 otherwise.
4. Split = 1 if splitting is allowed on the hand, 0 otherwise.
5. Surrender = 1 if late surrender is allowed on the hand, 0 otherwise.

These are followed by a series of strategy/true count index pairs, with
the strategy values being (1=stand, 2=hit, 3=double, 4=split,
5=surrender), and the indices being strictly increasing with the final
index being +1000 or greater (effectively infinite), indicating a
partition of possible true counts into half-open intervals and
corresponding playing strategies.  For example:

+16 10 0 0 0 2 0 1 +1000

represents the strategy for hard 16 vs. dealer 10 of hitting (2) if the
true count is less than 0, and standing (1) otherwise.  See the indices
subfolder for more complete examples.

You may also specify the playing strategy to use during simulated play:

0 = total-dependent index play (TDI).
1 = full-shoe composition-dependent basic strategy (CDZ-).
2 = optimal strategy, re-optimized for the current depleted shoe prior
    to each hand.

Finally, you may specify a shoe penetration, a random seed, and a
starting and ending index of shoes to simulate.  For each simulated
shoe, a text file with a name of the form shoe#.txt will be created,
containing a row for each round played in the corresponding shoe.  The
first 10 columns indicate the number of cards of each rank remaining in
the shoe prior to the round (ace through ten).  The 11-13th columns
indicate the exact expected value of the round assuming TDI, full-shoe
CDZ-, and optimal CDZ- strategy, respectively, in fraction of initial
wager.  The last column indicates the actual outcome of the simulated
round, in fraction of initial wager.

************************************************************************

*** List Of Files ***

    The package consists of the following files:

    blackjack.exe  Executable for Blackjack game
    strategy.exe   Executable for Basic Strategy Calculator
    count.exe      Executable for Count Analyzer
    readme.txt     This file
    gpl.txt        GNU General Public License
    casinos/       2 casino data files
    images/        55 card and table bitmaps
    indices/       4 example strategy indices
    src/           16 C++ source files

************************************************************************

*** Revision History ***

7.6  The compute_pdf() function (and accompanying count_pdf.cpp) now
     supports indexed insurance wagers.

7.5  The compute_pdf() function computes the distribution of outcomes of
     a round, in the computationally feasible case of no resplits and
     CDZ- strategy.

7.4  The game now supports customizable penetration.

7.3  The card counting analyzer now supports multiple (i.e., more than
     2) indices/strategies for each player hand.

7.2  The card counting analyzer now supports configurable resolution for
     estimating number of decks when computing the true count.

7.1  The card counting analyzer now supports total-dependent strategy
     with true count-dependent index plays.

7.0  The game now uses 24-bit color, with improved card images from
     Chris Aguilar.  The speed of computing dealer probabilities has
     also been improved slightly (again).

6.8  A major re-factoring of the computation of dealer probabilities
     yields a significant improvement in speed.  The game now uses
     public domain card images.

6.7  The strategy calculator now exits on entry of "0 0" for an
     individual dealer up card and player hand, simplifying automated
     batch runs.

6.6  The strategy calculator now displays all composition-dependent
     stand/hit strategy variations.  The card counting analyzer now
     supports computing and recording both basic and optimal expected
     values for each simulated round.

6.5  An additional program, count.exe, generates samples of simulated
     depleted shoes with corresponding expected values for analysis of
     card counting systems.  This program, and now also the game, use
     the Mersenne Twister random number generator for deck shuffling.

6.4  The game is now compatible with Windows Vista/7.

6.3  A bug in the recursive base case of the splitting algorithm has
     been fixed.  As a result, the strategy calculator now provides
     accurate results for "small" depleted shoes.

6.2  The game now provides the option to specify the payoff for
     blackjack.

6.1  An additional CDP1 strategy option for pair splitting optimizes for
     the first split hand, then applies that fixed strategy to all
     subsequent splits.

6.0  The algorithm for computing expected values for pair splitting has
     been completely reworked-- again.  Expected values are now exact
     for both CDZ- and CDP for splitting up to a maximum of 4 hands.

5.4  Several minor changes to the computation of dealer probabilities
     yield significant improvement in speed.

5.3  The engine interface now has options for specifying whether post-
     split strategy differs from pre-split (i.e., CDZ- vs. CDP),
     specifying the payoff for blackjack, and specifying "mixed"
     strategies that combine fixed stand/hit/etc. decisions with
     maximizing expected value.  Divide by zero bugs for small shoe
     sizes have also been fixed, as well as some code clean-up to
     improve readability.

5.2  Additional practice modes (-1, -2) play an entire shoe, but
     recompute expected value and/or optimal strategy before each hand.
     The game now runs in windowed mode rather than full screen.  The
     blackjack engine source code has been cleaned up without change to
     functionality.

5.1  The casino settings now include the option 'Practice' with default
     value 0.  Values 1, 2, and 3 indicate a practice mode where only
     hard, soft, and pair hands, respectively, will be dealt.

5.0  The algorithm for computing expected values for pair splitting has
     been completely reworked.  The specification of resplitting rules
     is more general, allowing a different maximum number of split hands
     for each pair (including no splits).  Expected values are exact
     when resplitting is not allowed.  All "private" data is now
     protected.

4.2  A bug in the algorithm for splitting expected values has been fixed.
     The hand data in BJDealer is now protected instead of private, and a
     bug in the game's help screen display has been fixed.

4.1  Expected values may now be computed using a sub-optimal playing
     strategy (e.g., "mimic the dealer").  The playing strategy, as well
     as rule variations and a progress indicator callback, are now
     specified as objects, allowing easier extensibility.  The player
     hand and expected value data in BJPlayer is now protected instead of
     private, and the class and method naming convention has been changed
     in anticipation of a possible port to Java.

4.0  The engine now accepts an arbitrary distribution of cards in the
     shoe, rather than an integral number of decks.  The engine classes
     are now const-correct, eliminating problems with compilers not
     supporting some standard extensions.  Also, the game now displays
     the help screen on startup.

3.1  Additional functions have been added to the engine for computing
     overall expected values; this additional information is included in
     the printable strategy table.  Also, the game now indicates when an
     incorrect play has been selected, giving you the opportunity to
     select the correct play.

3.0  The computational engine has been separated from the user interface.
     In addition to the text strategy calculator, a graphics blackjack
     game now allows you to play blackjack while displaying dealer
     probabilities and player expected values, using the same
     computational engine.

2.0  A completely new computational engine now computes exact
     probabilities and expected values for a given number of decks and
     rule variations.  The text interface now creates a printable table
     of basic strategy for all two-card player hands, as well as expected
     values for any individual player hand and dealer up card.

1.0  This first version uses an infinite deck approximation; i.e., the
     probability distribution of card values is not affected by removing
     cards from the shoe.  A text user interface creates a table of
     total-dependent basic strategy and dealer probabilities.