Repaso de Funciones
Rehicimos el ejercicio de escapando del incendio:
procedure AvanzarUnPaso(){
if(hayIncendioAlEste()){
MoverTipito(Norte)
} else {
MoverTipito(Este)
}
}
procedure MoverTipito(dir){
Sacar(Negro)
Mover(dir)
Poner(Negro)
}
function hayIncendioAlEste(){
Mover(Este)
return (hayIncendio())
}
function hayIncendio(){
return (hayBolitas(colorFuego()))
}
function colorFuego(){
return (Rojo)
}
Es importante que puedan hacer funciones como:
hayIncendioAlEste
hayIncendio
¡no vale usarnroBolitas(Rojo)
directamente!colorFuego
¡no vale ponerRojo
en todos lados!
While (Repetición condicional)
Si ahora queremos escapar por completo del tablero, necesitamos saber el tamaño del tablero, ¿no?…. ¡NO! Podemos usar un repeat que en vez de tomar un número, toma una condición.
Entonces, queda:
program {
while(puedoMover(Este)){
AvanzarUnPaso()
}
}
¡Y listo! Eso repite mientras se cumpla que se puede mover al Este. En cuanto deja de cumplirse… ¡para!.
La estructura del while
(que es nuestra repetición condicional), entonces, es así:
Hicimos el ejercicio LimpiarHacia(dir)
, que limpiaba tooodas las celdas en la dirección indicada:
La Montaña
Hay una montaña (representada por bolitas azules), cuya ladera tiene sectores verticales. El escalador (representado por una bolita negra), debe escalar la montaña, y también puede hacer túneles y encontrar oro.
-
Definir el procedimiento
EncontrarSaliente
, que hace que hace que el escalador se mueva hacia el norte siguiendo la montaña (nunca parado en una casilla de la montaña, sino de costado) hasta encontrarse con una saliente hacia el Este, y se sube y se frena ahí a descansar. Ejemplo de tablero inicial y final: (Debe funcionar para cualquier montaña, por alta que sea) - Definir el procedimiento
CavarTunel(dir)
, que cava un túnel (saca bolitas de montaña) desde donde está parado el escalador, en línea recta y hasta que se acabe la montaña, que puede ser:- bien porque salí del otro lado de la montaña
- o bien porque llegué al fin del tablero.
-
Estos van de yapa para que practiquen: Definir la función
hayOroAl(dir)
, que busca oro (representado por bolitas rojas) en esa dirección, y denota si en esa “línea” hay oro ó no. No hace falta mover al escalador, se puede sólo mover el cabezal. Por ejemplo, en el siguiente tablerohayOroAl(Este)
denotaTrue
, perohayOroAl(Sur)
denotaFalse
. - Definir el predicado
RecogerOroDeVeta(dir)
, que recoge todo el oro de una veta sobre la que está el cabezal.dir
me dice si la veta es vertical ú horizontal:Norte
implica que la veta es vertical, yEste
que la veta es horizontal. Acá tampoco hace falta mover al escalador, supongamos que el cabezal es su robot minero. El escalador se queda donde está. El cabezal debe volver al origen. Por ejemplo, si hagoRecogerOroDeVeta(Norte)
en este tablero: Obtengo este otro tablero: Precondición: el cabezal ya está sobre una veta, y el escalador está en esa misma celda
Soluciones ejs 1 y 2
¡Saludos!
Alf