Pascal/Turbo Pascal - Ayuda con programa

   
Vista:

Ayuda con programa

Publicado por Jose (3 intervenciones) el 31/05/2008 12:07:11
Puede alguien ayudarme con esto..

Realizar el análisis, diseño y codificación en PASCAL de un programa que muestre un puzzle
cuyas piezas son caracteres generados aleatoriamente y solicite al usuario que reconstruya dicho
puzzle pieza a pieza por filas, seleccionando las piezas mediante un menú de opciones. El juego de
piezas posibles serán los caracteres con códigos ASCII 32, 219, 220, 221, 222 y 223. Tras la
reconstrucción, el programa mostrará el número de fallos, el tiempo (en segundos) empleado en
completarlo y la puntuación final, que será igual a los segundos empleados más una penalización de
5 segundos por cada fallo cometido.
Para determinar la hora actual deberá utilizarse el procedimiento interno getTime, incluido
en la biblioteca llamada dos. Este procedimiento devuelve la hora, minutos, segundos y centésimas
de segundo actuales en sendos parámetros de tipo word. Por ejemplo, si la hora actual es
14:36:3,78, getTime(h,m,s,c) devolverá en h, m, s y c los valores 14, 36, 3 y 78,
respectivamente.
Para superar la práctica será obligatorio emplear un vector para representar el juego de
caracteres posibles para las piezas del puzzle y definir, al menos, los siguientes módulos:
● iniciarJuegoCar: se encargará de inicializar un vector con el juego de caracteres posibles
para las piezas del puzzle, devolviendo dicho vector y su tamaño.
● generarPuzzle: a partir del juego de caracteres posibles, se encargará de generar el puzzle
que el usuario deberá reconstruir, devolviendo el puzzle generado.
● vaciarTablero: se encargará de quedar vacío el tablero sobre el que el usuario deberá situar
las piezas del puzzle y devolverlo.
● mostrarMatriz: se encargará de mostrar una matriz por pantalla (puzzle o tablero).
● leerEntero: se encargará de leer desde teclado un entero en un intervalo y devolverlo.
● leerRespuesta: se encargará de leer desde teclado una pieza elegida por el usuario, situarla
en el tablero en la posición correspondiente y comprobar si la pieza elegida es la correcta,
devolviendo el nuevo tablero y el número de fallos cometidos hasta ese momento.
● segundos: calculará el número de segundos transcurridos desde un instante anterior
(indicado mediante horas, minutos, segundos y centésimas de segundo) hasta la actualidad,
devolviendo ese valor redondeado al entero más cercano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con programa

Publicado por Dani (159 intervenciones) el 31/05/2008 16:38:03
Te dicen hasta los procedimientos que tienes que hacer. ¿Cuál es el problema?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Jose (1 intervención) el 31/05/2008 16:59:46
Esto es lo que llevo


program puzzle(input,output);
uses crt;
(* Definici¢n de constantes *)
const NUMMIN=0;
NUMMAX=6;

(* Definici¢n de tipos *)
type tipoVector=packed array [1..4, 1..4] of char;

(* Variables glovales *)
var mat:tipoVector;
varaux:integer;
elementoi:char;


(** iniciarJuegoCar **)
(** Se encargar  de inicializar un vector con el juego de caracteres posibles **)
(** para las piezas del puzzle, devolviendo dicho vector y su tama¤o **)

procedure CargaMat(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
begin
varaux:=random(5)+1;
case varaux of
1:
elementoi:=chr(32);
2:
elementoi:=chr(219);
3:
elementoi:=chr(220);
4:
elementoi:=chr(221);
5:
elementoi:=chr(222);
6:
elementoi:=chr(223)
end;
mat[i,j]:=elementoi;
end;
end;

(** generarPuzzle **)
(** Se encargar  de generar el puzzle que el usuario deber  **)
(** reconstruir **)


(** vaciarTablero **)

procedure Vaciar(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
mat[i,j]:=0; Esto no se que hacer porque la matriz es un char porque lleva
end; caracteres y necesito alguna forma para limpiar el tablero
Nose que hay que hacer en el módulo generarpuzzle y tampoco se mostarMatriz los demás ya si los se,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Dani (159 intervenciones) el 01/06/2008 13:37:33
Para limpiar el tablero, llena la matriz con el caracer espacio ' '

Para mostrar la matriz, imprime todas las posiciones de una en una

Para generar el puzzle, haz random en cada posición de la matriz

Usando FOR en los tres procedimientos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Jose (3 intervenciones) el 01/06/2008 14:11:50
program puzzle(input,output);
uses crt;

(* Definici¢n de constantes *)
const NUMMIN=0;
NUMMAX=6;

(* Definici¢n de tipos *)
type tipoVector=packed array [1..4, 1..4] of char;

(* Variables glovales *)
var mat:tipoVector;
varaux,resp,fallos:integer;
tiempo:real;
elementoi:char;


(** iniciarJuegoCar **)
(** Se encargar  de inicializar un vector con el juego de caracteres posibles **)
(** para las piezas del puzzle, devolviendo dicho vector y su tama¤o **)

procedure CargaMat(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
begin
varaux:=random(5)+1;
case varaux of
1:
elementoi:=chr(32);
2:
elementoi:=chr(219);
3:
elementoi:=chr(220);
4:
elementoi:=chr(221);
5:
elementoi:=chr(222);
6:
elementoi:=chr(223)
end;
mat[i,j]:=elementoi;
end;
end;

(** generarPuzzle **)
(** Se encargar  de generar el puzzle que el usuario deber  **)
(** reconstruir **)


(** vaciarTablero **)

procedure Vaciar(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
mat[i,j]:=chr(48);
end;


(** mostarMatriz **)
procedure mostrarMatriz(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
begin
write(mat[i,1]);
write(mat[i,2]);
write(mat[i,3]);
writeln(mat[i,4]);
end;
end;



(** leerEntero **)
(** Se encargar  de leer desde el teclado un entero en un **)
(** intervalo y devolverlo **)

function leerEntero(min,max:integer):integer;
var resp:integer;
begin
readln(resp);
while (resp < min) or (resp > max) do
begin
writeln('Error. Indica un n£mero entre ' ,min,' y ',max,':');
readln(resp);
leerEntero:=resp;
end;

(** leerRespuesta **)
(** Se encargar  de leer desde el teclado la respuesta del **)
(** usuario y devolver el n£mero de puntos conseguidos **)

function leerRespuesta(mat:tipoVector):char;
begin
writeln('1:',chr(32),'; 2:',chr(219),'; 3:',chr(220),'; 4:',chr(221),'; 5:',chr(222),'; 6:',chr(223)';');
write('(',i,',',j,')?');
numero:=leerEntero(NUMMIN,NUMMAX);
numero:=varauxb
case numero of
1:
varauxb:=chr(32);
2:
varauxb:=chr(219);
3:
varauxb:=chr(220);
4:
varauxb:=chr(221);
5:
varauxb:=chr(222);
6:
varauxb:=chr(223)
end;
mat[i,j]:=varauxb;
write(mat[i,j];
if elementoi<>varauxb
begin
fallos:=fallos+1
end;
end;



(** segundos **)

begin
getTime(h,m,s,c);
var h,m,s,c:word;
tiempo:=c/100+s+m*60+h*60*60
end;

Me da error en el módulo leerRespuesta con ``function leerRespuesta(mat:tipoVector):char;´´ y no se porque es, y luego, necesito poner al principio uses Dos para que funcione getTime y tb me da error.
Me puede mirar porque es?Gracias tio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Dani (159 intervenciones) el 01/06/2008 14:56:30
Para importar las librerías CRT y DOS es

USES
crt, dos;

El error en leerRespuesta es porque no has puesto el END; a la función anterior (leerEntero)

Además de eso, en la primera línea de la función leerRespuesta falta una coma en el write, faltan los identificardores I, J, NUMERO, VARAUXB, y el punto y coma antes del CASE

Dentro del CASE trabajas con VARAUXB como un caracter, pero fuera del CASE lo tratas como un entero...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Jose (3 intervenciones) el 01/06/2008 16:53:05
program puzzle(input,output);
uses crt,dos;

(* Definici¢n de constantes *)
const NUMMIN=0;
NUMMAX=6;

(* Definici¢n de tipos *)
type tipoVector=packed array [1..4, 1..4] of char;

(* Variables glovales *)
var mat:tipoVector;
varaux,resp,fallos,puntos,tiempo:integer;
tiempo1,tiempo2:real;
elementoi,varauxb:char;
h1,m1,s1,c1,h2,m2,s2,c2:word;


(** iniciarJuegoCar **)
(** Se encargar  de inicializar un vector con el juego de caracteres posibles **)
(** para las piezas del puzzle, devolviendo dicho vector y su tama¤o **)

procedure CargaMat(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
begin
varaux:=random(5)+1;
case varaux of
1:
elementoi:=chr(32);
2:
elementoi:=chr(219);
3:
elementoi:=chr(220);
4:
elementoi:=chr(221);
5:
elementoi:=chr(222);
6:
elementoi:=chr(223)
end;
mat[i,j]:=elementoi;
end;
end;

(** generarPuzzle **)
(** Se encargar  de generar el puzzle que el usuario deber  **)
(** reconstruir **)


(** vaciarTablero **)

procedure Vaciar(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
mat[i,j]:=chr(48);
end;


(** mostarMatriz **)
procedure mostrarMatriz(var mat:tipoVector);
var i,j:integer;
begin
for i:=1 to 4 do
begin
write(mat[i,1]);
write(mat[i,2]);
write(mat[i,3]);
writeln(mat[i,4]);
end;
end;



(** leerEntero **)
(** Se encargar  de leer desde el teclado un entero en un **)
(** intervalo y devolverlo **)

function leerEntero(min,max:integer):integer;
var resp:integer;
begin
readln(resp);
while (resp < min) or (resp > max) do
begin
writeln('Error. Indica un n£mero entre ' ,min,' y ',max,':');
readln(resp);
leerEntero:=resp;
end;
end;

(** leerRespuesta **)
(** Se encargar  de leer desde el teclado la respuesta del **)
(** usuario y devolver el n£mero de puntos conseguidos **)


function leerRespuesta(var mat:tipoVector;var i,j:integer):integer;
var numero:integer;
varauxb:char;
begin
writeln('1:',chr(32),'; 2:',chr(219),'; 3:',chr(220),'; 4:',chr(221),'; 5:',chr(222),'; 6:',chr(223),';');
write('(',i,',',j,')?');
numero:=leerEntero(NUMMIN,NUMMAX);
case numero of
1:
varauxb:=chr(32);
2:
varauxb:=chr(219);
3:
varauxb:=chr(220);
4:
varauxb:=chr(221);
5:
varauxb:=chr(222);
6:
varauxb:=chr(223)
end;
mat[i,j]:=varauxb;
write(mat[i,j]);
if elementoi<>varauxb then
begin
fallos:=fallos+1
end;
end;



(** segundos **)
function segundos(h1,m1,s1,c1:word):real;
var h2,m2,s2,c2:word;
begin
getTime(h2,m2,s2,c2);
tiempo:=round((h2-h1)*3600+(m2-m1)*60+s2-s1+((c2-c1)/100));

end;

(* Cuerpo del programa principal *)
begin
clrscr;
fallos:=0;
CargaMat(mat);
mostrarMatriz(mat);
vaciar(mat);
fallos:=leerRespuesta(mat);

end.

Que es lo que me falla x favorr?me da error en fallos:=leerRespuesta(mat);
justo al final
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Diego Romero (997 intervenciones) el 01/06/2008 19:38:21
leerRespuesta devuelve un tipo char, fallos es de tipo integer.

La próxima vez haz el favor de decir qué error te da y no solo "me da error".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa

Publicado por Dani (159 intervenciones) el 01/06/2008 20:59:52
No, leerRespuesta devuelve integer, eso está correcto.

El fallo es que en la penúltima línea llamas a leerRespuesta con un solo argumento
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar