• Jueves 14 de Noviembre de 2024, 07:57

Autor Tema:  Pila De Cartas En Orden Aleatorio  (Leído 1913 veces)

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Pila De Cartas En Orden Aleatorio
« en: Martes 9 de Agosto de 2005, 13:08 »
0
Buenos días a todos!!!

Abusando una vez más de vosotros, os pido un poco de ayuda. Espero que me podáis ayudar pues necesito una pista.

Veréis debo hacer una baraja de cartas española en una pila. Debe estar desordenada y sin repeticiones. He hecho esta función pero no acaba de hacer lo que debe.

void OrdenAleatorio (tPila *pila) {
     int i, p,n;
     tCarta *nou;
     tNode *aux, mou;

     srand(time(0));
     p = rand()%(MAX_PAL)+1;
     n = rand()%(MAX_NUM)+1;
     nou = CrearCarta(p,n);

     if (EsVaciaPila(pila)) {
          aux = (tNode *) malloc (sizeof(tNode));
          if (aux != NULL) {
               aux->carta = *nou;
               aux->seguent = NULL;
               pila->cap = aux;
          }
      }
      mou = *pila->cap;
      do {
           if ((aux->carta->pal == mou->carta->pal) && (aux->carta->num ==mou->carta->pal)) {
                mou = mou->seguent;
           }
      }while (mou.seguent == NULL);
i = Empilar(pila, nou);
}

Y las estructuras:
typedef struct {
     int pal;
     int num;
}tCarta;
typedef struct {
     tCarta carta;
     struct tNode *seguent;
}tNode;
typedef struct {
     tNode *cap;
}tPila


Me podéis orientar sobre por dónde continuar?

Muchísimas gracias a todos! Os lo agradezco mucho  :hola:

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Pila De Cartas En Orden Aleatorio
« Respuesta #1 en: Martes 9 de Agosto de 2005, 14:26 »
0
Buenas a todos!

He estado mirando y he vuelto ha encontrar un par de fallos. Pero crea un montón de cartas. No me crea las 48 cartas desordenadas en la pila. Me podéis dar una pista?

Al final el código me ha quedado:

Código: Text
  1.  
  2. void OrdreAleatori(tPila *pila) {
  3.      
  4.      int i, j, k;
  5.      int p, n, trobat;
  6.      encontrado = FALSE;
  7.      tCarta *nou;
  8.      tNode *aux, *mou;
  9.          
  10.      for (k = 0; k < MAX_NUM_CARTES; k++) {
  11.          srand(time(0)/rand());
  12.          p = rand()%(MAX_PAL+1)+1;
  13.          n = rand()%(MAX_NUM+1)+1;
  14.          nou = CrearCarta(p, n);
  15.          aux = (tNode *) malloc (sizeof(tNode));
  16.              if (aux != NULL) {
  17.                 aux->carta = *nou;
  18.                 aux->seguent = NULL;  
  19.              }    
  20.          if (!EsBuidaPila(pila)) {
  21.             mou = pila->cap;            
  22.             while ((!encontrado) && (mou != NULL)) {
  23.                if ((aux->carta.pal == mou->carta.pal) && (aux->carta.num  == mou->carta.num)) {
  24.                          encontrado = TRUE;
  25.                      }
  26.                       mou = mou->seguent;
  27.                 }
  28.         }
  29.         i = Empilar(pila, nou);        
  30.      }
  31.      MostrarLlistaDePila(pila);
  32. }
  33.  
  34.  
Muchísimas gracias por vuestra ayuda y atención.

Muchas gracias JuanK por el aviso.  :D

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Pila De Cartas En Orden Aleatorio
« Respuesta #2 en: Jueves 11 de Agosto de 2005, 15:28 »
0
por favor dale formato a tu codigo colocandolo dentro de las etiquetas code, podria hacerlo yo mismo pero la idea es que te habitues a hacerlo, pues esto hace el codigo mas legible para las demas personas que visitan tus preguntas.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

piyey

  • Miembro MUY activo
  • ***
  • Mensajes: 101
  • Nacionalidad: ni
    • Ver Perfil
    • Piyeycorp® - La imaginación es el límite
Re: Pila De Cartas En Orden Aleatorio
« Respuesta #3 en: Martes 16 de Agosto de 2005, 01:05 »
0
Hola amigos...

Una idea:

primero crea la baraja completa
p.e.:
Código: Text
  1. tCarta baraja[52];
  2.  
  3. for(int i=0;i<52;i++)
  4. {
  5.     baraja[i].num = 1 + i%13;
  6.     baraja[i].pal = 1 + i%4;
  7. }
  8.  

aqui estan ordenadas todas (no me critiques si no te funciona lo del palo, no lo pude probar asi que solo planteo la idea que se me ocurrió  :P ).

Luego que tienes el mazo creado y ordenado lo barajas asi:

Código: Text
  1. tCarta aux;
  2. int a;
  3.  
  4. for(int i=0;i<52;i++)
  5. {
  6.     a = rand()%52;
  7.     aux = baraja[a];
  8.     baraja[a] = baraja[i];
  9.     baraja[i] = aux;
  10. }
  11.  
  12.  

ehhh... esto tampoco lo probé así que.... you know jejeje  :comp:

See you!!! :hola:
Piyey.
Si no vives para servir...
no sirves para vivir.


No soy el dueño del mundo...
pero si el hijo del dueño.


Entre la linea que divide la realidad de la ilusión...
se encuentra la imaginación

IlusionLand - Piyey

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Pila De Cartas En Orden Aleatorio
« Respuesta #4 en: Martes 16 de Agosto de 2005, 12:46 »
0
Muchas gracias piyey. He hecho dos funciones y parece que funciona. Al final ha quedado así:

Código: Text
  1.  
  2. void InicialitzarCartes (tCarta *cartes) {
  3.      
  4.      int k;
  5.    
  6.      for (k=0;k<MAX_NUM_CARTES;k++){
  7.          cartes[k].num = 1 + k%12;
  8.          cartes[k].pal = 1 + k%4;
  9.      }
  10.  
  11. }
  12.  
  13. void BarrejarCartes (tCarta *cartes) {
  14.      
  15.      int i, j;
  16.      tCarta temp;
  17.      
  18.      // Inicializar el generador de números aleatorios
  19.      srand ((int)time(NULL));
  20.      
  21.      // Intercambiar cartas
  22.      for (i = 0; i < MAX_NUM_CARTES; i++) {
  23.          j = rand() % MAX_NUM_CARTES;
  24.          temp = cartes[i];
  25.          cartes[i] = cartes[j];
  26.          cartes[j] = temp;      
  27.      } /* Fi de for */  
  28.    
  29. }
  30.  
  31. tPila *GenerarPilaCartas(void) {
  32.  
  33.       int i, k;  
  34.       tPila *auxPila;
  35.       tCarta *carta;  
  36.       tCarta cartes[48]; //Array auxiliar.
  37.      
  38.       InicialitzarCartes(cartes);
  39.       BarrejarCartes(cartes);
  40.          
  41.       auxPila = IniciarPila();
  42.       for(k = 0; k < MAX_NUM_CARTES; k++) {
  43.             carta = &cartes[k];
  44.             i = Empilar (&auxPila, carta);            
  45.      }
  46.      return auxPila;
  47.      
  48. }
  49.  
  50.  
  51.  

Muchas gracias a todos. Hasta la próxima!  :hola:

piyey

  • Miembro MUY activo
  • ***
  • Mensajes: 101
  • Nacionalidad: ni
    • Ver Perfil
    • Piyeycorp® - La imaginación es el límite
Re: Pila De Cartas En Orden Aleatorio
« Respuesta #5 en: Martes 16 de Agosto de 2005, 19:48 »
0
que bueno que te haya funcionado... no estaba seguro porque yo hice un juego de poker hace ya mucho tiempo y no me acordaba muy bien de como era  :P , pero el algoritmo si quedó en mi mente  :devil: ...

See you!!! :hola:
Piyey.
Si no vives para servir...
no sirves para vivir.


No soy el dueño del mundo...
pero si el hijo del dueño.


Entre la linea que divide la realidad de la ilusión...
se encuentra la imaginación

IlusionLand - Piyey