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
| Comando | Acció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.
| Sensor | Es 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.
| Elemento | Tipo | Comportamiento |
|---|---|---|
turnRight() | Acción | Gira 90 grados a la derecha. |
turnAround() | Acción | Gira 180 grados. |
random(p) | Condición | Devuelve verdadero con probabilidad p, entre 0.0 y 1.0. |
paintCorner(color) | Acción | Pinta 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
- Karel Reader de Stanford, versión Java.
- Referencia de comandos, condiciones y estructura del programa.
- Libro introductorio original de Karel, sobre el mundo del robot y el propósito educativo del proyecto.