WOO logo

Nesta página

Programação de código para vídeo pôquer -- Parte 2

Introdução

Programação de código para vídeo pôquer -- Parte 2

Este vídeo é o segundo de uma série de três partes sobre programação de video poker. Na primeira parte, eu construo o mecanismo básico, que levava 13,7 horas para rodar. Neste vídeo, adiciono atalhos para reduzir o tempo de execução para cerca de 42 minutos.

Segue abaixo o código desenvolvido no vídeo.

#incluir <iostream>
#incluir <tempo.h>

cartão de estrutura
{
int r;
int s;
};

configuração vazia(vazio);
acordo nulo(nulo);
void predraw(int rank1, int rank2, int rank3, int rank4, int rank5, int suit1, int suit2, int suit3, int suit4, int suit5, int weight);
void desenhar(int c1, int c2, int c3, int c4, int c5, int peso);
int score(card deal[]);

int score_array[2598960];
baralho de cartas[52];
int draw_combinations_array[] = { 1533939, 178365, 178365, 16215, 178365, 16215, 16215, 1081, 178365, 16215, 16215, 1081, 16215, 1081, 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_combinações[52];
int peso_total = 0;

const char* hand_name_array[] = {
"Perda","Valetes ou melhor","Dois pares","Trinca","Sequência","Flush","Full house","Quadra","Sequência de flush","Royal flush","Total" };
int win_array[] = { 0,1,2,3,4,6,9,25,50,800 };


int main()
{
tempo_t início, fim;
tempo_inicial = tempo(NULL);
configurar();
negócio();
tempo_fim = tempo(NULL);
printf("Total de segundos=\t%i\n", (int)endtime - (int)begtime);
}

configuração vazia(vazio)
{
int i, c1, c2, c3, c4, c5, count, score_deal_array[52], sc;
distribuição de cartas[5];
para (i = 0; i <= 51; i++)
{
deck[i].r = (int)(i / 4);
deck[i].s = i % 4;
score_deal_array[i] = 0;
tot_combinações[i] = 0;
}
contagem = 0;
para (c1 = 0; c1 <= 47; c1++)
{
deal[0] = deck[c1];
para (c2 = c1 + 1; c2 <= 48; c2++)
{
deal[1] = deck[c2];
para (c3 = c2 + 1; c3 <= 49; c3++)
{
deal[2] = deck[c3];
para (c4 = c3 + 1; c4 <= 50; c4++)
{
deal[3] = deck[c4];
para (c5 = c4 + 1; c5 <= 51; c5++)
{
deal[4] = deck[c5];
sc = pontuação(negócio);
matriz_pontuação[contagem] = sc;
matriz_de_acordo_pontuação[sc]++;
contar++;
}
}
}
}
}
// std::cerr << "count =\t" << count << "\n";
// para (i = 0; i <= 9; i++)
// std::cerr << hand_name_array[i] << "\t" << score_deal_array[i] << "\n";
}


acordo nulo(nulo)
{
/* int i, c1, c2, c3, c4, c5;
int contagem = 0;
para (c1 = 0; c1 <= 47; c1++)
{
para (c2 = c1 + 1; c2 <= 48; c2++)
{
para (c3 = c2 + 1; c3 <= 49; c3++)
{
para (c4 = c3 + 1; c4 <= 50; c4++)
{
para (c5 = c4 + 1; c5 <= 51; c5++)
{
desenhar(c1, c2, c3, c4, c5);
contar++;
se ((contagem % 1000) == 0)
std::cerr << count << "\n";
}
}
}
}
} */
int i,r1, r2,r3,r4,r5;
// Quatro de um mesmo tipo
para (r1 = 0; r1 <= 12; r1++)
{
para (r2 = 0; r2 <= 12; r2++)
{
se (r1 != r2)
{
pré-desenhar(r1, r1, r1, r1, r2, 0, 1, 2, 3, 0, 4);
}
}
}
// Casa cheia
para (r1 = 0; r1 <= 12; r1++)
{
para (r2 = 0; r2 <= 12; r2++)
{
se (r1 != r2)
{
pré-desenhar(r1, r1, r1, r2, r2, 0, 1, 2, 0, 1, 12);
pré-desenhar(r1, r1, r1, r2, r2, 0, 1, 2, 0, 3, 12);
}
}
}
// três de um tipo
para (r1 = 0; r1 <= 12; r1++) // três de um tipo
{
para (r2 = 0; r2 <= 11; r2++) // primeiro singleton
{
para (r3 = r2 + 1; r3 <= 12; r3++) // segundo singleton
{
se ((r1 != r2) && (r1!=r3))
{
pré-desenhar(r1, r1, r1, r2, r3, 0, 1, 2, 0, 0, 12);
pré-desenhar(r1, r1, r1, r2, r3, 0, 1, 2, 3, 3, 4);
pré-desenhar(r1, r1, r1, r2, r3, 0, 1, 2, 0, 1, 24);
pré-desenhar(r1, r1, r1, r2, r3, 0, 1, 2, 0, 3, 12);
pré-desenhar(r1, r1, r1, r2, r3, 0, 1, 2, 3, 0, 12);
}
}
}
}
// dois pares
para (r1 = 0; r1 <= 12; r1++) // singleton
{
para (r2 = 0; r2 <= 11; r2++) // par 1
{
para (r3 = r2 + 1; r3 <= 12; r3++) // par 2
{
se ((r1 != r2) && (r1 != r3))
{
pré-desenhar(r1, r2, r2, r3, r3, 0, 0, 1, 0, 1, 12);
pré-desenhar(r1, r2, r2, r3, r3, 2, 0, 1, 0, 1, 12);
pré-desenhar(r1, r2, r2, r3, r3, 0, 0, 1, 2, 3, 12);
pré-desenhar(r1, r2, r2, r3, r3, 2, 0, 1, 2, 3, 12);
pré-desenhar(r1, r2, r2, r3, r3, 0, 0, 1, 0, 2, 24);
pré-desenhar(r1, r2, r2, r3, r3, 1, 0, 1, 0, 2, 24);
pré-sorteio(r1, r2, r2, r3, r3, 2, 0, 1, 0, 2, 24);
pré-desenhar(r1, r2, r2, r3, r3, 3, 0, 1, 0, 2, 24);
}
}
}
}
// um par
para (r1 = 0; r1 <= 12; r1++) // par
{
std::cerr << "Um par\t" << r1 << "\n";
para (r2 = 0; r2 <= 10; r2++) // singleton 1
{
para (r3 = r2 + 1; r3 <= 11; r3++)// singleton 2
{
para (r4 = r3 + 1; r4 <= 12; r4++) // singleton 3
{
se ((r1 != r2) && (r1 != r3) && (r1 != r4))
{
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 0, 0, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 2, 2, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 0, 1, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 1, 0, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 1, 0, 0, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 2, 3, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 3, 2, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 3, 2, 2, 12);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 0, 2, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 2, 0, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 0, 0, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 2, 2, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 0, 2, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 2, 0, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 1, 2, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 2, 1, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 0, 1, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 0, 2, 3, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 0, 3, 24);
pré-desenhar(r1, r1, r2, r3, r4, 0, 1, 2, 3, 0, 24);
}
}
}
}
}
// cinco singletons
para (r1 = 0; r1 <= 8; r1++)
{
std::cerr << "Cinco singletons\t" << r1 << "\n";
para (r2 = r1+1; r2 <= 9; r2++)
{
para (r3 = r2 + 1; r3 <= 10; r3++)
{
para (r4 = r3 + 1; r4 <= 11; r4++)
{
para (r5 = r4 + 1; r5 <= 12; r5++)
{
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 0, 0, 0, 4);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 0, 0, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 0, 0, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 1, 0, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 0, 1, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 0, 0, 1, 12);
pré-desenho(r1, r2, r3, r4, r5, 0, 0, 0, 1, 1, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 1, 0, 1, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 1, 1, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 0, 0, 1, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 0, 1, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 1, 0, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 0, 0, 1, 12);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 0, 1, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 1, 0, 0, 12);
pré-sorteio(r1, r2, r3, r4, r5, 1, 1, 0, 0, 0, 12);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 0, 1, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 0, 1, 0, 2, 24);
pré-desenhar(r1, r2, r3, r4, r5, 0, 0, 1, 2, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 0, 0, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 1, 0, 2, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 2, 0, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 0, 0, 2, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 0, 2, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 2, 0, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 2, 0, 0, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 1, 2, 2, 24);
pré-desenhar(r1, r2, r3, r4, r5, 0, 1, 2, 1, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 1, 2, 2, 1, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 0, 1, 2, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 0, 2, 1, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 0, 2, 2, 1, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 1, 0, 2, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 2, 0, 1, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 2, 0, 2, 1, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 1, 2, 0, 2, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 2, 1, 0, 2, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 2, 2, 0, 1, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 1, 2, 2, 0, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 2, 1, 2, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 2, 2, 1, 0, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 0, 1, 2, 3, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 1, 0, 2, 3, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 1, 2, 0, 3, 24);
pré-sorteio(r1, r2, r3, r4, r5, 0, 1, 2, 3, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 0, 0, 2, 3, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 0, 2, 0, 3, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 0, 2, 3, 0, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 2, 0, 0, 3, 24);
pré-sorteio(r1, r2, r3, r4, r5, 1, 2, 0, 3, 0, 24);
pré-desenhar(r1, r2, r3, r4, r5, 1, 2, 3, 0, 0, 24);
}
}
}
}
}
printf("Peso total=\t%i\n", peso_total);
para (i = 9; i >= 0; i--)
printf("%s\t%i\t%I64i\n", hand_name_array[i], win_array[i], tot_combinations[i]);
}

void predraw(int rank1, int rank2, int rank3, int rank4, int rank5, int suit1, int suit2, int suit3, int suit4, int suit5, int weight)
{
int c1, c2, c3, c4, c5;
c1 = rank1 * 4 + naipe1;
c2 = rank2 * 4 + naipe2;
c3 = classificação3 * 4 + naipe3;
c4 = rank4 * 4 + naipe4;
c5 = rank5 * 4 + naipe5;
peso_total += peso;
desenhar(c1, c2, c3, c4, c5, peso);
}

void desenhar(int c1, int c2, int c3, int c4, int c5, int peso)
{
int i, j, d1, d2, d3, d4, d5, index, sc, draw_score_array[32][10];
int contagem = 0;
para (i = 0; i <= 31; i++)
{
para (j = 0; j <= 9; j++)
draw_score_array[i][j] = 0;
}
para (d1 = 0; d1 <= 47; d1++)
{
para (d2 = d1 + 1; d2 <= 48; d2++)
{
para (d3 = d2 + 1; d3 <= 49; d3++)
{
para (d4 = d3 + 1; d4 <= 50; d4++)
{
para (d5 = d4 + 1; d5 <= 51; d5++)
{
sc = matriz_pontuação[contagem];
índice = 0;
se ((d1 == c1) || (d2 == c1) || (d3 == c1) || (d4 == c1) || (d5 == c1))
índice += 16;
se ((d1 == c2) || (d2 == c2) || (d3 == c2) || (d4 == c2) || (d5 == c2))
índice += 8;
se ((d1 == c3) || (d2 == c3) || (d3 == c3) || (d4 == c3) || (d5 == c3))
índice += 4;
se ((d1 == c4) || (d2 == c4) || (d3 == c4) || (d4 == c4) || (d5 == c4))
índice += 2;
se ((d1 == c5) || (d2 == c5) || (d3 == c5) || (d4 == c5) || (d5 == c5))
índice += 1;
desenhar_matriz_de_pontuação[índice][sc]++;
contar++;
}
}
}
}
}
duplo ev;
double max_ev = 0;
int melhor_jogada = 0;
para (i = 0; i <= 31; i++)
{
ev = 0,0;
para (j = 0; j <= 9; j++)
ev += draw_score_array[i][j] * win_array[j];
ev /= draw_combinations_array[i];
se (ev > max_ev)
{
max_ev = ev;
melhor_jogada = i;
}
}
para (j = 0; j <= 9; j++)
{
tot_combinations[j] += weight*draw_score_array[best_play][j] * weighting_array[best_play];
}
}

int score(card deal[])
{
int reto, nivelado;
se ((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;
outro
flush = 0;
se ((deal[0].r != deal[1].r) && (deal[1].r != deal[2].r) && (deal[2].r != deal[3].r) && (deal[3].r != deal[4].r))
{
se ((deal[0].r + 4) == deal[4].r)
reto = 1;
senão se ((deal[4].r == 12) && (deal[3].r == 3)) // roda
reto = 1;
outro
reto = 0;
}
outro
reto = 0;
se ((straight == 1) && (flush == 1))
{
se (deal[0].r == 8)
retornar 9;
outro
retornar 8;
}
senão se (flush == 1)
retornar 5;
senão se (reto == 1)
retornar 4;
senão se ((deal[0].r == deal[3].r) || (deal[1].r == deal[4].r))
retornar 7;
senão se ((deal[0].r == deal[2].r) && (deal[3].r == deal[4].r))
retornar 6;
senão se ((deal[0].r == deal[1].r) && (deal[2].r == deal[4].r))
retornar 6;
senão se ((deal[0].r == deal[2].r) || (deal[1].r == deal[3].r) || (deal[2].r == deal[4].r))
retornar 3;
senão se ((deal[0].r == deal[1].r) && (deal[2].r == deal[3].r))
retornar 2;
senão se ((deal[0].r == deal[1].r) && (deal[3].r == deal[4].r))
retornar 2;
senão se ((deal[1].r == deal[2].r) && (deal[3].r == deal[4].r))
retornar 2;
senão se ((deal[0].r == deal[1].r) && (deal[0].r >= 9))
retornar 1;
senão se ((deal[1].r == deal[2].r) && (deal[1].r >= 9))
retornar 1;
senão se ((deal[2].r == deal[3].r) && (deal[2].r >= 9))
retornar 1;
senão se ((deal[3].r == deal[4].r) && (deal[3].r >= 9))
retornar 1;
outro
retornar 0;
}