• Domingo 22 de Diciembre de 2024, 08:34

Autor Tema:  No Se Hacer El Programa  (Leído 1753 veces)

cholisimo

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
No Se Hacer El Programa
« en: Jueves 22 de Junio de 2006, 22:07 »
0
Hola a todos, estado dandole vueltas y mas vueltas a este programa pero todabia sigo sin saber como hacerlo alguien me puede ayudar, el enunciado dice lo siguiente:

Realizar un programa que reparta cuatro cartas a cuatro jugadores con algun m‚todo aleatorio (pseudoaleatorio). Se utilizaran conjuntos para garantizar que la misma carta no se reparte m s de una vez. Se debe tener en cuenta que jugamos con una baraja en la que hay 4 palos (oros,copas,espadas y bastos) y 10 cartas en cada palo (de la 1 a la 10).La salida del programa seria el conjunto de 4 cartas que le ha tocado a cada uno de los 4 jugadores.


Me hariais un gran favor. Gracias.

tonilope

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: No Se Hacer El Programa
« Respuesta #1 en: Viernes 23 de Junio de 2006, 00:49 »
0
Te voy a dar unas pistillas:

1) En total hay 40 cartas (4 palos x 10 cartas/palo = 40 cartas)

2) La función Random(x) te devuelve un número aleatorio entre 0 y x. (Al principio del programa hay que llamar a la función Randomize para que "reinicie" la secuencia de números aleatorios).

3) Cada vez que llames a Random(39), te devolverá un numerito entre 0-39. Mirarás en un array booleano (0-1) llamado cartas[] (por ejemplo) si la carta elegida ya ha sido repartida. Si todavía no había salido, pones a 1 el registro del array. Si la carta elegida ya está repartida, tendrás que volver a llamar a la función .

4) Una vez obtenido el numerito, tienes que averiguar a qué carta corresponde. Para ello utilizas la operación MÓDULO (resto de la divisón entera) y la DIVISIÓN ENTERA.

Ejemplo:

Supongamos que has obtenido el número 23 de forma aleatoria. Compruebas que cartas[23] sea igual a 0. Si es así, pones cartas[23]=1 y haces 23 Mod 10 = 3 Eso te dice que se trata de un 4 (ten en cuenta que 0=AS, 1=2, 2=3, etc...)
Para averiguar el palo haces 23 Div 10 = 2 Luego el palo es 2=ESPADAS (0=OROS 1=COPAS, etc...). La carta es el 4 de espadas.

Salu2 ;) y suerte que es muy sencillo.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: No Se Hacer El Programa
« Respuesta #2 en: Viernes 23 de Junio de 2006, 01:13 »
0
Vamos por pasos:
Primero debes tener un tipo especial de datos para el mazo y los naipes
Código: Text
  1.  
  2. TPalo = (espada, basto, oro, copa);
  3. TNaipe = record
  4.    Palo: byte;
  5.    Num: byte;
  6. end;
  7.  
  8. TBaraja = array[1..40] of TNaipe;
  9.  
  10.  
Segundo: Debes tener una funcion que te cree una baraja ordenada.
Código: Text
  1.  
  2. procedure InitBaraja;
  3. var i,j: Integer;
  4. begin
  5.   for j:=0 to 3 do
  6.     for i:=1 to 10 do
  7.     begin  
  8.        {es i+i*j para que sea 4 veces de 0 a 10, 0..10, 10..20, 20....}
  9.         Baraja[i+i*j].Palo := Ord(j);  {es Ord(0)=espada, Ord(1)=basto, etc... revisa TPalo}
  10.          Baraja[i+i*j].Num := i; {seria del 1 al 10 4 veces por el for j}
  11. end;
  12.  
  13.  
Lo que hace lo anterior, es basicamente con una forma rebuscada crear un mazo de
naipes de 4 palos (0,1,2,3) con 4 veces del 1 al 10. (Es decir, una baraja)

Si no te gusta el c'odigo anterior, puedes hacer:
Código: Text
  1.  
  2. for i:=1 to 10 do
  3. begin
  4.     Baraja[i].Palo := espada;
  5.     Baraja[i].Num := i;
  6. end;
  7. for i:=11 to 20 do
  8.    Baraja[i].Palo := basto;
  9.    baraja[i].Num := i;
  10.  end;
  11. etc.....
  12.  
  13.  
pero supong oque el primer codigo tiene que funcionar, no lo prob'e, si no funciona, usa el segundo y completalo.....

Tercero; tienes que hacer un algoritmo capaz de mezclar el maso
Código: Text
  1.  
  2. procedure Mezclar;
  3. var
  4.   temp: TNaipe;
  5.    i: Integer;
  6.    rand: Integer;
  7. begin
  8.   For i:=1 to 40 do
  9.   begin
  10.      Rand := RAndom(40)+1;
  11.      temp := Baraja[i];
  12.      Baraja[i] := Baraja[Rand;
  13.      Baraja[Rand] := tem;
  14.  end;
  15.  
  16.  
Lo que hace lo anterior es simplemente intercambiar todos los anipes del mazo con un naipe de posicion aleatorioa.

tonilope

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: No Se Hacer El Programa
« Respuesta #3 en: Domingo 25 de Junio de 2006, 18:46 »
0
Aquí te dejo una posible implementación en C. Espero que te sirva de guía.

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. int main(int argc, char **argv)
  8. {
  9. int conta_jugador, conta_carta, aux, repartidas[40], cartas[4][4];
  10. char palos[4][20], figuras[3][20];
  11.  
  12. sprintf(palos[0], "Oros");
  13. sprintf(palos[1], "Copas");
  14. sprintf(palos[2], "Espadas");
  15. sprintf(palos[3], "Bastos");
  16.  
  17. sprintf(figuras[0], "Sota");
  18. sprintf(figuras[1], "Caballo");
  19. sprintf(figuras[2], "Rey");
  20.  
  21.  
  22. srand(time(NULL));
  23.  
  24. for(aux=0; aux<40; aux++)
  25.     repartidas[aux]=0;
  26.    
  27.  
  28. //Repartimos las cartas "de una en una" (como se haría normalmente)
  29. for(conta_carta=0; conta_carta<4; conta_carta++)
  30. {
  31.  
  32. for(conta_jugador=0; conta_jugador<4; conta_jugador++)
  33. {
  34.  
  35.     do{
  36.     aux=rand()%40;
  37.     }while(repartidas[aux]);
  38.    
  39.     repartidas[aux]=1;
  40.    
  41.     cartas[conta_jugador][conta_carta]=aux;
  42.    
  43. }
  44.  
  45. }
  46.  
  47.  
  48. //Mostramos por pantalla las cartas de cada jugador
  49. for(conta_jugador=0; conta_jugador<4; conta_jugador++)
  50. {
  51.  
  52. printf("\n\nJugador %d:", conta_jugador+1);
  53.  
  54. for(conta_carta=0; conta_carta<4; conta_carta++)
  55. {
  56.  
  57. aux=cartas[conta_jugador][conta_carta]%10;
  58.  
  59.  if(aux<7)
  60.      printf("\n%d de %s", aux+1, palos[cartas[conta_jugador][conta_carta]/10]);
  61.  else
  62.      printf("\n%s de %s", figuras[aux-7], palos[cartas[conta_jugador][conta_carta]/10]);
  63.  
  64. }
  65.  
  66. }
  67.  
  68. return 0;
  69. }
  70.  
  71.  
  72.