Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: aydeemeza13 en 14 Julio 2014, 06:55 am



Título: Auxilio :C
Publicado por: aydeemeza13 en 14 Julio 2014, 06:55 am
Hola a todos, me encuentro en un problema, tengo que hacer un proyecto de juego de poker, donde se entreguen 4 cartas... eso lo hice, pero tengo que repartir 4 cartas a 4 jugadores y que no se repitan entre si las cartas :c
por favor :c alguien que me ayude u.u
miren aqui esta mi codigo


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int main(){
   int i, card=0;
   char sel, men[15];
   srand(time(NULL));
   do{
      printf("Juego de cartas al azar...\n");

      for(i=1;i<=4;i++)
      {
         card=1+rand()%52;

         //la carta pertenece al mazo de las espadas
         if(card<=13)
         {
            if(card==1)
            {
               printf("\nLa carta %d es: A ",i);
               putchar(6);
            }
            if(card>1 && card<=10)
            {
               printf("\nLa carta %d es: %d ",i,card);
               putchar(6);
            }
            if(card==11)
            {
               printf("\nLa carta %d es: J ",i,card);
               putchar(6);
            }
            if(card==12)
            {
               printf("\nLa carta %d es: Q ",i,card);
               putchar(6);
            }
            if(card==13)
            {
               printf("\nLa carta %d es: K ",i,card);
               putchar(6);
            }
         }

         //la carta pertenece al mazo de los diamantes
         if(card>=14 && card<=26)
         {
            card=card-13;
            if(card==1)
            {
               printf("\nLa carta %d es: A ",i);
               putchar(4);
            }
            if(card>1 && card<=10)
            {
               printf("\nLa carta %d es: %d ",i,card);
               putchar(4);
            }
            if(card==11)
            {
               printf("\nLa carta %d es: J ",i,card);
               putchar(4);
            }
            if(card==12)
            {
               printf("\nLa carta %d es: Q ",i,card);
               putchar(4);
            }
            if(card==13)
            {
               printf("\nLa carta %d es: K ",i,card);
               putchar(4);
            }
         }

         //la carta pertenece al mazo de los treboles
         if(card>=27 && card<=39)
         {
            card=card-26;
            if(card==1)
            {
               printf("\nLa carta %d es: A ",i);
               putchar(5);
            }
            if(card>1 && card<=10)
            {
               printf("\nLa carta %d es: %d ",i,card);
               putchar(5);
            }
            if(card==11)
            {
               printf("\nLa carta %d es: J ",i,card);
               putchar(5);
            }
            if(card==12)
            {
               printf("\nLa carta %d es: Q ",i,card);
               putchar(5);
            }
            if(card==13)
            {
               printf("\nLa carta %d es: K ",i,card);
               putchar(5);
            }
         }

         //la carta pertenece al mazo de los corazones
         if(card>=40 && card<=52)
         {
            card=card-39;
            if(card==1)
            {
               printf("\nLa carta %d es: A ",i);
               putchar(3);
            }
            if(card>1 && card<=10)
            {
               printf("\nLa carta %d es: %d ",i,card);
               putchar(3);
            }
            if(card==11)
            {
               printf("\nLa carta %d es: J ",i,card);
               putchar(3);
            }
            if(card==12)
            {
               printf("\nLa carta %d es: Q ",i,card);
               putchar(3);
            }
            if(card==13)
            {
               printf("\nLa carta %d es: K ",i,card);
               putchar(3);
            }
         }
      }
      printf("\n\n quieres sacar mas cartas?... (y/n)");
      sel=getch();
      putchar(sel);
      if(sel=='y')
         system("cls"); // limpia la pantalla de salida
   }while(sel!='n');

   printf("\n\n");
   system("pause");
   return 0;
}


Título: Re: Auxilio :C
Publicado por: eferion en 14 Julio 2014, 08:21 am
Nota: Para poner código, usa las etiquetas GeSHi, gracias.

Una posibilidad para evitar repetir las cartas es crearte un arreglo que contenga todas las cartas. Dado que para el caso has utilizado un identificador que va del 1 al 52 te vale con un arreglo de 52 posiciones y lo rellenas con un for de forma secuencial:

Código
  1. int baraja[52];
  2.  
  3. for ( i = 0; i < 52; i++ )
  4.  baraja[ i ] = i+1;

Después tocaría barajar. Para ello puedes hacer uso de la función 'rand( )'. La idea es realizar permutaciones sobre la baraja para "mezclarla". Algo tal que:

Código
  1. for ( i = 0; i < 52; i++ )
  2. {
  3.  int pos = rand( ) % 52;
  4.  
  5.  int temp = baraja[ i ];
  6.  baraja[ i ] = baraja[ pos ];
  7.  baraja[ pos ] = temp;
  8. }

Y luego, "repartir" puede ser simplemente asignar los valores del arreglo de forma secuencial:

Código
  1. // Cartas jugador 1
  2. int cartas_jug1[ 4 ];
  3. cartas_jug1[ 0 ] = baraja[ 0 ];
  4. cartas_jug1[ 1 ] = baraja[ 1 ];
  5. cartas_jug1[ 2 ] = baraja[ 2 ];
  6. cartas_jug1[ 3 ] = baraja[ 3 ];
  7.  
  8. // Cartas jugador 2
  9. int cartas_jug2[ 4 ];
  10. cartas_jug2[ 0 ] = baraja[ 4 ];
  11. cartas_jug2[ 1 ] = baraja[ 5 ];
  12. cartas_jug2[ 2 ] = baraja[ 6 ];
  13. cartas_jug2[ 3 ] = baraja[ 7 ];
  14.  
  15. // ...

Estos códigos se pueden mejorar bastante, la intención era presentar los conceptos de forma clara.

Por cierto, faltaría inicializar el generador de números aleatorios, pero eso ya te toca investigarlo a tí... no te lo voy a dar todo hecho ;)

Un saludo.


Título: Re: Auxilio :C
Publicado por: leosansan en 14 Julio 2014, 15:09 pm
Para evitar ese "rosario" de if, yo usaría un par de arrays que recojan el palo y el valor de la carta, algo como:

Código
  1.  const char *palo[4] = { "Corazones", "Diamantes", "Treboles", "Picas" };
  2.  const char *valor[13] = {  "As", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve","Diez", "Jack", "Reina", "Rey" };

donde con las operaciones " % "  y  " / "  obtendría del valor de la carta el palo y su valor.

Y después de barajar, como te comentó anteriormente eferion, el reparto, suponiendo como planteas cuatro jugadores,  haría algo como:

Código
  1.  int carta;
  2.  for( carta = 0 ; carta < 20; carta++){
  3.    if ( carta %10 == 0 )
  4.      putchar('\n');
  5.  printf("\t%7s de %-9s%c", valor[baraja[carta] % 13], palo[baraja[carta] / 13],  ( carta+1 )  %2 == 0 ? '\n' : '\t');
  6.  }

para obtener una salida como:

Código
  1.  
  2.           Seis de Corazones               Diez de Corazones
  3.            Rey de Treboles                  As de Picas
  4.             As de Treboles               Nueve de Treboles
  5.            Dos de Picas                     As de Corazones
  6.            Dos de Treboles              Cuatro de Treboles
  7.  
  8.          Cinco de Corazones              Siete de Picas
  9.          Reina de Diamantes              Siete de Treboles
  10.           Diez de Diamantes               Jack de Diamantes
  11.            Dos de Diamantes               Tres de Picas
  12.          Reina de Corazones             Cuatro de Diamantes
  13.  
  14.  

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)