Ver Mensaje Individual
  #17  
Antiguo 17-01-2007
byivan byivan is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Reputación: 0
byivan Va por buen camino
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';
  {El prograa principal del Juega del Poquer usa las unidades de importación
  ´PoquerDados´ y ´PoquerDadosES´ de la biblioteca ´LibPoquerDados´ y la
    unidad ´TiposPoquerDados´}

PROCEDURE        LeeDados(VAR vec:TValorDados);
{Este procedimiento genera la tirada de 4 dados}
VAR
        i:integer;
BEGIN
        FOR i:=1  TO 4  DO BEGIN
        Vec[i]:=TiraDado;
        END;
END;
 
PROCEDURE     LeeMano  (v:TValorDados;  VAR   Mano:TMano);
{Este procedimiento se encarga de leer los campos de una mano, a partir del
 valor de los dados}
VAR
        dat:TDatosCombinacion;
BEGIN
        dat:=Combinacion(v);
        Mano.Dados:=v;
        Mano.Combinacion:=dat;
END;
 
PROCEDURE     CambiaDados(v:TValorDados;cad:string; VAR vec:TValorDados);
{Este procedimiento lo he creado para la opción que se da a ambos jugadores de
 volver a tirar algún dado. Le entra el valor de los dados antiguos y un string
 con información a cerca de los dados q se desean volver a tira, y salen los
  dados actualizados con las nuevas tiradas}
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;
     {Se comprueva si algún elemento del string es un 1, 2, 3 o 4, y si lo es
      se tira el dado que corresponde a ese número}
END;
 
VAR
   {Variables que uiliza el programa principal}
        dados1,dados2:TValorDados;
        jugador1,jugador2:TMano;
        cambio:string;
        Gana1,iguales:boolean;
        fin:char;
 
 
BEGIN     {PROGRAMA PRINCIPAL}
   
REPEAT
     
     writeln('Jugador 1:');      {BLOKE 1}
     readln;
     LeeDados(dados1);  {Genera aleatoriamente los dados del jugador 1}
     LeeMano(dados1,jugador1);
     EscribeMano(jugador1);
     writeln;
     writeln;
     writeln;
     {Jugada del Jugador 1, por pantalla se escriben los dados que ha sacado
      y la cominación que tiene (mano del jugador 1)}
     
 
     writeln('Jugador 2:');           {BLOKE2}
     readln;
     LeeDados(dados2); {Genera aleatoriamente los dados del jugador 2}
     LeeMano(dados2,jugador2);
     EscribeMano(jugador2);
     writeln;
     writeln;
     writeln;
     {Jugada del jugador 2, por pantalla se escriben los dados que ha sacado
      y la cominación que tiene (mano del jugador 1)}

     
                          {BLOKE3}
      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;
     {Se da opción al jugador 1, para que vuelva a tirar algún dado, yse escribe
      la nueva mano}
     
                         {BLOKE4}
      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;
     {Se da opción al jugador 1, para que vuelva a tirar algún dado, yse escribe
      la nueva mano}
     
                 {BLOKE5}
     writeln('RESULTADOS FINALES:');
     writeln;
     writeln('Jugador 1:');
     writeln;
     EscribeMano(jugador1);
     writeln;
     writeln;
     writeln('Jugador 2:');
     writeln;
     EscribeMano(jugador2);
     writeln;
     writeln;
     
{FIN MODULARIZACION}
 
 
 
MayorOIgual(jugador1,jugador2,Gana1,iguales);
     
 
{Llamada al procedimiento ´MayorOIgual´ para saber que jugador gana la
      partida}
     
 
 
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.

Última edición por marcoszorrilla fecha: 17-01-2007 a las 23:39:10.
Responder Con Cita