Three Card Poker Analysis
Here is the code created in the video.
#include#include #include #include #include #include using namespace std; struct card { int r; int s; }; void set_array(void); int score(int p1, int p2, int p3); void dealer(int p1, int p2, int p3, int psc, int event_array[]); int score_array[22100]; card deck[52]; void main() { int i, p1, p2, p3, sc, cat, pairplus_array[6], event_array[4],tot_ante_bonus[6]; int ante_bonus_pay[] = { 0,0,0,1,4,5 }; __int64 tot_event_array[6]; string hand_name[] = { "Three singletons","Pair","Flush","Straight","Three of a kind","Straight flush" }; string event_name[] = { "Player win","Dealer doesn't qualify","Tie","Dealer win","Player folds" }; int index = 0; double ev = 0; for (i = 0; i < 6; i++) { tot_ante_bonus[i] = 0; pairplus_array[i] = 0; tot_event_array[i] = 0; } for (i = 0; i < 51; i++) { deck[i].r = (int)(i / 4); deck[i].s = i % 4; } set_array(); for (p1 = 0; p1 <= 49; p1++) { for (p2 = p1 + 1; p2 <= 50; p2++) { for (p3 = p2 + 1; p3 <= 51; p3++) { sc = score_array[index]; cat = (int)sc / 2197; pairplus_array[cat]++; dealer(p1, p2, p3, sc, event_array); ev = (2.0 * (double)event_array[0] + (double)event_array[1] - 2.0 * (double)event_array[3]) / 18424.0; ev += ante_bonus_pay[cat]; if (ev < -1) // fold { tot_event_array[4] += 18424; } else { for (i = 0; i <= 3; i++) tot_event_array[i] += event_array[i]; tot_ante_bonus[cat]++; } index++; } } } printf("Pairplus Analysis\n"); for (i = 0; i < 6; i++) printf("%s\t%i\n", hand_name[i].c_str(), pairplus_array[i]); printf("\nAnte Analysis\n"); for (i = 0; i <=4; i++) printf("%s\t%I64i\t%f\n", event_name[i].c_str(), tot_event_array[i],(double)tot_event_array[i]/22100.0/18424.0); double game_ev = (2.0 * (double)tot_event_array[0] + (double)tot_event_array[1] - 2.0 * (double)tot_event_array[3] - (double)tot_event_array[4]) / 22100.0 / 18424.0; printf("Game expected value w/o Ante Bonus=\t%f\n",game_ev ); for (i = 0; i <= 5; i++) game_ev += ante_bonus_pay[i] * tot_ante_bonus[i] / 22100.0; printf("Game expected value w/ Ante Bonus=\t%f\n", game_ev); } void dealer(int p1, int p2, int p3, int psc, int event_array[]) { int d1, d2, d3, i,dsc; int index = 0; for (i = 0; i <= 3; i++) event_array[i] = 0; for (d1 = 0; d1 <= 49; d1++) { for (d2 = d1 + 1; d2 <= 50; d2++) { for (d3 = d2 + 1; d3 <= 51; d3++) { if ((d1 != p1) && (d1 != p2) && (d1 != p3) && (d2 != p1) && (d2 != p2) && (d2 != p3) && (d3 != p1) && (d3 != p2) && (d3 != p3)) { dsc = score_array[index]; if (dsc < 1703) // dealer does not qualify event_array[1]++; else if (psc>dsc) event_array[0]++; else if (psc < dsc) event_array[3]++; else event_array[2]++; } index++; } } } } void set_array(void) { int p1, p2, p3,sc; int index = 0; for (p1 = 0; p1 <= 49; p1++) { for (p2 = p1 + 1; p2 <= 50; p2++) { for (p3 = p2 + 1; p3 <= 51; p3++) { sc = score(p1, p2, p3); score_array[index] = sc; index++; } } } } int score(int p1, int p2, int p3) { int flush, straight; card hand[3]; hand[0].r = (int)(p1 / 4); hand[1].r = (int)(p2 / 4); hand[2].r = (int)(p3 / 4); hand[0].s = p1 % 4; hand[1].s = p2 % 4; hand[2].s = p3 % 4; if ((hand[0].s == hand[1].s) && (hand[1].s == hand[2].s)) flush = 169 * hand[2].r + 13 * hand[1].r + hand[0].r; else flush = 0; if ((hand[2].r - hand[1].r == 1) && (hand[1].r - hand[0].r == 1)) straight = hand[2].r; else if ((hand[2].r == 12) && (hand[1].r == 1) && (hand[0].r == 0)) straight = 1; else straight = 0; if ((straight > 0) && (flush > 0)) return 2197 * 5 + straight; else if (hand[2].r == hand[0].r) return 2197 * 4 + hand[0].r; else if (straight > 0) return 2197 * 3 + straight; else if (flush > 0) return 2197 * 2 + flush; else if (hand[2].r == hand[1].r) return 2197 + 13 * hand[1].r + hand[0].r; else if (hand[0].r == hand[1].r) return 2197 + 13 * hand[1].r + hand[2].r; else return 169 * hand[2].r + 13 * hand[1].r + hand[0].r; }