WOO logo

On this page

Programming Video Poker Code

Introduction

Programming Video Poker Code

Check out my instructional video on programming strategies for video poker.

Here’s the code that was created during the video tutorial.

#include <iostream>
#include <time.h>

struct card
{
int r;
int s;
};

void setup(void);
void deal(void);
void draw(int c1, int c2, int c3, int c4, int c5);
int score(card deal[]);

int score_array[2598960];
card deck[52];
int draw_combinations_array[] = { 1533939, 178365, 178365, 16215, 178365, 16215, 16215, 1081, 178365, 16215, 16215, 1081, 16215, 1081, 1081, 47, 178365, 16215, 16215, 1081, 16215, 1081, 1081, 47, 16215, 1081, 1081, 47, 1081, 47, 47, 1 };
int weighting_array[] = { 5, 43, 43, 473, 43, 473, 473, 7095, 43, 473, 473, 7095, 473, 7095, 7095, 163185, 43, 473, 473, 7095, 473, 7095, 7095, 163185, 473, 7095, 7095, 163185, 7095, 163185, 163185, 7669695 };
__int64 tot_combinations[52];

const char* hand_name_array[] = {
\"Loss\",\"Jacks or Better\",\"Two Pair\",\"Three of a Kind\",\"Straight\",\"Flush\",\"Full House\",\"Four of a Kind\",\"Straight Flush\",\"Royal Flush\",\"Total\" };
int win_array[] = { 0,1,2,3,4,6,9,25,50,800 };


int main()
{
time_t begtime, endtime;
begtime = time(NULL);
setup();
deal();
endtime = time(NULL);
printf(\"Total elapsed time=\t%i\ \", (int)endtime - (int)begtime);
}

void setup(void)
{
int i, c1, c2, c3, c4, c5, totalCount, scoreDealArray[52], score;
card deal[5];
for (i = 0; i <= 51; i++)
{
deck[i].r = (int)(i / 4);
deck[i].s = i % 4;
score_deal_array[i] = 0;
tot_combinations[i] = 0;
}
count = 0;
for (c1 = 0; c1 <= 47;c1++)
{
deal[0] = deck[c1];
for (c2 = c1 + 1; c2 <= 48; c2++)
{
deal[1] = deck[c2];
for (c3 = c2 + 1; c3 <= 49; c3++)
{
deal[2] = deck[c3];
for (c4 = c3 + 1; c4 <= 50; c4++)
{
deal[3] = deck[c4];
for (c5 = c4 + 1; c5 <= 51; c5++)
{
deal[4] = deck[c5];
sc = score(deal);
score_array[count] = sc;
score_deal_array[sc]++;
count++;
}
}
}
}
}
std::cerr << \"count = \\t\" << count << \"\ \";
for (i = 0; i <= 9; i++)
std::cerr << handNameArray[i] << \"\\t\" << scoreDealArray[i] << \"\ \";
}


void deal(void)
{
int i, c1, c2, c3, c4, c5;
int count = 0;
for (c1 = 0; c1 <= 47;c1++)
{
for (c2 = c1 + 1; c2 <= 48; c2++)
{
for (c3 = c2 + 1; c3 <= 49; c3++)
{
for (c4 = c3 + 1; c4 <= 50; c4++)
{
for (c5 = c4 + 1; c5 <= 51; c5++)
{
draw(c1,c2,c3,c4,c5);
count++;
if ((count % 1000)==0)
std::cerr << count << \"\ \";
}
}
}
}
}
for (i=9; i>=0; i--)
printf(\"%s\\t%i\\t%I64i\ \", handNameArray[i], winArray[i], totalCombinations[i]);
}

void draw(int c1, int c2, int c3, int c4, int c5)
{
int i,j, d1, d2, d3, d4, d5, idx, score, drawScoreArray[32][10];
int count = 0;
for (i = 0; i <= 31; i++)
{
for (j = 0; j <= 9; j++)
draw_score_array[i][j] = 0;
}
for (d1 = 0; d1 <= 47; d1++)
{
for (d2 = d1 + 1; d2 <= 48; d2++)
{
for (d3 = d2 + 1; d3 <= 49; d3++)
{
for (d4 = d3 + 1; d4 <= 50; d4++)
{
for (d5 = d4 + 1; d5 <= 51; d5++)
{
sc = score_array[count];
index = 0;
if ((d1 == c1) (d2 == c1) (d3 == c1) (d4 == c1) (d5 == c1))
index += 16;
if ((d1 == c2) (d2 == c2) (d3 == c2) (d4 == c2) (d5 == c2))
index += 8;
if ((d1 == c3) (d2 == c3) (d3 == c3) (d4 == c3) (d5 == c3))
index += 4;
if ((d1 == c4) (d2 == c4) (d3 == c4) (d4 == c4) (d5 == c4))
index += 2;
if ((d1 == c5) (d2 == c5) (d3 == c5) (d4 == c5) (d5 == c5))
index += 1;
draw_score_array[index][sc]++;
count++;
}
}
}
}
}
double ev;
double max_ev = 0;
int best_play = 0;
for (i = 0; i <= 31; i++)

ev = 0.0;
for (j = 0; j <= 9; j++)
ev += drawScoreArray[i][j] * winArray[j];
ev /= draw_combinations_array[i];
if (ev > max_ev)
{
max_ev = ev;
best_play = i;
}
}
for (j = 0; j <= 9; j++)
{
totalCombinations[j] += drawScoreArray[bestPlay][j] * weightingArray[bestPlay];
}
}

int score(card deal[])
{
int straight, flush;
if ((deal[0].s == deal[1].s) && (deal[0].s == deal[2].s) && (deal[0].s == deal[3].s) && (deal[0].s == deal[4].s))
flush = 1;
else
flush = 0;
if ((deal[0].r != deal[1].r) && (deal[1].r != deal[2].r) && (deal[2].r != deal[3].r) && (deal[3].r != deal[4].r))
{
if ((deal[0].r + 4) == deal[4].r)
straight = 1;
else if ((deal[4].r == 12) && (deal[3].r == 3)) // wheel
straight = 1;
else
straight = 0;
}
else
straight = 0;
if ((straight == 1) && (flush == 1))
{
if (deal[0].r == 8)
return 9;
else
return 8;
}
else if (flush == 1)
return 5;
else if (straight == 1)
return 4;
else if ((deal[0].r == deal[3].r) && (deal[1].r == deal[4].r))
return 7;
else if ((deal[0].r == deal[2].r) && (deal[3].r == deal[4].r))
return 6;
else if ((deal[0].r == deal[1].r) && (deal[2].r == deal[4].r))
return 6;
else if ((deal[0].r == deal[2].r) && (deal[1].r == deal[3].r) && (deal[2].r == deal[4].r))
return 3;
else if ((deal[0].r == deal[1].r) && (deal[2].r == deal[3].r))
return 2;
else if ((deal[0].r == deal[1].r) && (deal[3].r == deal[4].r))
return 2;
else if ((deal[1].r == deal[2].r) && (deal[3].r == deal[4].r))
return 2;
else if ((deal[0].r == deal[1].r) && (deal[0].r >= 9))
return 1;
else if ((deal[1].r == deal[2].r) && (deal[1].r >= 9))
return 1;
else if ((deal[2].r == deal[3].r) && (deal[2].r >= 9))
return 1;
else if ((deal[3].r == deal[4].r) && (deal[3].r >= 9))
return 1;
else
return 0;
}

Links

My Approach to Analyzing Video Poker Games .