Aqui está el codigo, se trata de modularizar el programa principal, meter los 5 primeros bloques (o parrafos de instrucciones) cada uno en un procedure para así hacer el programa principal lo menos extenso posible.
El problema me surgió al modularizar el 3º bloque que contiene otro subprograma,y creo que se crea un conflicto de variables (un efecto lateral) y aunque el compilador lo da por bueno, en el tiempo de ejecución no se obtienen resultados esperados (en el descarte del poker cambia todas las cartas en vez de las deseadas,....)
GRacias :
Código Delphi
[-]
PROGRAM JuegoPoquer;
{$APPTYPE CONSOLE}
USES
SysUtils,
PoquerDados in 'PoquerDados.pas',
PoquerDadosES in 'PoquerDadosES.pas',
TiposPoquerDados in 'TiposPoquerDados.pas';
PROCEDURE LeeDados(VAR vec:TValorDados);
VAR
i:integer;
BEGIN
FOR i:=1 TO 4 DO BEGIN
Vec[i]:=TiraDado;
END;
END;
PROCEDURE LeeMano (v:TValorDados; VAR Mano:TMano);
VAR
dat:TDatosCombinacion;
BEGIN
dat:=Combinacion(v);
Mano.Dados:=v;
Mano.Combinacion:=dat;
END;
PROCEDURE CambiaDados(v:TValorDados;cad:string; VAR vec:TValorDados);
VAR
i:integer;
BEGIN
vec:=v;
FOR i:= 1 TO length(cad) DO BEGIN
IF cad[i]='1' THEN
vec[1]:=Tiradado
ELSE IF cad[i]='2' THEN
vec[2]:=tiradado
ELSE IF cad[i]='3' THEN
vec[3]:=tiradado
ELSE IF cad[i]='4' THEN
vec[4]:=tiradado;
END;
END;
VAR
dados1,dados2:TValorDados;
jugador1,jugador2:TMano;
cambio:string;
Gana1,iguales:boolean;
fin:char;
BEGIN
REPEAT
writeln('Jugador 1:');
readln;
LeeDados(dados1);
LeeMano(dados1,jugador1);
EscribeMano(jugador1);
writeln;
writeln;
writeln;
writeln('Jugador 2:');
readln;
LeeDados(dados2);
LeeMano(dados2,jugador2);
EscribeMano(jugador2);
writeln;
writeln;
writeln;
writeln('Jugador 1, indique los dados que desea volver a tirar separados por -:');
readln(cambio);
CambiaDados(dados1,cambio,dados1);
writeln;
writeln('Jugador 1:');
LeeMano(dados1,jugador1);
EscribeMano(jugador1);
writeln;
writeln;
writeln;
writeln('Jugador 2, indique los dados que desea volver a tirar separados por -:');
readln(cambio);
CambiaDados(dados2,cambio,dados2);
writeln;
writeln('Jugador 2:');
LeeMano(dados2,jugador2);
EscribeMano(jugador2);
writeln;
writeln;
writeln;
writeln('RESULTADOS FINALES:');
writeln;
writeln('Jugador 1:');
writeln;
EscribeMano(jugador1);
writeln;
writeln;
writeln('Jugador 2:');
writeln;
EscribeMano(jugador2);
writeln;
writeln;
MayorOIgual(jugador1,jugador2,Gana1,iguales);
IF Gana1 THEN
writeln('¡!! GANA JUGADOR 1 ¡!!')
ELSE
IF iguales THEN
writeln('¡!! HAY EMPATE ¡!!')
ELSE
writeln('¡!! GANA JUGADOR 2 ¡!!');
writeln;
write('Otra ronda? (S/N)');
REPEAT
readln(fin);
writeln;
UNTIL (fin='s') or (fin='S') or (fin='n') or (fin='N');
writeln;
UNTIL (fin='N') or (fin='n')
END.