Pascal/Turbo Pascal - Ayuda con tarea, por favor.

   
Vista:

Ayuda con tarea, por favor.

Publicado por Felix Echavarria (8 intervenciones) el 09/02/2010 06:09:16
Me gustaria su ayuda con un problema en pascal que me dejaron. El problem es el siguiente. realizar un cuadro con ═,╚,╝,╗,╔,║. Colocar una imagen dentro del cuadro, con caracteres ASCII. Eso ya lo tengo. Lo unico que me ahce falta es la siguiente parte: Si presiono la techa cursora arriba o abajo, la imagen se debe mover y por ende, el cuadro tambien. Ese es un examen que me dejaron para el miercoles. Por favor, ayudenme. Gracias
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 tarea, por favor.

Publicado por edwin (71 intervenciones) el 09/02/2010 08:04:07
pues aun te queda un dia mas

pero puedes investigar, que caracteres son los que arroja la tecla flecha arriba y flecha abajo

con la sentencia readkey.

con algo como esto

var
tecla:char;

begin
tecla:=readkey;
if tecla=#o then {esto se hace por que las flecha izquierda y derecha son caracteres especiales y anteponen un caracter #0, entonces se lee de nuevo}
tecla:=readkey;

case tecla of
FlechaIzquierda: begin
{movemos la posicion de los gotoxy o el procedimiento que dibuja el cuadro hacia la izquierda}
end;
FlechaDerecha:Begin
{movemos la posicion de los gotoxy o el procedimiento que dibuja el cuadro hacia la Derecha}
End
end;
end.

{para estas alturas asumo que habras investigado el valor de la flecha izquierda y derecha}

Lo demas es solo la presentacion de cuadro segun el movimiento de la flecha. otra cosa lee sobre gotoxy , que sirve para posicionar en la pantalla modo texto el cursor, con esto podras ubicar el cuadro..

saludos
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 tarea, por favor.

Publicado por Felix Echavarria (8 intervenciones) el 09/02/2010 21:59:44
¿si te dijera que no me creerias? No se los codigos
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 tarea, por favor.

Publicado por Felix Echavarria (8 intervenciones) el 09/02/2010 22:12:39
si me los dieras me ayudaria muchisimo
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 tarea, por favor.

Publicado por Felix Echavarria (8 intervenciones) el 09/02/2010 22:36:05
ya etngo lso codigos. Ahora, ¿como hago para cambiar la posicion original de la imagen cuando presione una tecla?
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 tarea, por favor.

Publicado por martin (74 intervenciones) el 10/02/2010 11:44:45
Hola, Felix.
Como quiera que lo que pides es algo laborioso, pues supongo que lo habras hecho en modo grafico y habras declarado una variable tipo puntero (pointer) que contendrá la imagen; por este motivo prefiero insertarte el codigo fuente de una imagen que se mueve con las teclas de direccion:

Program animacion_combinada;
Uses crt,graph;
var

gd,gm : integer;
fantasma1 :pointer;

{Definimos un procedimiento para inicializar el modo gráfico}

procedure inicia_graficas;
begin

GD := Detect;{Se autodetecta el tipo de tarjeta o controlador
gráfico para el monitor en el que se este ejecutando el programa}
InitGraph(GD, GM, 'c:\bp\bin\bgi');{Esta ruta indicada puede ser erronea, inserta la correcta}
if GraphResult <> grOk then Halt(1);{Evalua, si la inicialización no
fue correcta entonces Termina}
setcolor(YELLOW);
outtextxy(0,0,'TUTOR DE PROGRAMACION');
setcolor(CYAN);
outtextxy(0,15,'Animacion Combinada');

end;

{Definimos un procedimiento para pintar el fantasma}

procedure pinta_fantasma;
begin

{Cada instrucción conforma una parte del dibujo}

cleardevice;{Limpia la pantalla}

setcolor(lightblue);{Se fija el color a azul brillante}
setfillstyle(1,lightblue);{Se fija el estilo de relleno a solido en azul brillante}
arc(40,40,0,180,20);{Se pinta un arco en la columna 40, fila 40, que
empieza en 0 grados y termina en 180 grados, con un radio de 20 pixels}
line(20,40,20,60);{Se pinta una linea desde la columna 20, fila 40 hasta la
columna 20, fila 60 }
line(20,60,25,55);{Se pinta una linea desde la columna 20, fila 60
hasta la columna 25, fila 55 }
line(25,55,30,60);{Se pinta una linea desde la columna 25, fila 55
hasta la columna 30, fila 60}
line(30,60,35,55);{Se pinta una linea desde la columna 30, fila 60
hasta la columna 35, fila 55}
line(35,55,40,60); {Se pinta una linea desde la columna 35, fila 55
hasta la columna 40, fila 60}
line(40,60,45,55);{Se pinta una linea desde la columna 40, fila 60
hasta la columna 45, fila 55}
line(45,55,50,60);{Se pinta una linea desde la columna 45, fila 55
hasta la columna 50, fila 60}
line(50,60,55,55);{Se pinta una linea desde la columna 50, fila 60
hasta la columna 55, fila 55}
line(55,55,60,60);{Se pinta una linea desde la columna 55, fila 55
hasta la columna 60, fila 60}
line(60,60,60,40);{Se pinta una linea desde la columna 60, fila 60
hasta la columna 60, fila 40}
floodfill(50,50,lightblue);{Se rellena la figura con color azul brillante}
setcolor(white);{Se fija el color en blanco}
arc(40,43,200,350,10);
setfillstyle(1,white);{Se fija el estilo de relleno a solido en blanco}
fillellipse(35,35,4,5);{Se pinta una elise rellena en la columna 35, fila 35
con 4 pixels de radio en "X" y 4 en "Y"}
fillellipse(45,35,4,5);{Se pinta una elise rellena en la columna 45, fila 35
con 4 pixels de radio en "X" y 4 en "Y"}

setfillstyle(1,BLUE);{Se fija el estilo de relleno a solido en azul brillante}
fillellipse(35,38,2,2);{Pinta una el elipse en la columna 35, fila 38 de
2 pixels de radio en "X" y "Y"}
fillellipse(45,38,2,2);{Pinta una el elipse en la columna 45, fila 38 de
2 pixels de radio en "X" y "Y"}

{Una vez hemos dibujado la imagen del fantasma, procedemos a capturarla en
una posición determinada de la memoria para despues copiarla y hacer la
animación}

getmem(fantasma1,imagesize(20,20,60,60));
{La función imagesize devuelve el número de bytes requeridos para almacenar
el mapa de bits de la porción de la pantalla comprendida entre la columna 20
fila 20 hasta la columna 60 fila 60.
El procedimiento Getmem reserva el número de bytes que le entrega la función
imagesize y pone la dirección al comienzo de la variable de tipo Pointer fantasma1
observese detenidamente que en este caso fantasma va sin ^ }
getimage(20,20,60,60,fantasma1^);{Este procedimiento almacena en la variable
fantasma1 los pixels contenidos entre la columna 20, fila 20 hasta la
columna 60 fila 60, notese que en este caso la variable fantasma1 si lleva
el signo ^ }

end;{Final del procedimiento que pinta el fantasma}

procedure movimiento;
var

x,y,desplazamiento,valor,pausa : integer;
contador : byte;
tecla : char;

begin

desplazamiento:=20;{Numero de Pixels que va a avanzar el fantasma en
cualquier dirección}
pausa:=100;{Se hace una espera en milisegundos}
x:=getmaxx div 2; {El valor de X se situa en la mitad de la pantalla}
y:=getmaxy div 2; {El valor de Y se situa en la mitad de la pantalla}
cleardevice;{Se limpia la pantalla}
setcolor(Yellow);
outtextxy(10,10,'TUTOR DE PROGRAMACION');
setcolor(White);
outtextxy(10,20,'Movimiento de una figura con las flechas de dirección');
outtextxy(10,30,'Presione flechas de direccionamiento para mover o [ESC] para terminar');
repeat{Este ciclo se repite hasta que se presiona la tecla [ESC] o sea la #27}

tecla:=readkey;{La variable tecla de tipo char se le asigna el valor dela tecla capturado mediante la función readkey}
valor:=ord(tecla);{La variable valor de tipo integer, toma el valor ordinal de la tecla leida}
if valor=0 then valor:=-ord(readkey);
{En este case se evalua el valor de la tecla}
case valor of

-75:begin{En caso de que se halla presionado la tecla FLECHA IZQUIERDA}
x:=x-desplazamiento;

{El procedimiento PUTIMAGE pinta sobre la pantalla en las coordenadas
respectivas (columna x, fila y) la imagen almacenada previamente y
asignada a la variable fantasma1; la sentencia XORPUT quiere decir
que va a pintar la imagen y restablecer el fondo, si quieres probar,
puedes cambiar este valor por : COPYPUT, ORPUT, ANDPUT, o NOTPUT,
observar que pasa y de ahi sacar tus propias conclusiones}

repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;

end;
-77:begin{En caso de que se halla presionado la tecla FLECHA DERECHA}
x:=x+desplazamiento;
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
-80:begin{En caso de que se halla presionado la tecla FLECHA ABAJO}
y:=y+desplazamiento;
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
-72:begin{En caso de que se halla presionado la tecla FLECHA ARRIBA}
y:=y-desplazamiento;
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
else{En caso de que se presione una tecla diferente a las flechas
de direccionamiento, se emite un pitido}
begin
sound(400);
delay(50);
nosound;
end;

end;{case}

until tecla=#27;{Se repite hasta que se presiona la tecla [ESC]}

end;{Final del procedimiento}

begin{Inicio del programa principal}

inicia_graficas;{Llamado a el procedimiento para inicializar el modo gráfico}
pinta_fantasma;{Llama al procedimiento que pinta y "captura" el fantasma}
movimiento;{Realiza el movimiento de la figura}
closegraph;{Se cierra el modo gráfico}

end.{Final del programa principal}

Espero te solucione el problema.
Un saludo
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 tarea, por favor.

Publicado por Felix Echavarria (8 intervenciones) el 10/02/2010 11:48:55
Esta muy bueno, solo hay un inconveniente:No me han dado puntero. El profesor aclaro, que si ultilizamos algo que el no ha dado, nos lo pondra malo completo el programa. Dame tu correo para mandarte lo que he hecho y me ayudes con lo que puedas. Gracias
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 tarea, por favor.

Publicado por edwin (71 intervenciones) el 10/02/2010 17:09:13
bueno en vista de que no veo mejora en tu aporte, ahi va

no es necesario usar graficos , ni de guardar el valor de el cuadro en una puntador , es un simple truco de pantalla presento y borro lo anterior es solo eso
lo que si es necesario es cambiar la ubicacion del cuadro
y es eso lo que haremos en modo texto...

te sorprenderas los encillo que es:

para esto realize dos procedimientos uno que dibuja un cuadro y otro que dibija un marco
ya los tenia solo los pegue, pero lo interesante esta en el cuerpo del programa

tal vez se desordene un poco , por el editor de la pagina

program muevecuadro;
uses crt;

{------------------------|-----------------------------------|--------------------------|------------------------}
Procedure Marco(columnaInicio,RenglonInicio,ColumnaFinal,RenglonFinal:integer ; ColorTexto,ColorFondo,TipoMarco:byte);
var
Columna,Renglon :integer;
Horizontal,Vertical ,EzquinaSuperiorDerecha,EzquinaSuperiorIzquierda,
EzquinaInferiorDerecha ,EzquinaInferiorIzquierda:char;
begin
TextAttr:= ColorTexto+Colorfondo*16;
case TipoMarco of
1 :begin
Horizontal :='Í';
Vertical :='º';
EzquinaSuperiorDerecha :='»';
EzquinaSuperiorIzquierda :='É';
EzquinaInferiorDerecha :='¼';
EzquinaInferiorIzquierda :='È';
end;
2 :begin
Horizontal :='Ä';
Vertical :='³';
EzquinaSuperiorDerecha :='¿';
EzquinaSuperiorIzquierda :='Ú';
EzquinaInferiorDerecha :='Ù';
EzquinaInferiorIzquierda :='À';
end;
end;

{lineas paralelas}
For Columna := ColumnaInicio To ColumnaFinal Do
begin
gotoxy(Columna,RenglonInicio);write(Horizontal );
gotoxy(Columna,RenglonFinal);write(Horizontal );
end;
{ lineas horizontales}
For Renglon := RenglonInicio To RenglonFinal Do
Begin
gotoxy(ColumnaInicio,Renglon);write(Vertical);
gotoxy(ColumnaFinal,Renglon);write(Vertical);
End;
{esquinas}
gotoxy(ColumnaInicio,RenglonInicio);write(EzquinaSuperiorIzquierda);
gotoxy(ColumnaFinal,RenglonInicio);write(EzquinaSuperiorDerecha );
gotoxy(ColumnaInicio,RenglonFinal);write(EzquinaInferiorIzquierda);
gotoxy(ColumnaFinal,RenglonFinal);write(EzquinaInferiorDerecha);
end;

{------------------------|-----------------------------------|--------------------------|------------------------}

procedure cuadro(columnaInicio,RenglonInicio,ColumnaFinal,RenglonFinal:integer ; ColorTexto,ColorFondo,TipoMarco:byte);
var
Columna,Renglon :integer;
Horizontal,Vertical ,EzquinaSuperiorDerecha,EzquinaSuperiorIzquierda,
EzquinaInferiorDerecha ,EzquinaInferiorIzquierda:char;
Begin
window(ColumnaInicio,RenglonInicio,ColumnaFinal,RenglonFinal);
TextAttr:= ColorTexto+Colorfondo*16;
clrscr;
Window(1,1,80,25);
Marco(columnaInicio,RenglonInicio,ColumnaFinal,RenglonFinal,ColorTexto,ColorFondo,TipoMarco);
End;
{------------------------|-----------------------------------|--------------------------|------------------------}

var
tecla:char;
columna,renglon,PosicionX,PosicionY:integer;

{cuerpo del programa}
begin
Columna:=1;
Renglon:=1;
PosicionX:=1;
PosicionY:=1;
repeat
Textattr:=7+0*16;
clrscr;
cuadro(columna+PosicionX,Renglon+PosicionY,Columna+PosicionX+2,Renglon+PosicionY+1,14,1,1);
tecla:=readkey;
If Tecla=#0 then
Tecla:=readkey;
case Tecla of
#77:begin{Derecha}
inc(PosicionX);
if PosicionX > 75 then
dec(PosicionX);
end;
#75:begin {Izquierda}
dec(PosicionX);
If PosicionX < 1 then
PosicionX:=1;
End;
#80:Begin {abajo}
inc(PosicionY);
if PosicionY > 22 then
dec(PosicionY);
End;
#72:Begin {arriba}
dec(PosicionY);
if PosicionY < 1 then
PosicionY:=1
End;
end; {case}
until tecla=#27;
end.
{fin delprogama}

espero que te sirva
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 tarea, por favor.

Publicado por Felix Echavarria  (8 intervenciones) el 16/02/2010 02:20:56
Gracias por la ayuda. Aun no se cuanto obtuve pero esper que haya sido una buena calificacion. Ahora bien, tengo otra peticion, necesito ayuda para construir un laberinto y que el objeto que se mueva, no cruce por las paredes del laberinto. no tiene que ser algo muy complejo, pero tampoco muy sencillo. Espero su respuesta.
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