programita en pascal

Hola!
Me han pedido hacer un programa en pascal, concretamente un piedra-papel-tijera. Tengo el programa hecho y funciona, queria vuestra opinion sobre cambiar cosas para mejorarlo.

PROGRAM practica2;
USES
crt;
VAR
n, op: integer;

PROCEDURE menu;
BEGIN
CLRSCR;
writeln('MENU: ');
writeln;
writeln('1. - Jugar.');
writeln('2. - Salir.');
writeln;
writeln('Eliga una opcion: ');
END;

FUNCTION jugadaMaquina: integer;
VAR
x: integer;
BEGIN
RANDOMIZE;
x:= random(3);
CASE x OF
0: jugadaMaquina:=0;
1: jugadaMaquina:=1;
2: jugadaMaquina:=2;
END;
END;

FUNCTION jugadaHumano: integer;
VAR
y: integer;
BEGIN
CLRSCR;
writeln('Introduzca la jugada (0= piedra, 1= papel, 2= tijera)');
readln(y);
CASE y OF
0: jugadaHumano:=0;
1: jugadaHumano:=1;
2: jugadaHumano:=2;
END;
END;

PROCEDURE juego;
VAR
jugada1, jugada2: integer;
BEGIN
jugada1:=jugadaHumano;
jugada2:=jugadaMaquina;
IF jugada1>jugada2 THEN
writeln('­Ganas!')
ELSE
IF jugada1=jugada2 THEN
writeln('Empatas')
ELSE
IF (jugada1=2) AND (jugada2=0) THEN
writeln('Pierdes')
ELSE
IF (jugada1=0) AND (jugada2=2) THEN
writeln('¡Ganas!')
ELSE
writeln('Pierdes');
writeln('La maquina escogio: ');
CASE jugada2 OF
0: writeln('Piedra');
1: writeln('Papel');
2: writeln('Tijera');
END;
END;

BEGIN
n:=0;
REPEAT
menu;
readln(op);
IF (op=1) THEN BEGIN
juego;
n:=n+1;
writeln('N§ de partidas: ' ,n);
writeln('Pulse una tecla para continuar');
readln;
CLRSCR;
END;
UNTIL (op=2);
END.


Basicamente hagos 2 funciones, una para cada jugada que luego se usan en el procedure juego, que el juego en si. Los IF-THEN-ELSE anidados no me hacen mucha gracia pero no sabia otro metodo, con un case no me salia. Otras cosas que no se hacer son los contadores que me han pedido. Tengo que mostrar el numero de partidas ganadas-perdidas y empatadas, no el numero de partidas en general.

Gracias de antemano
Para lo de mostrar el número de partidas ganadas y perdidas, crea dos variables (ganadas, perdidas) y auméntalas cada vez que ganes o pierdas respectivamente. Luego imprimes las dos variables y ya está.

Lo de los if - else, déjalos así. En un principio los switch son mas eficientes, ya que el compilador los enlaza como if encadenados. Sin embargo, los compiladores de hoy en día generan el mismo código (eficiente) para if que para switch. Aunque si estás usando Turbo Pascal quizá sería recomendable que lo hagas con switch. Aunque ya te digo que en el programa que tienes te va a dar igual en cuanto a eficiencia se refiere; va a ir igual de veloz con if que con switch.

Un saludo.
La etiqueta Code del foro, atención, sirve para poner código, mantiene la identación, etc.

La función jugadaMaquina la podrías simplificar bastante, ni te hace falta usar esa variable.

jugadaMaquina := random(3)

Lo mismo para la función jugadaHumano, el case te sobra. Estaría bien que comprobaras la entrada, puede que el jugador meta 0, 1, ó 2, pero también puede que meta otro número, o el nombre de su prima, en cuyo caso no obtienes el resultado esperado.

En la función del juego, si no estoy equivocado, tienes un problema con el if-else-etc, si la máquina juega a 0=piedra y el jugador a 2=tijera, el resultado es que gana (ya que jugada1>jugada2, primer condicional del if), cuando en el juego sería al revés. Ten en cuenta que en un if-else-etc, cuando una condición se evalúa a cierto las demás partes no se evalúan ni ejecutan. En general es un poco liosa esa parte, veo más lógico algo así (pseudocódigo, jH=jugada1, jM=jugada2):

si jM=jH entonces
   -- empate
sino si (jM=0 y jH=1) ó (jM=1 y jH=2) ó (jM=2 y jH=0) entonces
   -- ganas
sino
   -- pierdes
finsi


Si quisieras usar un case, se podría, aunque es una rayada, en este caso es mejor un if-elseif-else. En los case sólo se pueden usar valores discretos para diferenciar las acciones a realizar, sólo tendrías que buscar una relación entre la jugada del humano y la máquina que evaluara distinta cuando el resultado es la victoria, la derrota o el empate, pero siempre el mismo para cada situación.

Una posible relación sería (jH-jM+2) mod 3, cuyo resultado sería siempre 0 para la victoria, 1 para la derrota, 2 para el empate. El resultado sería:

seleccionar (jH-jM+2) mod 3
   caso 0
      -- ganas
   caso 1
      -- pierdes
   caso 2
      -- empatas
finseleccionar


Pero amos, que mejor un if-elseif-else.
bueno despues de un par de dias creo que he terminado el programa en cuestion. He aqui el resultado

PROGRAM PiedraPapelTijera;
USES CRT;
VAR
contador, ganadas, empatadas, perdidas, opcion: Integer;

PROCEDURE Menu;
BEGIN
     CLRSCR;
     Writeln('Este es el juego de piedra papel y tijera.');
     Writeln;
     Writeln('Introduzca 1 si quiere jugar.');
     Writeln;
     Writeln('Introduzca 2 si quiere salir.');
     Writeln;
     Writeln('Elija una opcion: ');
END;

FUNCTION JugadaMaquina: Integer;
VAR
   X: Integer;
BEGIN
     X:= random(3) + 1;
     CASE X OF
     1: JugadaMaquina:= 1;
     2: JugadaMaquina:= 2;
     3: JugadaMaquina:= 3;
     END;
END;

FUNCTION JugadaHumano: Integer;
VAR
   Y: Integer;
BEGIN
     CLRSCR;
     Writeln('Introduzca una opcion: ');
     Writeln;
     Writeln('1 para elegir Piedra.');
     Writeln;
     Writeln('2 para elegir Papel.');
     Writeln;
     Writeln('3 para elegir Tijera.');
     REPEAT
           Readln(Y);
           IF ((Y<1) OR (Y>3)) THEN
              Writeln('Opcion erronea, introduzca otro numero: ');
     UNTIL ((Y>=1) AND (Y<=3));

           CASE Y OF
           1: JugadaHumano:=1;
           2: JugadaHumano:=2;
           3: JugadaHumano:=3;
           END;
END;

PROCEDURE Juego;
VAR
   Jugada1, Jugada2: Integer;
BEGIN
     Jugada1:=JugadaHumano;
     Jugada2:=JugadaMaquina;
     IF (Jugada1 = Jugada2) THEN
     BEGIN
          Writeln('­­EMPATAS!!');
          empatadas:=empatadas + 1;
     END
     ELSE
         IF ((Jugada1=1) AND (Jugada2=3)) OR ((Jugada1=2) AND (Jugada2=1)) OR ((Jugada1=3) AND (Jugada2=2)) THEN
         BEGIN
              Writeln('­­GANAS!!');
              ganadas:=ganadas + 1;
         END
         ELSE
             BEGIN
             Writeln('­­PIERDES!!');
             perdidas:=perdidas + 1;
             END;
     Writeln('La maquina escogio: ');
     CASE Jugada2 OF
     1: Writeln('PIEDRA');
     2: Writeln('PAPEL');
     3: Writeln('TIJERA');
     END;
END;


BEGIN
contador:=0;
ganadas:=0;
perdidas:=0;
empatadas:=0;
REPEAT
      Menu;
      Readln(opcion);
      IF (opcion=1) THEN
      BEGIN
           Juego;
           contador:= contador + 1;
           Writeln('Numero de partidas jugadas: ', contador);
           Writeln;
           Writeln('Numero de partidas ganadas: ', ganadas);
           Writeln;
           Writeln('Numero de partidas perdidas: ', perdidas);
           Writeln;
           Writeln('Numero de partidas empatadas: ', empatadas);
           Writeln;
           Writeln('PULSE ENTER PARA CONTINUAR');
           Readln;
           CLRSCR;
      END;
UNTIL (opcion=2);
END.


Muy probablemente se me haya olvidado algo o hay cosas de mas pero en fin, no doy mas de si XD
A ver que os parece.

PD: ¿Puedo hacer para que vuelva al menu principal sin tener que pulsar ENTER? Me explico, para volver a jugar hay que presiona ENTER, puedo poner de alguna manera que se pueda presionar cualquier tecla?
Sigo sin verle la utilidad a este case, y quizá sea que hace mucho que no uso pascal, pero te lo dije y lo vuelves a poner..
           CASE Y OF
           1: JugadaHumano:=1;
           2: JugadaHumano:=2;
           3: JugadaHumano:=3;
           END;


¿No es lo mismo que JugadaHumano:=Y?

Por lo demás, así sin probarlo y por encima, lo veo bien.

Para lo de pulsar cualquier tecla, creo que alguna vez usé algo llamado keypressed, no recuerdo si era alguna librería en especial, y tampoco detectaba todas las teclas, creo que control y alt se las saltaba.
jajaj cierto, se me habia olvidado lo de los CASE, no sirven para nada. Gracias por tu aportacion.
Otra duda que tenia era lo de ver el valor de las variables. Me dijeron que era haciendo breakpoints y he estado buscando como hacerlos pero no se.
hola quien me puede ayudar hacer un juego en pascal que llene una matriz de 10x10 con las letras del abecedario de forma aleatoria con las funciones random y randomize?
seneri escribió:hola quien me puede ayudar hacer un juego en pascal que llene una matriz de 10x10 con las letras del abecedario de forma aleatoria con las funciones random y randomize?


Creas la matriz y la recorres, generando una letra aleatoria y asignándola.

Pon lo que llevas hecho y en qué dudas.
es un juego que permita llenar una matriz de 10x10 con las letras del abecedario de forma aleatoria con las funciones random y randomize. Solo se imprimira en pasntalla algun caracter deseado como* o cualquier otro, y dara la opcion de pedir letra, el la busca en la matriz y descubre los sitios donde la letra se encuentra. cada letra descubierta suma 2 puntos. una letra fallida o que ya haya sido descubierta resta 10 puntos. gana si se logran descubrir todas las letras, pierde si el puntaje baja a 0.
Por favor necesito ayuda de verdad yo no tengo idea de como trabajar con pascal
lo unico que tengo es:
program mat;
uses crt;
var
mat:array[1..10,1..10] of char;
i,j:integer;
procedure llenar;
begin
for i:= 1 to 10 do
begin
for j:= 1 to 10 do
begin
mat[i,j]:='x';
end;
end;
end;
mostrar;
procedure mostrar;
begin
for i:= 1 to 10 do
begin
for j:= 1 to 10 do
begin
gotoxy(10+ j, 10+i);
write(mat[i,j]);
end;
end;
end;
a:=random(26);
a:=a+65;
mat[i,j]:=char(a);
begin
clrscr;
llenar;
mostrar;
readkey;
end.
Aquí no te vamos a hacer los deberes, yo iría buscando un manual de pascal.
amuchamu escribió:Aquí no te vamos a hacer los deberes.

+1

La gente confunde ayuda con "paso_de_hacer_hazmelo_tú".
Y lo confunden con la misma asiduidad que "paso_de_buscar_en_google_dame_una_respuesta_completa_o_buscamelo_tú".
amuchamu escribió:Aquí no te vamos a hacer los deberes, yo iría buscando un manual de pascal.

es un juego que permita llenar una matriz de 10x10 con las letras del abecedario de forma aleatoria con las funciones random y randomize. Solo se imprimira en pasntalla algun caracter deseado como* o cualquier otro, y dara la opcion de pedir letra, el la busca en la matriz y descubre los sitios donde la letra se encuentra. cada letra descubierta suma 2 puntos. una letra fallida o que ya haya sido descubierta resta 10 puntos. gana si se logran descubrir todas las letras, pierde si el puntaje baja a 0.
Por favor necesito ayuda de verdad yo no tengo idea de como trabajar con pascal
lo unico que tengo es:
program mat;
uses crt;
var
mat:array[1..10,1..10] of char;
i,j:integer;
procedure llenar;
begin
for i:= 1 to 10 do
begin
for j:= 1 to 10 do
begin
mat[i,j]:='x';
end;
end;
end;
mostrar;
procedure mostrar;
begin
for i:= 1 to 10 do
begin
for j:= 1 to 10 do
begin
gotoxy(10+ j, 10+i);
write(mat[i,j]);
end;
end;
end;
a:=random(26);
a:=a+65;
mat[i,j]:=char(a);
begin
clrscr;
llenar;
mostrar;
readkey;
end.
seneri escribió:Por favor necesito ayuda de verdad yo no tengo idea de como trabajar con pascal

Pues si son deberes y no tienes ni idea, algo falla.
12 respuestas