karel
Version:
Compilador y evaluador de Karel en javascript
161 lines (160 loc) • 6.4 kB
HTML
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>La sentencia define-nueva-instruccion/como </title>
</head>
<body style="background-image: url(./workbook.gif);">
<center>
<h2>La sentencia void</h2>
</center>
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 te pudiste
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 " turnleft(); turnleft(); turnleft(); ". ¿No sería más
fácil si le pudiéramos decir simplemente "turnright()" ?.
<p>
En otras palabras, diciendo "turnright(); " Karel giraría tres veces hacia
la izquierda para alcanzar nuestro objetivo. Es posible. ¿Estás
suficientemente motivado para aprender una nueva sentencia?
</p>
<p>
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 te estarás dando
cuenta, programar es una tarea extremadamente compleja, y ¡necesitamos
toda la ayuda necesaria para hacer las cosas correctamente !
</p>
<p>
Las sentencia <strong>void</strong> (que también se puede escribir como
<strong>define</strong>) está situada en un sitio especial dentro de un
programa de Karel, justo después de la sentencia "class program {". El
siguiente es un programa válido para Karel:
</p>
<p>
<center>
<img alt="" border="1" src="image023b.jpg" />
</center>
</p>
<p>
Puedes definir cualquier número de instrucciones nuevas, y después usarlas
en el programa donde las necesites. Las instrucciones nuevas pueden
contener sentencias de control, si es necesario. Date cuenta de que la
nueva instrucción puede también usar una instrucción definida previamente.
El ejercicio 5 podría haberse escrito:
</p>
<p>
<center>
<img alt="" border="1" src="image024b.jpg" />
</center>
</p>
<p>
Date cuenta de como la instrucción iterate acaba moviendo a Karel una
esquina hacia adelante, sin tener en cuenta en nẃ de zumbadores. Si haces
esto 14 veces, ¡estarás en casa !
</p>
<p>
<strong>Ejercicio 7:</strong> Re-escribe el programa para el ejercicio 4,
pero esta vez puede no haber un zumbador en cada esquina. Guarda tu
programa con el nombre <tt>diagonal2.txt</tt>. La nueva
instrucción debería coger un zumbador en la posición actual, si es que lo
hay. Deberías usar esta instrucción para coger todos los zumbadores
mientras Karel va a su casa en diagonal. Asegurate de que tienes el mundo
<tt>diagonal.mdo</tt> cargado para probar tu programa. Karel debería
finalizar en la esquina de la 1ªCalle con la 1ªAvenida, con todos los
zumbadores que ha ido cogiendo por el camino, y apagarse.
</p>
<p>
<strong>Ejercicio 8:</strong> Escribe un programa que ayude a Karel a
escapar de un laberinto que no contiene islas (cuadrados aislados). 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 ( imagina que 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 <tt>laberinto.txt</tt>.
Esto parece muy, muy complicado. ¿Puedes darnos un mundo de ejemplo?
</p>
<p>
Aquí tienes un mundo inicial de ejemplo. La línea roja muestra el camino
que debería seguir Karel para este mundo. Recuerda que no sabes de
antemano donde estarán los muros.
</p>
<p>
<center>
<img alt="" border="1" src="image026.jpg" />
</center>
</p>
<p>
Podría hacerse más fácil si definieras unas pocas nuevas instrucciones que
hicieran parte del trabajo. Aquí tenéis un ejemplo:
</p>
<p>...</p>
<p>void sigueMuroDereha() {</p>
<p> /*pon tu código aquí*/</p>
<p>}</p>
<p>...</p>
<p>
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
<strong>sigueMuroDerecha()</strong> resuelve correctamente los 4 casos,
entonces has solucionado la parte principal del problema. También deberías
definir <strong>turnright()</strong>.
</p>
<p>
Para probar tu programa crea un mundo como el del ejemplo y guárdalo con
el nombre <tt>laberinto.mdo</tt>. Una vez te funcione el programa para
este mundo, prueba a modificarlo añadiéndo o quitando muros. ¿Realiza
Karel la tarea bien <strong>en todos los casos</strong>?
</p>
<p></p>
<center>
<table border="2">
<tr>
<td>
<img
alt=""
border="0"
height="199"
src="image028.jpg"
width="198"
/>
</td>
<td>
<img
alt=""
border="0"
height="199"
src="image032.jpg"
width="199"
/>
</td>
</tr>
<tr>
<td>
<center>
Situaciones iniciales
</center>
</td>
<td>
<center>
Movimientos respectivos
</center>
</td>
</tr>
</table>
</center>
<p></p>
<center>
<h2>La sentencia void</h2>
<h2 align="left"><a href="KarelJAVA.html">Regresar</a></h2>
</center>
</body>
</html>