Ver Mensaje Individual
  #4 (permalink)  
Antiguo 17/06/2014, 10:29
Avatar de Italico76
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