Tutorial de Karel
El Robot Karel
Programar un ordenador en un lenguaje como Pascal, requiere un secuenciamiento preciso de los pasos, uno detrás de otro, escogiendo que pasos hay que seguir en cada caso, y controlando la repetición de ciertos pasos, en el proceso de resolución de un problema. Aunque esta precisión se requiere para las operaciones sin razonamiento de las computadoras, es extraña a los humanos. Los humanos somos mucho menos rígidos en nuestro comportamiento y podemos retroceder elegantemente si nuestros pasos no parecen llevar a la consecución de un objetivo. Debido a que son diferentes las habilidades de las computadoras y lo humanos, expresar la solución de un problema en instrucciones que una computadora puede seguir está comprobado que es difícil para mucha gente. Para conocer estos conceptos, nosotros empezaremos programando el Robot Karel. Karel es una herramienta de aprendizaje que presenta los conceptos de una forma visual, lo cual es menos abstracto que programar en un lenguaje como Pascal o C. El Robot Karel fue introducido por Richard Pattis en su libro Karel the Robot: A Gentle Introduction to the Art of Programming with Pascal, John Wiley & Sons, Inc., 1981.
Nosotros programaremos Karel, un Robot simple que vive en un mundo simple. Debido a que Karel y su mundo son simulados, nosotros podemos realmente ver los resultados de un programa en acción! El lenguaje con el que programaremos Karel es una versión especial de Pascal, por lo tanto, la mayor parte de lo que aprendamos, podrá ser aplicado directamente al lenguaje de programación estándar Pascal.
Por qué programamos Karel
Karel puede orientarse en una de las cuatro direcciones: este, oeste, norte y sur. Sólo gira 90º cada vez, por tanto no puede orientarse hacia en nordeste, por ejemplo. En el mundo de Karel, las calles van de este a oeste, y son numeradas comenzando por 1. No hay números de calle igual a 0 o negativos. Las avenidas van de norte a sur, y también están numeradas empezando por 1. Tampoco hay números de avenida igual a 0 o negativos. Se le llama esquina a la intersección de una calle con una avenida. Karel va de una esquina a la siguiente en un solo movimiento.
Selecciona en tu PC Inicio/Programas/JKarelTheRobot/JKarelTheRobot .Se iniciará el simulador del Robot. Ahora deberías ver la ventana de abajo .
Esta ventana muestra las calles y avenidas que usa Karel para desplazarse. Primero debemos inicializar (o crear) el mundo que Karel va a ocupar. La idea es que puedas introducir algunos elementos en el mundo inicial de Karel
El cuadrado en la esquina de la 1ª avenida es el cursor que puedes avanzar con los botones del cursor o con el ratón
Puedes colocar muros en el norte, sur, este u oeste del cursor usándolas casillas de opción (checkboxes). Los muros que limitan las calles y avenidas no se pueden quitar, éstos son los que previenen que Karel se salga del mundo. Prueba a introducir algunos muros para ver que aspecto tienen.
Otro elemento de interés en el mundo de Karel son los zumbadores. Un
zumbador es una forma de marca que Karel puede escuchar sólo cuando
se encuentra en la misma esquina que el zumbador. Karel tiene una bolsa que
puede utilizar para poner los zumbadores que vaya cogiendo. También
puede hacer lo contrario, es decir, sacar los zumbadores de su bolsa y depositarlos
en las esquinas por las que va pasando. Puedes ajustar el número inicial
de zumbadores en cada esquina con el control Zumbadores.
Prueba a poner algunos zumbadores para ver como se visualizan en el mundo. Crea el mundo inicial que se muestra a continuación.
Dado que hemos realizado todo el trabajo necesario para crear un mundo para Karel, vamos a guardarlo! Pulsa sobre el botón Guardar, ve a tu directorio particular y guarda el mundo como “NuevoMundo.km”
Finalmente, Karel tiene su sitio en el mundo!Mueve
el cursor hacia la esquina de la Avenida 15 y Calle 1 y haz click sobre el
botón "Ve al Cursor". Desplaza el cursor hacia
la 2ª Calle para tener una buena vista de Karel. Karel se representa
con una flecha que muestra su orientación. Haz
click sobre el botón"Orient." y selecciona oeste. Ahora
deberías visualizar el mundo de abajo. Haz de nuevo
click sobre el botón "Guardar", para
almacenar los cambios.
El mundo de Karel
Antes de poder empezar, necesitamos dar a Karel un programa (serie de instrucciones) a seguir. Después de todo es sólo un
Robot!. Pulsa sobre la pestaña "Programa" Ahora deberías ver una ventana con
el aspecto de esta de abajo. La zona que está vacía es donde
escribiremos y veremos el programa de Karel.
Pulsa en el botón "Nuevo" . nesqueleto del programa será creado automáticamente.
Se creará un programa inicial. Este programa inicial contiene los comandos
básicos que son necesarios en cada programa. Ahora deberías
ver una ventana como la siguiente.
Date cuenta de que el programa anterior sólo le dice a Karel que se
apague!. Antes de apagarlo, vamos a mandarle algunas
tareas. La orden "avanza" le dice a Karel
que se mueva hacia adelante una esquina. Escribe "avanza;" antes de"apagate;". Date cuenta de que lel punto y coma se usa para separar órdenes
(tal como en Pascal). Ahora pulsa el botón "Compilar". Si no
has cometido ningún error, tu programa tendrás el aspecto del
de la ventana siguiente.
Click the
Execute tab, then click the Initialize button.
(Execute begins the execution (running) of your program. Initializing Karel's
world displays the world you previously created (in this case "newworld.kw").
You should now see the screen below (assuming that "newworld.kw", you created
and saved is still open.) If not, click the "Initial World" tab, and then
the "Open" button, and open the "newworld.kw" file you saved in the last step.
Then click the Execute tab and the Initialize button. Notice that Karel's
next instruction field says "avanza", and a small arrow points to the position
in the program. At this point click Step to have Karel carry out the first
command of his program. Wow! Karel avanzad on his own! Notice the next instruction
is now "apagate". Oh well...you've got to go sometime. Click Step again. Notice
that the next instruction now reads "turned-off". If you try to step again,
you will be told the program has not been started. To see Karel in action
again, you have to click Initialize.
Pulsa la pestaña de Ejecutar, y después
haz click en el botón Inicializar. (Ejecutar inicia la
ejecución (correr) de nuestro programa. Al Inicializar, se muestra
el mundo que habíamos creado previamente (NuevoMundo.km). Ahora deberías ver la ventana de abajo (asumiendo que el
fichero “NuevoMundo.km” que creaste está todavía abierto. Si
no, pulsa en la pestaña “Mundo”, y pulsando en el botón “Abrir”,
selecciona el fichero “NuevoMundo.km” que guardaste en el punto anterior).
Date cuenta que el campo “siguiente intrucción” dice "avanzar", y una flecha pequeña apunta a esa posición en el programa. En este punto haz click en “Paso” para que Karel realice esa primera orden del programa. Wow! Karel se ha movido solo! Date cuenta que la siguiente instrucción ahora es "apagate". Haz click sobre “Paso”de nuevo. Ahora la siguiente instrucción dice "apagate". Si quieres probarlo otra vez, antes tendrás que pulsar sobre el botón Inicializar.
Ejercicio 1: Escribe un programa de
Karel para que se mueva a la esquina de la 1ª Calle con la 1ª Avenida
y se desconecte, asumiendo que empieza en la esquina de la Calle 15 y la Avenida
15 con orientación hacia el Oeste. Guarda el programa con el nombre
“karel_1.kp”. Como mundo utiliza el guardado anteriormente con el nombre
“NuevoMundo.km”.
Inténtalo !!.
Hay cinco comandos básicos para Karel, estos son:
La salud de Karel
Andar entre muros no es bueno para un robot, por lo tanto Karel tiene algunos
mecanismos salvavidas dentro de él. Si un programa le dice a Karel
que se mueva aunque haya un muro delante de él, él dirá
que hay un error y no realizará la acción. Lo mismo ocurrirá
si le decimos que coja un zumbador en una esquina y no exista ninguno. Las
únicas órdenes que siempre lleva a cabo sin importar la situación
en la que se encuentre son gira-izquierda y apagate. Cuando
Karel nos dice que hay un error, no tenemos que echarle las culpas, sino
que probablemente habremos escrito mal alguna instrucción.
Ejercicio 2: Cada mañana Karel se levanta
de la cama y tiene que recoger el periódico, representado por un zumbador,
que está en el porche de la casa. Escribe un programa que ordenará
a Karel que recoja el periódico y lo lleve de vuelta a la cama. La
situación inicial es la de la imagen de abajo, y la situación
final debe tener a Karel de vuelta en la cama (misma esquina, misma dirección
que cuando empezó) con el periódico (zumbador en su mochila).
Crea un mundo como el de la imagen y guárdalo como “periódico.km”.
¿Cómo lo hago?
Puedes editar el mundo “karel_1.kp” pulsando en la pestaña Programa,
y abriendo el fichero. Guarda
tu programa con el nombre “karel_2.kp”. Ahora pulsa en Compilar. Pulsa en la pestaña Ejecutar,
Inicializa y corre el programa.
Comandos básicos de Karel
5. Sentencias de Control de KAREL
Las sentencias de control se usan para elegir qué hacer, y/o cuantas veces hacerlo. Sin embargo, por si solos no causan que ocurra algo. Simplemente controlan la ejecución de otras sentencias o fragmentos de código. A continuación se lista una serie de sentencias de control de Karel:
· Si/Entonces
· repite/Nº de veces
· Si/Entonces/Sino
· Mientras/Hacer
Siempre a continuación de las sentencias de control entonces, veces, sino, y Hacer van seguidas de la palabra iniciopara iniciar el grupo de sentencias a ser realizado. El grupo de sentencias va seguido de la palabra fin. Utilizamos el par inicio/fin para un sólo parámetro o para varios, no importa el número de ellos. El compilador devolverá una advertencia en caso de que no se siga este estilo.
Nota: Un punto y coma no debe estar a continuación de un inicio, pero sí es necesario a continuación de un fin (excepto cuando precede una sentencia sino).
Sentencias de Control de KAREL
En el Ejercicio 1 asumimos que Karel estaba orientado hacia el Este. Y si supiéramos que cuando se inicia está orientado hacia el Oeste o hacia el Sur? A veces necesitaremos girar primero tres veces, y a veces no. En este caso, la sentencia de control si/entonces es lo que necesitamos en nuestro programa. Aquí hay un ejemplo de como se debe escribir:
...
si orientado-al-sur entonces inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
fin;
...
Las líneas "..." significan que pueden haber otras sentencias antes o después de la sentencia si. Nos da igual en esta explicación ya que no hay restricciones en cuanto a lo que hay antes o después de la sentencia si.
La forma más general de la sentencia sies:
...
si xxx entonces inicio
yyy
fin;
...
donde xxxes una condición y yyy es cualquier número de sentencias a ejecutar si la condición if es verdadera.
La sentencia Si/Entonces
7. Condiciones que puede detectar Karel
Date cuenta de que la condición orientado-al-sur, en el fragmento de programa de la página del si/entonces
...
si orientado-al-sur entonces inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
fin;
...
La condición es una función de la situación actual de Karel, a medida que se ejecuta el programa. Si Karel está actualmente orientado hacia el Sur, el valor de la función orientado-al-sur será verdadero, y el conjunto de sentencias entre el par inicio/fin, se ejecutará. De otra manera, el valor orientado-al-sur será false y el bloque de sentencias se saltará. Karel comprende cualquier función booleana que comprueba su situación actual. Aquí hay un listado:
frente-libre |
junto-a-zumbador |
orientado-al-este |
frente-bloqueado |
no-junto-a-zumbador |
orientado-al-oeste |
izquierda-libre |
algun-zumbador-en-la mochila |
no-orientado-al-norte |
izquierda-bloqueada |
ningun-zumbador-en-la mochila |
no-orientado-al-sur |
derecha-libre |
orientado-al-norte |
no-orientado-al-este |
derecha-bloqueada |
orientado-al-sur |
no-orientado-al-oeste |
"libre" significa que no hay ningún muro, mientras que "bloqueado" significa que hay un muro en esa dirección. Karel puede detectar si hay o no algún zumbador en la esquina en la que se encuentra actualmente, así como detectar si tiene algún zumbador en la bolsa o no. También tiene una brújula para detectar hacia qué dirección está orientado.
Ejemplo 3: Escribe un programa de Karel que haga que Karel esté orientado al Norte, desde cualquier dirección inicial, y a continuación se apague. Debería terminar en la misma intersección en la que empezó.
Alguna sugerencia?
Edita el programa “karel_2.kp” pulsando en la pestaña "Programa" y abriendo el fichero “karel_2.kp” ,si no está abierto todavía. Guarda el programa con el nombre “karel_3.kp”. luego inserta el ejemplo visto arriba para el caso en que Karel está orientado hacia el Sur. Pero, ¿qué ocurre cuando no está orientado hacia el Sur? Podría estar también orientado hacia el Norte o el Este!. Entonces necesitas dos sentencias si adicionales, en las cuales se especifique que es lo que debe hacer Karel en esas situaciones. Compila el programa como antes, pulsa la pestaña "Ejecutar", y luego pulsa el botón "Inicializar". A continuación deberías pulsar en "Paso" o "Correr" para ejecutar el programa. Usa el mundo “NuevoMundo.km” para probar tu programa.
Modifica el mundo inicial de Karel para probar cualquiera de las 4 direcciones de inicio, y para cada una de ellas vuelve a ejecutar el programa. En esta sección hemos visto como usar las sentencias de control para adaptar Karel a cada situación.
Condiciones que puede detectar Karel
En el ejercicio 2, teníais que contar la secuencia correcta de pasos para que Karel pudiese resolver el problema. En este caso probablemente no hay una forma más corta de resolverlo. Sin embargo, en algunos problemas hay aspectos del problema que tienen una naturaleza repetitiva. Por ejemplo, para ir de la esquina 15 a la 1 tendríamos que poner un total de 14 “avanza”. ¿Es difícil dar justo con el número correcto?. El lenguaje de programación de Karel ofrece un método mejor, la sentencia de control repite. Se escribe como sigue:
...
repite xxx veces inicio
yyy
fin;
...
donde xxx debe ser un número entero positivo, y yyy representa cualquier número de sentencias de Karel. El problema de los 14 avances podría haberse escrito :
...
repite 14 veces inicio
avanza;
fin;
...
Ejercicio 4: Asume que Karel está
en la esquina de la 8ª Avenida y la 8ª Calle, con el escenario que
se ve en la siguiente imagen. Escribe un programa que haga a Karel recoger
todos los zumbadores y acabe en la 1ª esquina orientado al Sur.
¿Crees que es muy difícil?
Bien… puede ser que un poco de ayuda venga bien. Si puedes imaginar como hacerlo una vez (el primer zumbador de la esquina 7,7), la sentencia repite lo hará tantas veces como tú quieras.
Crea un mundo como el de arriba y guárdalo con el nombre
“diagonal.km”. Escribe el programa y guárdalo con el nombre “karel_4.kp”.
Asegurate de utilizar la sentencia repetir/veces. Prueba el programa en este
mundo inicial. Karel debería terminar en la esquina de la primera Avenida
con la primera Calle, y llevando 7 zumbadores en la mochila.
La sentencia iterate/times
9. La sentencia Si/Entonces/Sino
Aquí podéis ver como se escribe una sentencia Si/Entonces/Sino :
...
si xxx entonces inicio
yyy
fin
sino inicio
zzz
fin;
...
donde xxx es una condición, yyy son sentencias a realizar si xxx es verdadero, y zzz son las sentencias a ejecutar si xxx es falso.
Ejercicio 5: Karel tiene
la tarea de alinear una colección de zumbadores en la primera Calle
que ha sido distribuida desigualmente. Empieza en la 1ª Calle y la 15ª
Avenida y está orientado al Oeste. Se supone que en cada esquina hay
exactamente un zumbador. Sin embargo, Karek puede encontrar 0, 1 o 2 zumbadores
en cualquier intersección. Su tarea es asegurar que exactamente hay
un zumbador antes de continuar hacia la siguiente esquina. Cuando llega a
la esquina 1,1 debe apagarse.
Diseña el mundo inicial para que Karel
comience en la esquina 1,15 orientado hacia el Oeste. Karel debe empezar
con 15 zumbadores en la mochila. Aleatoriamente sitúa 1 o 2 zumbadores
en esquinas a lo largo de la 1ª Calle, y deja alguna sin zumbadores.
Guarda tu mundo inicial con el nombre “lineaDeZumbadores.km”
Escribe el programa para hacer que Karel complete
la tarea descrita anteriormente. Guarda tu programa con el nombre “karel_5.kp”.
Truco: utiliza repite/veces, un Si/Entonces/Sino,
y un Si/Entonces.
Recuerda, no sabemos qué esquinas tienen
el número equivocado de zumbadores! Karel
debe hacer la tarea correctamente independientemente del nº de zumbadores
que haya en cada esquina.
La sentencia If/Then/Else
10. La sentencia define-nueva-instruction/como
Hasta ahora, le hemos dicho a Karel exactamente lo que tenía que hacer
tal como necesitábamos que lo hiciese. Esto funciona bien, pero os
podréis haber dado cuenta de que siempre se utilizan secuencias de
sentencias similares. Un ejemplo es cuando Karel tiene que girar a la derecha,
y nosotros le decimos "gira-izquierda;
gira-izquierda; gira-izquierda;". No sería más fácil
si le pudiéramos decir simplemente "gira-derecha"?En otras palabras, diciendo "gira-derecha;" Karel giraría
tres veces hacia la izquierda para alcanzar nuestro objetivo. Es posible.
¿Estás suficientemente motivados
para aprender una nueva sentencia?
Una de las razones de crear nuevas instrucciones, es por evitar escribir tanto. Otra es para documentar mejor cual es nuestro objetivo, cuando nosotros mismos u otra persona lee el programa. Como os estaréis dando cuenta, programar es una tarea extremadamente compleja, y necesitamos toda la ayuda necesaria para hacer las cosas correctamente!
Las sentencias define-nueva-instrucion están situadas
en un sitio especial dentro de un programa de Karel, justo después
de la sentencia inicio-de-ejecucion.El
siguiente es un programa válido para Karel:
Podéis definir cualquier número de instrucciones nuevas, y después usarlas en el programa donde las necesitéis. Las instrucciones nuevas pueden contener sentencias de control, si es necesario. Daros cuenta de que la nueva instrucción puede también usar una instrucción definida previamente! El ejercicio 5 podría haberse escrito:
Daros cuenta de como la instrucción repetir acaba moviendo a Karel una esquina hacia adelante, sin tener en cuenta en nº de zumbadores. Si hacéis esto 14 veces, estaréis en casa!
Ejercicio 6: Re-escribir el programa para el ejercicio 4, pero esta vez puede no haber un zumbador en cada esquina. Guarda tu programa con el nombre “karel_6.kp”. La nueva instrucción debería coger un zumbador en la posición actual, si es que lo hay. Deberíais usar esta instrucción para coger todos los zumbadores mientras Karel va a su casa en diagonal. Aseguraros de que tenéis el mundo “diagonal.km” cargado y probar vuestro programa. Karel debería finalizar el la esquina de la 1ª Calle con la 1ª Avenida, con todos los zumbadores que ha ido cogiendo por el camino, y apagarse.
La sentencia define-new-instruction/as
11. La sentencia mientras/hacer
Desde el principio, siempre se nos ha dicho la esquina exacta de inicio. Nosotros queremos programar Karel para que se adapte mejor a su mundo. La sentencia mientras/hacernos permite repetir pasos mientras se cumple una condición, y esto nos va a permitir programar a Karel para que no sea un chico tan rígido!. La sentencia mientras/hacer tiene la forma siguiente :
mientras xxx hacer inicio
yyy
fin;
donde xxx debe ser una condición (una de las funciones booleanas listadas anteriormente), y yyy representa cualquier número de sentencias de Karel. El ejercicio 1 podría haberse escrito de la siguiente manera:
mientras frente-libre hacer inicio
avanza;
fin;
Esto soluciona el problema de caminar de nuevo a la 1ª Calle, sin importar como de lejos se encuentre de esta Calle.
Ejercicio 7: La tarea de Karel es dejar zumbadores a lo
largo de una pista de carreras. Un ejemplo de dicha pista es la de la siguiente
imagen. Karel debe dar una vuelta completa y depositar un zumbador en cada
esquina a lo largo del camino. Guarda el programa con el nombre “karel7.kp”.
Tu solución debe usar sentencias mientras/hacer. Construye el mundo
inicial de la siguiente imagen con el nombre “pistaCarreras.km”. Asegurate
de poner dentro de la mochila suficientes zumbadores
para todas las esquinas. El ejemplo requiere 22 zumbadores. Karel debe empezar
en cualquier intersección de la pista.
Asegurate de que tu programa funciona en el mundo anterior, y
después prueba tu programa modificando el mundo inicial. También,
intenta iniciar a Karel desde diferentes intersecciones a lo largo del camino.
¿Realiza Karel su tarea
correctamente en todos los casos?
Ejercicio 8: Escribe un programa que ayude a Karel a escapar de un laberinto que no contiene islas. La salida del laberinto está marcada ubicando un zumbador en la primera esquina que está fuera del laberinto, al lado del muro de la derecha. Una forma de resolver este problema es hacer que Karel avance a lo largo del laberinto siguiendo el muro de su derecha ( imaginaque está tocando el muro y que nunca puede despegar su mano de él). En la siguiente imagen hay un ejemplo de un laberinto del cual debería ser capaz de salir (no olvides que tu programa debería funcionar en todos los laberintos, no solo en el de la imagen). Guarda tu programa con el nombre “karel_8.kp”.
Esto parece muy, muy complicado. ¿Puedes darnos un mundo de ejemplo?
Aquí tenéis un mundo inicial de ejemplo. La línea roja muestra el camino que debería seguir Karel para este mundo. Recordar que no sabréis de antemano donde estarán los muros.
Podría hacerse más fácil si definierais unas
pocas nuevas instrucciones que hicieran parte del trabajo. Aquí tenéisun
ejemplo:
define-nueva-instruccion sigue-muro-rerecha como inicio
{pon tu código aquí}
fin;
...
Esta instrucción hace que Karel avance correctamente hacia
el siguiente segmento de muro. Los diagramas de abajo muestran las 4 situaciones,
Karel podría estar en cualquier punto del laberinto. Si sigue-muro-derecha
resuelve correctamente los 4 casos, entonces has solucionado la parte principal
del problema. También deberías definir gira-derecha Para probar
tu programa crea un mundo como el del ejemplo y lo guardas con el nombre “laberinto.km”.
Una vez te funcione el programa para este mundo, prueba a modificarlo anñadiéndo
o quitando muros. ¿Realiza Karel la tarea bien en todos los casos?
|
|
Situaciones
iniciales |
Movimientos
respectivos |
La sentencia mientras/hacer