Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 11 Junio 2016, 20:28 pm



Título: [Aporte] Codigo para determinar el numero de barajas usadas en el juego de 21
Publicado por: AlbertoBSD en 11 Junio 2016, 20:28 pm
Muy buen dia.

Estaba pensando que es posible determinar el numero de barajas usadas en un mazo de juego de 21.

Las condiciones que se tienen que dar para poder determinar el numero exacto de barajas son las siguientes.

  • El mazo de cartas solo se renueva cuando se terminan las cartas del mazo actual
  • Se tiene conocimiento pleno de todas las cartas que se han repartido desde el principio del juego
  • Las cartas ya usadas NO se reciclan, (Condicion igual a la UNO pero solo para dejarlo mas claro)

Dada las condiciones anteriores podemos saber cuantas barajas son usadas para crear el mazo de juego.

Vamos a obviar el contenido de algunas fuciones y solo tendremos:

Código
  1. int main() {
  2. struct mazo *mazo_juego = crear_mazo(6); // Se crea un mazo con 6 barajas
  3. struct carta *siguiente = NULL;
  4. int contador = 0;
  5. int acumulador = 0;
  6. siguiente = siguiente_carta(mazo_juego); //Se comienza caon la primera carta
  7. while(siguiente != NULL) {
  8. acumulador += valor_conteo(siguiente); //Acumulador va acumulando el conteo de cartas +1 para cartas del 2 al 6 y -1 para cartas del 10 al K + el A
  9. if(contador > 0 && (contador % 52) == 0 && acumulador == 0) {
  10. printf("mazo nuevo\n");
  11. printf("Cantidad de Barajas %i\n",(contador/52));
  12. contador = 0;
  13. }
  14. contador++;
  15. siguiente = siguiente_carta(mazo_juego);
  16.  
  17. }
  18. }

La funcion valor conteo es la siguiente:

Código
  1. int valor_conteo(struct carta *actual) {
  2. int r = 0;
  3. switch(actual->figura) {
  4. case 'A':
  5. case 'K':
  6. case 'Q':
  7. case 'J':
  8. case '0':
  9. r = -1;
  10. break;
  11. case '2':
  12. case '3':
  13. case '4':
  14. case '5':
  15. case '6':
  16. r = 1;
  17. break;
  18. }
  19. //printf("valor de conteo de %c es %i\n",actual->figura,r);
  20. return r;
  21. }

La estructura de una carta es la siguiente:

Código
  1. struct carta {
  2. char figura;
  3. char tipo;
  4. };


La condicion para saber el numero de barajas es la siguiente:

Código
  1. if(contador > 0 && (contador % 52) == 0 && acumulador == 0)

Lo que quiere decir que:

  • El contatador de cartas debe de ser mayor a 0 y cada que determinemos que es un "mazo nuevo" reiniciarlo a 0
  • El contador debe de ser un multiplo exacto de 52
  • Y el acumulador debe de ser 0

En uno de mis videos mostre como este acumulador sube o baja desde un valor muy alto a un valor muy bajo para llegar a 0 al finalizar el mazo actual.
 
El el programa main que mostre siempre da de salida.

Código:
mazo nuevo
Cantidad de Barajas 6


Ahora si cambio el algoritmo para usar N cantidad de barajas a un numero random obtengo

Código:
mazo nuevo
Cantidad de Barajas 73
mazo nuevo
Cantidad de Barajas 41
mazo nuevo
Cantidad de Barajas 36
mazo nuevo
Cantidad de Barajas 31
mazo nuevo
Cantidad de Barajas 1
mazo nuevo
Cantidad de Barajas 56
mazo nuevo
Cantidad de Barajas 71
mazo nuevo
Cantidad de Barajas 37
mazo nuevo
Cantidad de Barajas 90
mazo nuevo
Cantidad de Barajas 38
mazo nuevo
Cantidad de Barajas 2
mazo nuevo
Cantidad de Barajas 4
mazo nuevo
Cantidad de Barajas 44
mazo nuevo
Cantidad de Barajas 4
mazo nuevo
Cantidad de Barajas 4
mazo nuevo
Cantidad de Barajas 5
mazo nuevo
Cantidad de Barajas 5
mazo nuevo
Cantidad de Barajas 20
mazo nuevo
Cantidad de Barajas 3
mazo nuevo
Cantidad de Barajas 41
mazo nuevo
Cantidad de Barajas 80
mazo nuevo

Aun asi existen falsos positivos, en la salida anterior yo se apriori (Por que lo programe yo) que el valor random de numero de bajaras en el mazo este entre 6 y 112  y si vemos hay valores que nos dan "3" o algo menor a 6 es en falso positivo.

¿Por que se da esto?

Debido al orden aleatorio de un mazo de juego es posible que todas las condiciones que se mencionaron se cumpla antes de terminarse realmente un mazo.

Nuevamente las condiciones son

  • El contatador de cartas debe de ser mayor a 0 y cada que determinemos que es un "mazo nuevo" reiniciarlo a 0
  • El contador debe de ser un multiplo exacto de 52
  • Y el acumulador debe de ser 0

¿Hay forma de evitar falsos positivos?

Segun pienso NO ya que en un escenario real no puedes conocer a priori todas las variables...

¿Para que sirve determinar el numero de barajas usadas?

Como se menciona en el algoritmo de conteo de cartas es deseable saber el numero de barajas usadas en un mazo de juego para determinar si es buen momento de apostar.

El video de que comento es el siguiente:

A-NWAm0avps

Aun asi el código ahi mostrado no esta tan avanzado como el código que muestro en este post, pero sirve para el ejemplo didáctico de conteo de cartas aquí mostrado solo con ligeros cambios.

Saludos