Programación General > Pascal
Randomizar Baraja
Enko:
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 --- 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; 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[I].Nro=Naipe.Nro) and (Ord(Maso[I].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[I] := Carta else RandomCarta(Carta); end; end;(***************************************************************************)Begin TextMode(3); ClrScr; Randomize; RandomBaraja(Baraja); TextColor(4); for I := 1 to 40 do begin WriteLn(' ',Baraja[I].Nro:5,' ',Baraja[I].Dib); if I = 20 Then begin window(40,1,70,25); WriteLn(' ',Baraja[I].Nro:5,' ',Baraja[I].Dib) end; end;ReadKey;End.
deldar:
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.
DriverOp:
Hola.
Realmente no entiendo por qué haces tantas vueltas para algo realmente sencillo, para mí deberías hacer algo como esto:
--- Código: Text --- procedure MezclarBaraja(var B: TBaraja);var I, J: Integer; Aux: TNaipe;begin Randomize; For I:=1 to 40 do Begin J:=Random(40)+1; Aux:=B[I]; B[I]:=B[J]; B[J]:=Aux; end;end; Eso es todo.
Enko:
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:
Pues sí, es eso precisamente, desordena las cartas de la baraja, o lo que es lo mismo intercambia valores de posiciones aleatorias.
Navegación
[#] Página Siguiente
Ir a la versión completa