martes, 16 de octubre de 2012

UCBLogo: Telesketch



Queremos diseñar un programa que emule el funcionamiento de un telesketch, de tal manera que podamos dibujar rayas hacia arriba, abajo, izquierda y derecha con el teclado pulsando las teclas i, k, j y l respectivamente, de tal manera que podamos realizar un dibujo en la pantalla en función de las teclas que pulsemos.

Veamos el siguiente código de este sencillo telesketch:

clearscreen
hideturtle
to tele
make "tecla rc   
if tecla = "i [fd 5]
if tecla = "k [back 5]
if tecla = "j [lt 90 fd 5 rt 90]
if tecla = "l [rt 90 fd 5 lt 90]

if tecla = "s [savepict "dibujo]
if tecla = "c [loadpict "dibujo]
tele
end

El código creado se ha hecho usando un procedimiento, en este caso el procedimiento tele. Un procedimiento, a efectos prácticos, viene a ser como definir un nuevo comando que a partir de ahora el compilador va a saber ejecutar. Para ejecutarlo no tenemos más que escribir su nombre y pulsar intro: tele.

las dos primeras líneas (clearscreen y hideturtle) sencillamente borran la pantalla y ocultan la tortuga respectivamente. La línea tercera (to tele) y última (end), delimitan y definen el procedimiento tele. La penúltima línea (tele) aporta recursividad, es decir, como llama al procedimiento tele desde el propio procedimiento tele, garantiza que el programa se ejecute indefinidamente.

La lectura del teclado la da la línea make “tecla rc que significa que va a esperar hasta que haya una tecla pulsada y que la variable tecla va a tener el valor de la tecla pulsada (rc significa read character, es decir, leer carácter). (NOTA: en LOGO no hace falta declarar previamente la variable).

En resumen, lo que tenemos es un programa que se ejecuta de manera continua, que lee una tecla cuando se pulsa y que guarda el valor de la tecla pulsada en una variable que se llama tecla.

Una cuestión importante para este y para el resto de programas, es el tema de la orientación de la tortuga: inicialmente mira hacia arriba y así debemos dejarla siempre, mirando hacia arriba después de cada interacción, pues así garantizaremos la integridad del funcionamiento del videojuego, lo veremos en breve con este ejemplo.

El resto de las líneas sencillamente indica qué es lo que se espera que el programa haga en función de las teclas pulsadas, así:

·        Si pulsamos la tecla i, la tortuga avanza 5 unidades, es decir, dibuja una línea desde donde está hacia arriba de 5 unidades. Esto se consigue con la sentencia if tecla = “i [fd 5], pues la primera parte es un condicional (si la variable tecla vale “i…) y la segunda lo que debe hacer en este supuesto [fd 5] que significa que avance 5 unidades. Y, además, como hemos dicho, lo hará hacia arriba. ¿Por qué? Porque inicialmente la tortuga mira hacia arriba y vamos a garantizar (ya veremos cómo) que después de cada pulsación así quede siempre.
·        Si pulsamos la tecla k, la tortuga retrocede 5 unidades, lo que se traduce en que dibuja una línea desde donde está hacia abajo 5 unidades. Esto se consigue porque al escribir [back 5], la tortuga, como está mirando hacia arriba, ir hacia atrás es dibujar una línea hacia abajo (y como no cambiamos la dirección de la tortuga, esta sigue mirando hacia arriba).
·        Si pulsamos la tecla j ejecutamos 3 instrucciones: las dos primeras son para hacer lo que queremos que haga, es decir, dibujar una línea hacia la izquierda, y la última, la hacemos para preservar la orientación de la tortuga inicial, es decir, que mire de nuevo hacia arriba. Esto se traduce en el siguiente código: lt 90 (hace que la tortuga gire 90 grados a la izquierda), fd 5 (avanzamos 5 en la dirección en la que la tortuga mira, es decir, a la izquierda) y finalmente rt 90 (para que la tortuga vuelva a mirar hacia arriba y así garantizar una orientación correcta de la tortuga).
·        Si pulsamos la tecla l hacemos lo mismo que con la tecla j pero dibuja 5 unidades hacia la derecha en lugar de hacia a la izquierda.

Una captura con la imagen del juego:


Por último las teclas s y c guardan el dibujo o cargan uno hecho mediante los procedimientos savepict y loadpict respectivamente.