WOO logo

Tällä sivulla

Videopokerin ohjelmointikoodi -- Osa 2

Johdanto

Videopokerin ohjelmointikoodi -- Osa 2

Tämä video on toinen osa kolmiosaisesta videopokerin ohjelmointia käsittelevästä sarjasta. Ensimmäisessä osassa rakennan perusmoottorin, jonka suorittaminen näyttää vievän 13,7 tuntia. Tässä videossa lisään oikopolkuja, jotta suoritusaika lyhenee noin 42 minuuttiin.

Seuraavassa on videolla kehitetty koodi.

#sisältää <iostream>
#include <aika.h>

rakennekortti
{
int r;
kokonaisluku s;
};

void setup(void);
mitätön sopimus(mitätön);
void predraw(int rank1, int rank2, int rank3, int rank4, int rank5, int maa1, int maa2, int maa3, int maa4, int maa5, int paino);
void piirtää(int c1, int c2, int c3, int c4, int c5, int paino);
int pisteet(kortinjako[]);

int pisteet_taulukko[2598960];
korttipakka[52];
int piirrä_yhdistelmät_taulukko[] = { 1533939, 178365, 178365, 16215, 178365, 16215, 16215, 16215, 1081, 178365, 16215, 16215, 1081, 16215, 1081, 1081, 47, 178365, 16215, 16215, 1081, 16215, 1081, 1081, 47, 16215, 1081, 1081, 47, 16215, 1081, 1081, 47, 1081, 47, 47, 1 };
int painotustaulukko[] = { 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 yhdistelmät yhteensä[52];
int kokonaispaino = 0;

vakio char* käden_nimi_taulukko[] = {
"Häviö", "Jätkät tai parempi", "Kaksi paria", "Kolmoset", "Suora", "Värisuora", "Täyskäsi", "Neljä samanlaista", "Värisuora", "Kuningasvärisuora", "Yhteensä" };
int voittotaulukko[] = { 0,1,2,3,4,6,9,25,50,800 };


kokonaisluku pää()
{
time_t alkamisaika, päättymisaika;
aloitusaika = aika(NULL);
asennus();
sopimus();
lopetusaika = aika(NULL);
printf("Yhteensä sekunnit=\t%i\n", (int)loppumisaika - (int)alkuaika);
}

mitätön asetus(mitätön)
{
kokonaisluku i, c1, c2, c3, c4, c5, määrä, pistemääräjakotaulukko[52], sc;
kortin jako[5];
for (i = 0; i <= 51; i++)
{
pakka[i].r = (kokonaisluku)(i / 4);
kansi[i].s = i % 4;
pisteet_sopimus_taulukko[i] = 0;
yhd_yhd_yksik_[i] = 0;
}
määrä = 0;
for (c1 = 0; c1 <= 47;c1++)
{
jako[0] = pakka[c1];
for (c2 = c1 + 1; c2 <= 48; c2++)
{
jako[1] = pakka[c2];
for (c3 = c2 + 1; c3 <= 49; c3++)
{
jako[2] = pakka[c3];
for (c4 = c3 + 1; c4 <= 50; c4++)
{
jako[3] = pakka[c4];
for (c5 = c4 + 1; c5 <= 51; c5++)
{
jako[4] = pakka[c5];
sc = pisteet(sopimus);
pisteet_taulukko[määrä] = sc;
pisteet_osuus_taulukko[sc]++;
määrä++;
}
}
}
}
}
// std::cerr << "määrä =\t" << määrä << "\n";
// for (i = 0; i <= 9; i++)
// std::cerr << käden_nimi_taulukko[i] << "\t" << pisteet_jakauman_taulukko[i] << "\n";
}


mitätön sopimus (mitätön)
{
/* kokonaisluku i, c1, c2, c3, c4, c5;
kokonaislukumäärä = 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++)
{
piirrä(c1, c2, c3, c4, c5);
määrä++;
jos ((määrä % 1000) == 0)
std::cerr << määrä << "\n";
}
}
}
}
} */
kokonaisluku i, r1, r2, r3, r4, r5;
// Neloset
kun (r1 = 0; r1 <= 12; r1++)
{
kun (r2 = 0; r2 <= 12; r2++)
{
jos (r1 != r2)
{
predraw(r1, r1, r1, r1, r2, 0, 1, 2, 3, 0, 4);
}
}
}
// täysi talo
kun (r1 = 0; r1 <= 12; r1++)
{
kun (r2 = 0; r2 <= 12; r2++)
{
jos (r1!= r2)
{
predraw(r1, r1, r1, r2, r2, 0, 1, 2, 0, 1, 12);
predraw(r1, r1, r1, r2, r2, 0, 1, 2, 0, 3, 12);
}
}
}
// kolmoset
for (r1 = 0; r1 <= 12; r1++) // kolmoset
{
for (r2 = 0; r2 <= 11; r2++) // ensimmäinen singleton
{
for (r3 = r2 + 1; r3 <= 12; r3++) // toinen singleton
{
jos ((r1 != r2) && (r1 !=r3))
{
predraw(r1, r1, r1, r2, r3, 0, 1, 2, 0, 0, 12);
predraw(r1, r1, r1, r2, r3, 0, 1, 2, 3, 3, 4);
predraw(r1, r1, r1, r2, r3, 0, 1, 2, 0, 1, 24);
predraw(r1, r1, r1, r2, r3, 0, 1, 2, 0, 3, 12);
predraw(r1, r1, r1, r2, r3, 0, 1, 2, 3, 0, 12);
}
}
}
}
// kaksi paria
for (r1 = 0; r1 <= 12; r1++) // singleton
{
for (r2 = 0; r2 <= 11; r2++) // pari 1
{
for (r3 = r2 + 1; r3 <= 12; r3++) // pari 2
{
jos ((r1 != r2) && (r1 != r3))
{
predraw(r1, r2, r2, r3, r3, 0, 0, 1, 0, 1, 12);
predraw(r1, r2, r2, r3, r3, 2, 0, 1, 0, 1, 12);
predraw(r1, r2, r2, r3, r3, 0, 0, 1, 2, 3, 12);
predraw(r1, r2, r2, r3, r3, 2, 0, 1, 2, 3, 12);
predraw(r1, r2, r2, r3, r3, 0, 0, 1, 0, 2, 24);
predraw(r1, r2, r2, r3, r3, 1, 0, 1, 0, 2, 24);
predraw(r1, r2, r2, r3, r3, 2, 0, 1, 0, 2, 24);
predraw(r1, r2, r2, r3, r3, 3, 0, 1, 0, 2, 24);
}
}
}
}
// yksi pari
for (r1 = 0; r1 <= 12; r1++) // pari
{
std::cerr << "Yksi pari\t" << r1 << "\n";
for (r2 = 0; r2 <= 10; r2++) // singleton 1
{
for (r3 = r2 + 1; r3 <= 11; r3++)// singleton 2
{
for (r4 = r3 + 1; r4 <= 12; r4++) // singleton 3
{
jos ((r1 != r2) && (r1 != r3) && (r1 != r4))
{
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 0, 0, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 2, 2, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 0, 1, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 1, 0, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 1, 0, 0, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 2, 3, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 3, 2, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 3, 2, 2, 12);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 0, 2, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 2, 0, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 0, 0, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 2, 2, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 0, 2, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 2, 0, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 1, 2, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 2, 1, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 0, 1, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 0, 2, 3, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 0, 3, 24);
predraw(r1, r1, r2, r3, r4, 0, 1, 2, 3, 0, 24);
}
}
}
}
}
// viisi singletonia
kun (r1 = 0; r1 <= 8; r1++)
{
std::cerr << "Viisi yksittäistä yksikköä\t" << r1 << "\n";
kun (r2 = r1+1; r2 <= 9; r2++)
{
for (r3 = r2 + 1; r3 <= 10; r3++)
{
kun (r4 = r3 + 1; r4 <= 11; r4++)
{
kun (r5 = r4 + 1; r5 <= 12; r5++)
{
predraw(r1, r2, r3, r4, r5, 0, 0, 0, 0, 0, 4);
predraw(r1, r2, r3, r4, r5, 1, 0, 0, 0, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 1, 0, 0, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 0, 1, 0, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 0, 0, 1, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 0, 0, 0, 1, 12);
esidraw(r1, r2, r3, r4, r5, 0, 0, 0, 1, 1, 12);
predraw(r1, r2, r3, r4, r5, 0, 0, 1, 0, 1, 12);
predraw(r1, r2, r3, r4, r5, 0, 0, 1, 1, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 1, 0, 0, 1, 12);
predraw(r1, r2, r3, r4, r5, 0, 1, 0, 1, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 1, 1, 0, 0, 12);
predraw(r1, r2, r3, r4, r5, 1, 0, 0, 0, 1, 12);
predraw(r1, r2, r3, r4, r5, 1, 0, 0, 1, 0, 12);
predraw(r1, r2, r3, r4, r5, 1, 0, 1, 0, 0, 12);
predraw(r1, r2, r3, r4, r5, 1, 1, 0, 0, 0, 12);
predraw(r1, r2, r3, r4, r5, 0, 0, 0, 1, 2, 24);
predraw(r1, r2, r3, r4, r5, 0, 0, 1, 0, 2, 24);
predraw(r1, r2, r3, r4, r5, 0, 0, 1, 2, 0, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 0, 0, 2, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 0, 2, 0, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 2, 0, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 0, 0, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 0, 2, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 2, 0, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 0, 0, 0, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 1, 2, 2, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 2, 1, 2, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 2, 2, 1, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 1, 2, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 2, 1, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 2, 2, 1, 24);
predraw(r1, r2, r3, r4, r5, 1, 1, 0, 2, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 0, 1, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 0, 2, 1, 24);
predraw(r1, r2, r3, r4, r5, 1, 1, 2, 0, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 1, 0, 2, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 2, 0, 1, 24);
predraw(r1, r2, r3, r4, r5, 1, 1, 2, 2, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 1, 2, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 2, 1, 0, 24);
predraw(r1, r2, r3, r4, r5, 0, 0, 1, 2, 3, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 0, 2, 3, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 2, 0, 3, 24);
predraw(r1, r2, r3, r4, r5, 0, 1, 2, 3, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 0, 2, 3, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 2, 0, 3, 24);
predraw(r1, r2, r3, r4, r5, 1, 0, 2, 3, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 0, 0, 3, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 0, 3, 0, 24);
predraw(r1, r2, r3, r4, r5, 1, 2, 3, 0, 0, 24);
}
}
}
}
}
printf("Kokonaispaino=\t%i\n", kokonaispaino);
for (i = 9; i >= 0; i--)
printf("%s\t%i\t%I64i\n", käden_nimi_taulukko[i], voittotaulukko[i], yhdistelmät_yhteensä[i]);
}

void predraw(int rank1, int rank2, int rank3, int rank4, int rank5, int maa1, int maa2, int maa3, int maa4, int maa5, int paino)
{
kokonaisluku c1, c2, c3, c4, c5;
c1 = arvo1 * 4 + maa1;
c2 = sijoitus2 * 4 + maa2;
c3 = arvo3 * 4 + puku3;
c4 = sijoitus4 * 4 + maa4;
c5 = sijoitus5 * 4 + maa5;
kokonaispaino += paino;
piirrä(c1, c2, c3, c4, c5, paino);
}

void draw(int c1, int c2, int c3, int c4, int c5, int paino)
{
kokonaisluku i, j, d1, d2, d3, d4, d5, indeksi, sc, piirrä_pisteet_taulukko[32][10];
kokonaislukumäärä = 0;
for (i = 0; i <= 31; i++)
{
for (j = 0; j <= 9; j++)
piirrä_pisteet_taulukko[i][j] = 0;
}
for (d1 = 0; d1 <= 47; d1++)
{
for (d2 = d1 + 1; d2 <= 48; d2++)
{
kohteelle (d3 = d2 + 1; d3 <= 49; d3++)
{
for (d4 = d3 + 1; d4 <= 50; d4++)
{
for (d5 = d4 + 1; d5 <= 51; d5++)
{
sc = pisteet_taulukko[määrä];
indeksi = 0;
if ((d1 == c1) || (d2 == c1) || (d3 == c1) || (d4 == c1) || (d5 == c1))
indeksi += 16;
jos ((d1 == c2) || (d2 == c2) || (d3 == c2) || (d4 == c2) || (d5 == c2))
indeksi += 8;
jos ((d1 == c3) || (d2 == c3) || (d3 == c3) || (d4 == c3) || (d5 == c3))
indeksi += 4;
jos ((d1 == c4) || (d2 == c4) || (d3 == c4) || (d4 == c4) || (d5 == c4))
indeksi += 2;
jos ((d1 == c5) || (d2 == c5) || (d3 == c5) || (d4 == c5) || (d5 == c5))
indeksi += 1;
piirrä_pisteet_taulukko[indeksi][sc]++;
määrä++;
}
}
}
}
}
kaksinkertainen ev;
kaksinkertainen max_ev = 0;
int paras_peli = 0;
for (i = 0; i <= 31; i++)
{
e = 0,0;
for (j = 0; j <= 9; j++)
ev += piirrä_pisteet_taulukko[i][j] * voitto_taulukko[j];
ev /= piirrä_yhdistelmätaulukko[i];
jos (arvo > maks._arvo)
{
maks_arvo = arvo;
paras_peli = i;
}
}
for (j = 0; j <= 9; j++)
{
tot_combinations[j] += paino*tasaustulostaulukko[paras_peli][j] * painotustaulukko[paras_peli];
}
}

int score(korttijako[])
{
suora, tasainen;
jos ((sopimus[0].s == sopimus[1].s) && (sopimus[0].s == sopimus[2].s) && (sopimus[0].s == sopimus[3].s) && (sopimus[0].s == sopimus[4].s))
huuhtelu = 1;
muu
huuhtelu = 0;
jos ((sopimus[0].r != sopimus[1].r) && (sopimus[1].r != sopimus[2].r) && (sopimus[2].r != sopimus[3].r) && (sopimus[3].r != sopimus[4].r))
{
jos ((sopimus[0].r + 4) == sopimus[4].r)
suora = 1;
muuten jos ((deal[4].r == 12) && (deal[3].r == 3)) // pyörä
suora = 1;
muu
suora = 0;
}
muu
suora = 0;
jos ((suora == 1) && (värisuora == 1))
{
jos (deal[0].r == 8)
paluu 9;
muu
paluu 8;
}
muuten jos (flush == 1)
paluu 5;
muuten jos (suora == 1)
paluu 4;
muuten jos ((sopimus[0].r == sopimus[3].r) || (sopimus[1].r == sopimus[4].r))
paluu 7;
muuten jos ((sopimus[0].r == sopimus[2].r) && (sopimus[3].r == sopimus[4].r))
paluu 6;
muuten jos ((sopimus[0].r == sopimus[1].r) && (sopimus[2].r == sopimus[4].r))
paluu 6;
muuten jos ((sopimus[0].r == sopimus[2].r) || (sopimus[1].r == sopimus[3].r) || (sopimus[2].r == sopimus[4].r))
paluu 3;
muuten jos ((sopimus[0].r == sopimus[1].r) && (sopimus[2].r == sopimus[3].r))
paluu 2;
muuten jos ((sopimus[0].r == sopimus[1].r) && (sopimus[3].r == sopimus[4].r))
paluu 2;
muuten jos ((sopimus[1].r == sopimus[2].r) && (sopimus[3].r == sopimus[4].r))
paluu 2;
muuten jos ((deal[0].r == deal[1].r) && (deal[0].r >= 9))
paluu 1;
muuten jos ((deal[1].r == deal[2].r) && (deal[1].r >= 9))
paluu 1;
muuten jos ((deal[2].r == deal[3].r) && (deal[2].r >= 9))
paluu 1;
muuten jos ((deal[3].r == deal[4].r) && (deal[3].r >= 9))
paluu 1;
muu
palauta 0;
}