Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Juego de caras

Estas en el tema de Juego de caras en el foro de C/C++ en Foros del Web. Hola, tengo el siguiente código que me barajea cartas. Código: Cita: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> void baraja(int wMazo[][13]); void reparte(const int ...
  #1 (permalink)  
Antiguo 16/06/2014, 10:11
 
Fecha de Ingreso: febrero-2014
Ubicación: Guadalajara
Mensajes: 34
Antigüedad: 10 años, 9 meses
Puntos: 0
Juego de caras

Hola, tengo el siguiente código que me barajea cartas.


Código:
Cita:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> void baraja(int wMazo[][13]); void reparte(const int wMazo[][13], const char *wCara[], const char *wPalo[]); void par(const int wMazo[][13], const char *wCara[], const char *wPalo[]); int main(){ const char *palo[4]={ "Corazones","Diamantes", "Treboles","Espadas" }; const char *cara[13]={ "As", "Dos","Tres","Cuatro","Cinco","Seis ","Siete","Ocho", "Nueve","Diez", "Joto ","Quina ","Rey", }; int mazo[4][13]={0}; srand(time(0)); baraja(mazo); reparte(mazo, cara, palo ); getch(); } void baraja(int wMazo[][13]){ int fila; int columna; int carta; for(carta=1 ; carta<=52; carta++){ do{ fila=rand() % 4; columna= rand() % 13; }while (wMazo[fila][columna]!= 0 ); wMazo[fila][columna]= carta; } } void reparte(const int wMazo[][13], const char *wCara[], const char *wPalo[]){ int carta,fila, columna; for(carta=0; carta<=52; carta++){ for(fila=0; fila<=3; fila++){ for(columna=0; columna<=12; columna++){ if(wMazo[fila][columna]==carta){ printf("%6s de %-9s%c", wCara[columna],wPalo[fila], carta %2 == 0 ?'\n':'\t'); } } } } }

Mi problema es: Tengo que hacer que me reparta cinco cartas (osea una mano de poquer) y determinar si hay paraes.

estuve pensando que si hay mas de una carta en las columnas(que son los numeros de las cartas )de arreglo "columna" de las cinco cartas repartidas entonces hay un par. pero ese es mi problema; no logro concretar el como lo voy hacer .

les pido su ayuda; gracias.
  #2 (permalink)  
Antiguo 16/06/2014, 18:08
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Juego de caras

Sugiero expliques tus estructuras de datos, que guardan, como lo guardan y que esperas chequear.
Tal vez en medio de la explicacion te des cuenta que puedes hacerlo tu mismo, y si no es así, el esfuerzo que pongas en explicarlo facilitará que alguien te pueda ayudar.

Con ejemplos, aun mejor las explicaciones.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 16/06/2014, 22:39
 
Fecha de Ingreso: febrero-2014
Ubicación: Guadalajara
Mensajes: 34
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Juego de caras

Bueno , lo que hace básicamente es en un arreglo de 4 espacios guarda los nombres de las cartas que representan las filas. Y en otro arreglo los numeros , ambos con apuntadores que apunten a los nombres y a los numeros. Despues otro arrwglo bidimensional , aquí se van a llenar los espacios con un numero del 1 al 52 sin repetir. Despues para repartir sólo va igualando cada carta o sea cada numero que contiene cada cordenada del arreglo cob el numero de carta que con contiene el for . En este caso ea el primer for de la función repartir.

Con eso , quiero que me reparta 5 cartas y me determine cuantos pres hay pero eso de los pares no se como realizarlo.
  #4 (permalink)  
Antiguo 17/06/2014, 10:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Juego de caras

Deberias decirnos si debe usar C o puedes usar C++ ya que con el segundo puedes crear clases.

Lo mas importante como te dice es pensar bien las estructuras de datos, asi en ANSI C:

Código C:
Ver original
  1. struct Baraja
  2. {
  3.     int numero;
  4.     char palo;  // c=corazones, d=diamantes, t=treboles, e=espadas
  5. }

aunque en C (no-Ansi) podrias usar enum tambien y... finalmente si lo piensas... es mejor que Baraja sea tambien una clase!

Si lo piensas... no salen cartas de cualquier parte del mazo!!!! no es un array sino una pila o cola segun sea la forma de repartir del crupier: saque las cartas de un extremo del mazo o del opuesto luego de mezclar. Todo esta en la estructura de datos que elijas ... incluso el considerar a un Comodin como un palo mas te puede beneficiar en que te simplifica la logica al momento de formar "pares" por ejemplo

Código C:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <queue>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <time.h>
  7. //#include <stdexcept>
  8.  
  9. using namespace std;
  10.  
  11. enum Palos {Trebol,Diamante,Corazon,Espada,Comodin};
  12.  
  13. /*
  14.     Poker
  15.     @author Pablo Bozzolo (2014)
  16.  */
  17. class Baraja
  18. {  
  19.  
  20. public:
  21.  
  22.     // quizas deberian ser atributos privados ;)   
  23.     int numero;
  24.     enum Palos palo;
  25.  
  26.     void mostrar()
  27.     {
  28.         string tipo;       
  29.         switch (palo)
  30.         {
  31.                 case(Trebol):
  32.                     cout << numero << " de Trebol" << endl;
  33.                     break; 
  34.                 case(Diamante):
  35.                     cout << numero << " de Diamante" << endl;
  36.                     break;     
  37.                 case(Corazon):
  38.                     cout << numero << " de Corazon" << endl;
  39.                     break;     
  40.                 case(Espada):
  41.                     cout << numero << " de Espada" << endl;
  42.                     break;         
  43.                 case(Comodin):
  44.                     cout << "Comodin" << endl;
  45.                     break;         
  46.         }
  47.     }
  48. };
  49.  
  50. class Mazo
  51. {
  52.     //Baraja cartas[];
  53.     std::queue<Baraja> cartas;
  54.  
  55. public:  
  56.  
  57.     // crea mazo
  58.     Mazo()
  59.     {
  60.         Baraja bar;
  61.        
  62.         for (int i=1;i<=13;i++)
  63.         {
  64.             bar.numero=i;
  65.             for (int j=0;j<Comodin;j++)
  66.             {
  67.                 bar.palo= (Palos) j;
  68.                 cartas.push(bar);
  69.             }              
  70.         }
  71.  
  72.         // completamos el mazo :)
  73.         bar.palo = Comodin;
  74.         bar.numero = 0;
  75.  
  76.         cartas.push(bar);
  77.         cartas.push(bar);
  78.     };
  79.  
  80.     // si bien el mazo se mezcla por accion del crupier, dejemos eso de lado :)
  81.     void mezclar()
  82.     {
  83.  
  84.         Baraja carta;
  85.         vector<Baraja> nuevo_mazo (54);        
  86.         int up_down;               
  87.        
  88.         // copio el mazo
  89.         for (int i=0;i<54;i++)
  90.         {
  91.             carta = cartas.front();
  92.             cartas.pop();
  93.             nuevo_mazo.at(i) = carta;          
  94.         }  
  95.  
  96.         random_shuffle (nuevo_mazo.begin(), nuevo_mazo.end());
  97.        
  98.         // lo copio al mazo original
  99.         for (int i=0;i<54;i++)
  100.         {
  101.             carta = nuevo_mazo.at(i);          
  102.             cartas.push(carta);
  103.         }          
  104.     };
  105.  
  106.     // cuando una baraja regresa al mazo
  107.     void aceptar(Baraja bar)
  108.     {
  109.  
  110.     };
  111.  
  112.     // cuando un jugar coje del mazo, éste lo cede
  113.     Baraja ceder()
  114.     {
  115.         Baraja bar;
  116.         //...
  117.         return bar;
  118.     };
  119.  
  120.     // verifica que el mazo este completo y que no haya nada extraño como 5 comodines :P
  121.     bool isOk(bool show_errors=true)
  122.     {
  123.         Baraja carta;
  124.         int comodines;
  125.         int espadas;
  126.         int treboles;
  127.         int corazones;
  128.         int diamantes;
  129.         int total;
  130.         bool ok;
  131.  
  132.  
  133.         comodines =0;
  134.         espadas   =0;
  135.         treboles  =0;
  136.         corazones =0;
  137.         diamantes =0;
  138.         for (int i=0;i<54;i++)
  139.         {
  140.             carta = cartas.front();
  141.             cartas.pop();
  142.             switch (carta.palo)
  143.             {
  144.                 case(Trebol):
  145.                     treboles++;
  146.                     break; 
  147.                 case(Diamante):
  148.                     diamantes++;
  149.                     break;     
  150.                 case(Corazon):
  151.                     corazones++;
  152.                     break;     
  153.                 case(Espada):
  154.                     espadas++;
  155.                     break;         
  156.                 case(Comodin):
  157.                     comodines++;                       
  158.             }          
  159.             cartas.push(carta);
  160.         }
  161.  
  162.         total = comodines+espadas+treboles+diamantes+corazones;
  163.         ok = (comodines==2 && espadas==13 && treboles==13 && diamantes==13 && corazones==13 && (total == 54));
  164.        
  165.         if (!ok)
  166.         {  
  167.             if (show_errors)
  168.                 printf("ERROR: hay %d comodines, %d espadas, %d treboles, %d diamantes y %d corazones sumado un total de %d\n", comodines,espadas,treboles,diamantes,corazones,total);         
  169.            
  170.             return ok;
  171.  
  172.         }
  173.         //else cout << "Mazo OK! ;)" << endl;  
  174.  
  175.     }
  176.  
  177.  
  178.     // a fines de debug.. crearemos un metodo para mostrar el mazo 
  179.     void mostrar()
  180.     {
  181.         Baraja carta;
  182.  
  183.         for (int i=1;i<=54;i++)
  184.         {
  185.             carta = cartas.front();
  186.             cartas.pop();
  187.             carta.mostrar();
  188.             cartas.push(carta);
  189.         }
  190.     }
  191.  
  192. }; 
  193.  
  194.  
  195. class Jugador
  196. {
  197.  
  198. public:
  199.  
  200.     Jugador(string nombre)
  201.     {      
  202.     };
  203.  
  204.     void jugar()
  205.     {}
  206.  
  207. };
  208.  
  209.  
  210. class Crupier
  211. {
  212.     Mazo* mazo;
  213.     vector<Jugador*> players;  
  214.  
  215. public:
  216.  
  217.     Crupier(){};
  218.    
  219.     void aceptar(Mazo* m)
  220.     {
  221.         mazo = m;
  222.     }
  223.    
  224.     void registrar(Jugador* player)
  225.     {
  226.         players.push_back(player);
  227.     }; 
  228.  
  229.     // reparte a cada jugar registrado
  230.     void repartir()
  231.     {
  232.         // ..
  233.     }
  234.  
  235.     void mezclar()
  236.     {
  237.         mazo->isOk();  
  238.         mazo->mezclar();
  239.         mazo->mostrar();   
  240.         mazo->isOk();
  241.     }
  242. };
  243.  
  244.  
  245. int main ()
  246. {
  247.     // Inicializo semilla para mezclado de cartas
  248.     srand (time(NULL));    
  249.  
  250.     // Creo el mazo
  251.     Mazo mazo;
  252.  
  253.     // Creo dos jugadores y al crupier  
  254.     Jugador player1("Pablo");  
  255.     Jugador player2("Carlos");
  256.     Crupier crupier;
  257.  
  258.     // Paso el mazo al crupier, se mezcla, baraja (reparte)...
  259.     crupier.aceptar(&mazo);
  260.     crupier.registrar(&player1);
  261.     crupier.registrar(&player2);
  262.     crupier.mezclar();
  263.    
  264.     // alternadamente deberia repartir a cada jugar registrado para la partida
  265.     crupier.repartir();
  266.    
  267.     // ...
  268.  
  269.    
  270. }

Ese codigo no hace MUCHO cierto (hasta ahora solo mezcla las cartas) .. PERO ... vas definiendo a grandes razgos lo que hay en tu sistema....
__________________
Salu2!

Última edición por Italico76; 17/06/2014 a las 21:02

Etiquetas: int, juego, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:22.