Referencia · Karel the Robot

Karel the Robot

Esta referencia detalla el modelo Java de Karel usado en el material de Stanford: mundo en cuadrícula, estado del robot, comandos, sensores, control, métodos y técnicas para planificar y probar soluciones. Otras implementaciones pueden tener reglas distintas.

Referencia Stanford KarelSintaxis Java

01 · Visión general

Sobre Karel

Karel es un robot que recibe instrucciones para resolver tareas sencillas en un mundo de calles, esquinas y paredes. El modelo fue creado para que los primeros ejercicios de programación destaquen la descomposición de problemas y la secuencia de instrucciones.

Esta página elige la referencia Java de Stanford, que define una clase de programa y un método run. Otras implementaciones pueden usar Python o una sintaxis propia; no mezcles ejemplos de versiones distintas.

02 · Entorno

El mundo en cuadrícula

El mundo de Karel es una cuadrícula de calles y avenidas; cada cruce forma una esquina. El robot ocupa una esquina y mira al norte, sur, este u oeste. El escenario tiene paredes en los bordes, aunque sus dimensiones cambian según el ejercicio.

  • Posición y dirección: la esquina ocupada y la orientación actual del robot.
  • Paredes: bloquean el paso entre esquinas; los sensores consultan el entorno según la orientación.
  • Beepers: pueden estar en una esquina o en la bolsa. Karel solo detecta los de la esquina actual; la bolsa estándar admite una cantidad ilimitada.
  • Estado inicial y meta: cada ejercicio define el escenario de partida y el resultado esperado.

Intentar atravesar una pared, recoger un beeper inexistente o dejar uno con la bolsa vacía provoca un error en tiempo de ejecución.

03 · Organización

Estructura del programa

Un programa Java de Karel declara una clase que extiende SuperKarel. El método público run() contiene las instrucciones iniciales; también se pueden declarar métodos privados para dar nombre a secuencias reutilizables.

import stanford.karel.*;

public class EjemploKarel extends SuperKarel {
    public void run() {
        move();
        turnLeft();
    }
}

El código usa bloques entre llaves, punto y coma al final de las instrucciones y comentarios Java con // o /* ... */.

04 · Acciones

Comandos básicos

ComandoAcción
move()Avanza una esquina si no hay una pared delante.
turnLeft()Gira 90 grados a la izquierda.
putBeeper()Deja un beeper en la esquina actual y lo retira de la bolsa.
pickBeeper()Recoge un beeper de la esquina actual y lo guarda en la bolsa.

Las cuatro instrucciones primitivas se llaman con paréntesis vacíos y terminan con punto y coma. move() falla ante una pared; pickBeeper() requiere un beeper en la esquina; putBeeper() requiere uno en la bolsa.

05 · Observación

Sensores y condiciones

Karel consulta el entorno inmediato; no recibe todo el mapa como un valor. Cada sensor devuelve un valor lógico que puede usarse en if, while y expresiones booleanas.

SensorEs verdadero cuando
frontIsClear() / frontIsBlocked()No hay / hay una pared delante.
leftIsClear() / leftIsBlocked()El camino a la izquierda está libre / bloqueado.
rightIsClear() / rightIsBlocked()El camino a la derecha está libre / bloqueado.
beepersPresent() / noBeepersPresent()Hay / no hay beepers en la esquina.
beepersInBag() / noBeepersInBag()La bolsa contiene / no contiene beepers.
facingNorth(), facingEast(), facingSouth(), facingWest()Karel mira hacia la dirección indicada.
notFacingNorth(), notFacingEast(), notFacingSouth(), notFacingWest()Karel no mira hacia esa dirección.

Los sensores de pared se refieren a la orientación actual. En Java, puedes negar una condición con ! o combinarlas con && y ||; usa las formas opuestas de la tabla cuando aclaren la intención.

06 · Flujo

Decisiones y repeticiones

La referencia Java usa if, if/else, while y for para responder a las condiciones del mundo y repetir acciones.

if (frontIsClear()) {
    move();
} else {
    turnLeft();
}
while (beepersPresent()) {
    pickBeeper();
}
for (int i = 0; i < 3; i++) {
    move();
}

Un bucle basado en un sensor debe cambiar el mundo o la posición del robot para alcanzar la condición de salida. Revisa las paredes y beepers del escenario antes de ejecutar la secuencia.

07 · Reutilización

Métodos propios

Un método privado da nombre a una acción compuesta. Después de declararlo en la clase, puede llamarse desde run() u otros métodos de esa clase.

private void turnRightSafely() {
    turnLeft();
    turnLeft();
    turnLeft();
}
public void run() {
    move();
    turnRightSafely();
    move();
}

Este método usa tres giros a la izquierda, el comando primitivo de la referencia básica. Si SuperKarel está disponible, turnRight() expresa directamente esa acción.

08 · Estado

Estado y datos

El problema puede resolverse solo con posición, dirección, paredes y beepers, pero la referencia Java también permite variables locales y contadores. El robot mantiene el estado físico del mundo; las variables ayudan a registrar pasos o cantidades.

int pasos = 0;
while (frontIsClear()) {
    move();
    pasos++;
}
putBeeper();

Usa estado adicional cuando ayude a describir la solución. Muchos ejercicios iniciales se resuelven con sensores y métodos bien nombrados.

09 · Ejemplo integrado

Avanzar y marcar la esquina final

El programa avanza hasta encontrar una pared y deja un beeper en la posición final si todavía no hay uno:

import stanford.karel.*;

public class MarcarDestino extends SuperKarel {
    public void run() {
        while (frontIsClear()) {
            move();
        }
        if (noBeepersPresent()) {
            putBeeper();
        }
    }
}

10 · Recursos adicionales

Recursos de SuperKarel

SuperKarel añade recursos a la clase base. Están disponibles cuando la clase del programa extiende SuperKarel.

ElementoTipoComportamiento
turnRight()AcciónGira 90 grados a la derecha.
turnAround()AcciónGira 180 grados.
random(p)CondiciónDevuelve verdadero con probabilidad p, entre 0.0 y 1.0.
paintCorner(color)AcciónPinta la esquina actual de un color.

En los materiales Java de Stanford, los colores son constantes como RED y YELLOW, sin comillas. El libro original también describe random(), que devuelve verdadero con una probabilidad del 50 %, y la condición cornerColorIs(color). Estos dos recursos no aparecen en la ficha resumida del Karel Reader; comprueba si los ofrece la biblioteca utilizada.

11 · Repetición segura

Bucles, límites y errores de posición

for sirve cuando se conoce la cantidad de pasos. while sirve cuando el robot debe responder al mundo, como avanzar hasta una pared. La condición de while se revisa antes del cuerpo, que puede no ejecutarse.

while (frontIsClear()) {
    if (noBeepersPresent() && beepersInBag()) {
        putBeeper();
    }
    move();
}
if (noBeepersPresent() && beepersInBag()) {
    putBeeper();
}

La prueba dentro del bucle cubre cada esquina antes de avanzar; la última comprobación cubre la esquina donde Karel se detiene. La diferencia entre el número de esquinas y el número de avances causa el error de una posición.

Todo bucle necesita una condición de salida alcanzable. En un bucle con sensores, cada vuelta debe cambiar la posición, la orientación o los beepers para que la condición pueda cambiar.

12 · Planificación

Descomposición y contratos

Antes de escribir comandos, describe el estado inicial y el resultado esperado: dónde empieza Karel, hacia dónde mira, qué paredes existen y cuántos beepers hay. Divide la solución en acciones con nombres que expresen una intención.

Un método privado sin parámetros funciona como una instrucción nueva. Para cada método, considera la precondición —lo que debe cumplirse antes de llamarlo— y la poscondición —lo que garantiza al terminar—. La salida de un método debe satisfacer lo que espera el siguiente.

private void moveToWall() {
    while (frontIsClear()) {
        move();
    }
}

public void run() {
    moveToWall();
    turnAround();
}

Este método deja a Karel en la esquina más lejana frente a él y orientado hacia la pared. Hacer explícito ese resultado facilita reutilizar y revisar la secuencia.

13 · Verificación

Probar más de un escenario

Una solución debe respetar el estado del mundo, no solo funcionar en el escenario usado al escribirla. Varía el tamaño de la cuadrícula, la posición de las paredes, la orientación inicial y los beepers.

  • Prueba una cuadrícula mínima y un pasillo con un solo avance.
  • Prueba que la pared ya esté delante al comienzo.
  • Prueba esquinas con y sin beepers y una bolsa vacía cuando la tarea lo permita.
  • Comprueba posición, dirección, paredes y cantidad de beepers al terminar.

Intentar cruzar una pared, recoger un beeper ausente o colocar uno sin existencias produce un error en ese mundo. Los sensores deben proteger las acciones que dependen de esas condiciones.

14 · Lectura adicional

Referencias

Volver al Manual de Potoo IDE

Consulta las demás referencias y la información del proyecto.

Abrir el Manual