Karel, der Roboter – Das Handbuch
Im Folgenden lernst du eine einführende Programmierumgebung kennen, in der du einen Roboter steuern wirst, der einfache Probleme lösen soll. Dieser Roboter heißt Karel.
Karel soll die Grundlagen des Programmierens vermitteln, in einer einfachen Umgebung, die frei von den Komplexitäten ist, die die meisten Programmiersprachen charakterisieren. Karel wurde in einführenden Informatikkursen auf der ganzen Welt eingesetzt und hat Millionen von Studenten unterrichtet.
Beachte, dass alle Aufgaben innerhalb der Methode, mit der richtigen Bezeichnung geschrieben werden. Zum Beispiel das Programm 0.0.1 karelsFirstProgramm wird in die Methode karelsFirstProgram() geschrieben.
Beispielcode:
void karelsFirstProgram() {
moveForward();
// Weitere Befehle hier
}
void obtainArtifact() {
// Weitere Befehle hier
}
Hinweis:
Verwende bei der Programmierung die Shortcuts F1-F11, damit du die ganzen Befehle nicht mit der Tastatur ausschreiben musst und dadurch Zeit sparst. Der Fokus liegt hier in der Entwicklung von Programmierideen und nicht im Erlernen einer Syntax!
Handout
Karels Befehle
| Kurztaste | Befehl | Beschreibung |
| F1 | moveForward(); | Karel bewegt sich ein Feld vorwärts in die Richtung, in die er gerade schaut. Er macht nichts, wenn eine Wand vor ihm ist. |
| F2 | turnLeft(); | Karel dreht sich um 90° nach links. |
| F3 | turnAround(); | Karel dreht sich um 180°. |
| F4 | turnRight(); | Karel dreht sich um 90° nach rechts. |
| F5 | pickBeeper(); | Karel hebt einen Beeper von dem Feld auf, auf dem er sich gerade befindet. Er macht nichts, wenn kein Beeper vorhanden ist. |
| F6 | dropBeeper(); | Karel legt einen Beeper auf das Feld, auf dem er sich gerade befindet. Er macht nichts, wenn bereits ein Beeper vorhanden ist. |
| F7 | onBeeper(); | Karel überprüft, ob sich ein Beeper auf dem Feld befindet, auf dem er sich gerade befindet. |
| F8 | beeperAhead(); | Karel überprüft, ob sich ein Beeper auf dem Feld direkt vor ihm befindet. |
| F9 | leftIsClear(); | Karel überprüft, ob sich eine Wand links von ihm befindet. |
| F10 | frontIsClear(); | Karel überprüft, ob sich eine Wand vor ihm befindet. |
| F11 | rightIsClear(); | Karel überprüft, ob sich eine Wand rechts von ihm befindet. |
Feste Wiederholung repeat(x)
repeat(x) Anstatt die gleiche Anweisungsfolge mehrfach zu schreiben, kannst du repeat (Wiederholung) verwenden und die Anweisung nur einmal notieren. In Klammern wird hinter repeat die feste Anzahl der Wiederholungen geschrieben.
void dance()
{
moveForward();
turnLeft();
moveForward();
turnLeft();
moveForward();
turnLeft();
moveForward();
turnLeft();
}
ist äquivalent zu:
void dance()
{
repeat(4)
{
moveForward();
turnLeft();
}
}
If/else
If/else Manchmal soll Karel nur dann etwas tun, wenn eine bestimmte Bedingung erfüllt ist:
if (onBeeper())
{
pickBeeper();
}
Optional kannst du auch angeben, was zu tun ist, falls die Bedingung nicht erfüllt ist:
if (onBeeper())
{
pickBeeper();
}
else
{
dropBeeper();
}
FALLS Karel sich auf einen Beeper befindet, soll er diesen aufheben, SONST soll er einen Beeper ablegen.
If/else if
If/else if
if (leftIsClear())
{
turnLeft();
}
else if (rightIsClear())
{
turnRight();
}
else
{
dropBeeper();
}
else if – Anweisung, werden die Bedingungen nacheinander so lange geprüft, bis die erste erfüllt ist! Die Anweisungen davon werden dann ausgeführt und die restlichen Bedingungen werden nicht mehr betrachtet.
In dem Beispiel würde zuerst überprüft werden (Zeile 1), ob links von Karel eine Wand ist. Falls ja dreht er sich nach links und das Programm ist fertig. Sonst würde er überprüfen, ob rechts von ihm eine Wand ist (Zeile 5) und sich dann nach rechts drehen. Anschließend wäre das Programm fertig. Falls die ersten beiden Bedingungen falsch wären, würde er in Zeile 9 in den else-Zweig gehen und einen Beeper ablegen.
Logische Operatoren
| Operator | Beschreibung |
| !a | wahr, wenn nicht a gilt. |
| a && b | wahr, wenn sowohl a als auch b wahr sind. |
| a || b | wahr, wenn entweder a oder b oder a und b wahr sind. |
| a || !b && c | a || ((!b) && c) //Betrachte, wie der Computer vorrangig die Klammern setzt. |
Nicht!
! if/else mit einem leeren ersten Block:
if (onBeeper())
{
}
else
{
dropBeeper();
}
! negiert wird.
if (!onBeeper())
{
dropBeeper();
}
Logisches Und &&
&& if, dass nichts anderes als ein weiteres if enthält:
if (frontIsClear())
{
if (beeperAhead())
{
moveForward();
pickBeeper();
}
}
&& kombiniert.
if (frontIsClear() && beeperAhead())
{
moveForward();
pickBeeper();
}
Logisches Oder ||
|| if/else if mit identischen Blöcken:
if (!frontIsClear())
{
turnRight();
}
else if (beeperAhead())
{
turnRight();
}
|| kombiniert.
if (!frontIsClear() || beeperAhead())
{
turnRight();
}
While-Schleife
repeat(x)–Kontrollstruktur, konnte man Anweisungsfolgen mit einer vorher festgelegten Anzahl wiederholen lassen.
void dance()
{
repeat(4)
{
moveForward();
turnLeft();
}
}
Es gibt jedoch auch Fälle, in denen vorher nicht klar ist, wie häufig eine Anweisung wiederholt werden sollte. Beispielsweise wenn man möchte, dass Karel bis zu einer Wand geradeauslaufen soll. Dies hängt nämlich von Karels aktueller Position ab. In diesem Fall verwendet man die while-Schleife.
Betrachte folgendes Beispiel:
void moveForwardSafely()
{
if (frontIsClear())
{
moveForward(); // Diese Anweisung wird 0 oder 1 mal ausgeführt.
}
}
If prüft die Bedingung and führt den Anweisungsblock maximal einmal aus.
While prüft hingegen die Bedingung jedes Mal, nachdem der Anweisungsblock ausgeführt wurde. Betrachte dazu den folgenden Programmcode.
void moveToWall()
{
while (frontIsClear())
{
moveForward(); // Die Anweisung wird bis zu 0 bis 9 mal ausgeführt.
}
}