• Viernes 26 de Abril de 2024, 13:23

Autor Tema:  Randomizar Baraja  (Leído 2228 veces)

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Randomizar Baraja
« en: Sábado 3 de Abril de 2004, 01:14 »
0
Por alguna extraña  razón el código que escribí saca naipes al azar pero a veces se repiten . ( En una baraja común la cartas ni se repiren  :angry: )
    Si bien el programa tiene un procedimiento que supuestamente tiene que controlar que los naipes no se repitan pero no funciona del todo bien  :blink:
Aqui se los paso cualquier ayuda me será de gran utoilidad Gracias :)
Código: Text
  1.  
  2. program Truco;
  3. uses CRT;
  4. (***************************************************************************)
  5. type
  6.  TNaipe = record
  7.     Palo :  (Espada,Basto,Oro,Copa);
  8.     Nro  :  Byte;
  9.     Dib  :  char;
  10.  end;
  11.  TBaraja =  array [1..40] of TNaipe;
  12. (***************************************************************************)
  13. Var
  14.  Espad  :  TNaipe;
  15.  Baraja :  TBaraja;
  16.  Ch     :  char;
  17.  I      :  integer;
  18. (***************************************************************************)
  19. procedure RandomCarta(var Naipe : Tnaipe);
  20.  var
  21.   I : Integer;
  22.   J : Integer;
  23.  begin
  24.   I := Random(4)+1;
  25.   J := Random(12)+1;
  26.   If (J=8) or (J=9) Then J := Random(12)+1;
  27.   Naipe.Nro := J;
  28.   Case I of
  29.    1: begin
  30.        Naipe.Palo := Espada;
  31.        Naipe.Dib := #6;
  32.       end;
  33.    2: begin
  34.        Naipe.Palo := Basto;
  35.        Naipe.Dib := #3;
  36.       end;
  37.    3: begin
  38.        Naipe.Palo :=Oro;
  39.        Naipe.Dib := #4;
  40.       end;
  41.    4: begin
  42.        Naipe.Palo :=Copa;
  43.        Naipe.Dib := #5;
  44.       end;
  45.   end;
  46.  end;
  47.  
  48. function SinRepetir(N:Integer&#59; Naipe:TNaipe&#59; Maso:TBaraja ) : boolean;
  49.  var I : Integer;
  50.  begin
  51.   for I := 1 to N  do
  52.    begin
  53.     if(Maso[I].Nro=Naipe.Nro)
  54.      and (Ord(Maso[I].Palo)=Ord(Naipe.Palo))
  55.       then SinRepetir := False
  56.     else SinRepetir := True
  57.    end;
  58.  end;
  59.  
  60. procedure RandomBaraja(var  Maso : TBaraja);
  61.  var
  62.   I : integer;
  63.   Carta : TNaipe;
  64.  begin
  65.   for I := 1 to 40 do
  66.    begin
  67.     RandomCarta(Carta);
  68.     If SinRepetir(I,Carta,Maso)
  69.      then Maso[I] := Carta
  70.     else RandomCarta(Carta);
  71.    end;
  72.   end;
  73. (***************************************************************************)
  74. Begin
  75.  TextMode(3);
  76.  ClrScr;
  77.  Randomize;
  78.  RandomBaraja(Baraja);
  79.  TextColor(4);
  80.  for I := 1 to 40 do
  81.   begin
  82.    WriteLn('    ',Baraja[I].Nro:5,'    ',Baraja[I].Dib);
  83.    if I = 20 Then
  84.     begin
  85.     window(40,1,70,25);
  86.     WriteLn('    ',Baraja[I].Nro:5,'    ',Baraja[I].Dib)
  87.     end;
  88.  end;
  89. ReadKey;
  90. End.
  91.  
  92.  
  93.  

deldar

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Randomizar Baraja
« Respuesta #1 en: Sábado 3 de Abril de 2004, 13:52 »
0
program Truco;
uses CRT;
(***************************************************************************)
type
TNaipe = record
   Palo :  (Espada,Basto,Oro,Copa);
   Nro  :  Byte;
   Dib  :  char;
end;
TBaraja =  array [1..40] of TNaipe;
(***************************************************************************)
Var
Espad  :  TNaipe;
Baraja :  TBaraja;
Ch     :  char;
I      :  integer;
(***************************************************************************)
procedure RandomCarta(var Naipe : Tnaipe);
var
 I : Integer;
 J : Integer;
begin
 I := Random(4)+1;
 J := Random(12)+1;
 If (J=8) or (J=9) Then J := Random(12)+1; {¿y si sale otra vez 8 o 9 ?no lo controlas y tienes que controlarlo, ojo}
 Naipe.Nro := J;
 Case I of
  1: begin
      Naipe.Palo := Espada;
      Naipe.Dib := #6;
     end;
  2: begin
      Naipe.Palo := Basto;
      Naipe.Dib := #3;
     end;
  3: begin
      Naipe.Palo :=Oro;
      Naipe.Dib := #4;
     end;
  4: begin
      Naipe.Palo :=Copa;
      Naipe.Dib := #5;
     end;
 end;
end;

function SinRepetir(N:Integer; Naipe:TNaipe; Maso:TBaraja ) : boolean;
var I : Integer;
begin
 for I := 1 to N  do
  begin
   if(Maso.Nro=Naipe.Nro)
    and (Ord(Maso.Palo)=Ord(Naipe.Palo))
     then SinRepetir := False
   else SinRepetir := True
  end;
end;

procedure RandomBaraja(var  Maso : TBaraja);
var
 I : integer;
 Carta : TNaipe;
begin
 for I := 1 to 40 do
  begin
   RandomCarta(Carta);
   If SinRepetir(I,Carta,Maso)
    then Maso := Carta
   else RandomCarta(Carta); {aqui si se da otra repeticion no va a controlarla ¿que tal un "repeat RandomCarta(Carta) until SinRepetir(I,Carta,Maso)"? }
  end;
 end;
(***************************************************************************)
Begin
TextMode(3);
ClrScr;
Randomize;
RandomBaraja(Baraja);
TextColor(4);
for I := 1 to 40 do
 begin
  WriteLn('    ',Baraja.Nro:5,'    ',Baraja.Dib);
  if I = 20 Then
   begin
   window(40,1,70,25);
   WriteLn('    ',Baraja.Nro:5,'    ',Baraja.Dib)
   end;
end;
ReadKey;
End.
Quien de verdad sabe de qué habla, no encuentra razones para levantar la voz.

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Randomizar Baraja
« Respuesta #2 en: Sábado 3 de Abril de 2004, 18:34 »
0
Hola.
Realmente no entiendo por qué haces tantas vueltas para algo realmente sencillo, para mí deberías hacer algo como esto:
Código: Text
  1.  
  2. procedure MezclarBaraja(var B: TBaraja);
  3. var
  4.   I, J: Integer;
  5.   Aux: TNaipe;
  6. begin
  7.   Randomize;
  8.   For I:=1 to 40 do
  9.     Begin
  10.         J:=Random(40)+1;
  11.         Aux:=B[I];
  12.         B[I]:=B[J];
  13.         B[J]:=Aux;
  14.     end;
  15. end;
  16.  
  17.  
Eso es todo.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Randomizar Baraja
« Respuesta #3 en: Viernes 9 de Abril de 2004, 14:54 »
0
deldar :
           Voy a probar meterle el repeat until             (  <_< que tonto al pensar que con recursividad no habria problema) .

 DriverOp :  
                No entiendo  mucho tu codigo . ;) ¿Acaso  cambia las posiciones de las cartas dentro de una baraja , o que? No quiero pasar por impertinente pero podrias explicar como es que funciona por favor.

 Gracias a Todos,Saludos :hola:

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Randomizar Baraja
« Respuesta #4 en: Domingo 11 de Abril de 2004, 02:59 »
0
Pues sí, es eso precisamente, desordena las cartas de la baraja, o lo que es lo mismo intercambia valores de posiciones aleatorias.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Randomizar Baraja
« Respuesta #5 en: Jueves 15 de Abril de 2004, 23:36 »
0
Ahaaa :P
  La voy a probar a ver que pasa  :)