ÜbungBaut auf Pip unter Funkelbach: Hinab in die Stollen und Katas: Schleifen auf
image: teaser.webp:50:40 icon: /images/pip/icon-bello.png kind: uebung duration: 3 Doppelstunden languages: [ruby, python, javascript] idea: "Pip findet Bello: Schleifen mit Bedingung, eigene Funktionen, Variablen, ein Algorithmus fürs Labyrinth" curriculum: "Sek I: Algorithmisches Problemlösen (Miniwelten, algorithmische Grundstrukturen, Variablenkonzept und Prozeduren); Oberstufe: Algorithmen und Datenstrukturen (ein Algorithmus fürs Labyrinth)" requires: [pip-1, kata-loops]

Pip unter Funkelbach: Bellos Spur

Bello ist noch irgendwo da unten. Jetzt wird es finster: Pip weiß nicht mehr, wie lang ein Stollen ist, und der Plan muss selbst nachsehen. Mit eigenen Zaubersprüchen, der Hand an der Wand und Bellos Pfotenabdrücken findet Pip den Weg, und den zurück ans Licht.

»Hinter den Glibbern geht es tiefer hinein«, sagt der Wichtel. »Da unten habe ich keine Karten mehr. Pip muss selbst nachsehen, wo es weitergeht. Zum Glück kann dein Plan Fragen stellen.«

1. Im Finstern

Bisher hast du gezählt: viermal das, achtmal jenes. Hier weiß niemand, wie lang ein Stollen ist. Eine Schleife mit while zählt nicht, sie fragt: Sie wiederholt, solange eine Bedingung wahr ist.

Befehl Was Pip macht
front_clear? fragt: Ist das Feld vor Pip frei?
on_lamp? fragt: Steht Pip an der Lampe?
while front_clear?
  turn_left
end

Solange vorn frei ist, dreht sich Pip. Schaut Pip auf eine Wand, ist die Bedingung falsch, und es geht nach end weiter. (Ist ringsum frei, dreht sich Pip ewig; nach 1000 Schritten hält die Welt an.) until ist das Gegenteil: until on_lamp? wiederholt, bis Pip an der Lampe steht.

Befehl Was Pip macht
front_clear() fragt: Ist das Feld vor Pip frei?
on_lamp() fragt: Steht Pip an der Lampe?
while front_clear():
    turn_left()

Solange vorn frei ist, dreht sich Pip. Schaut Pip auf eine Wand, ist die Bedingung falsch, und es geht nach der Schleife weiter. (Ist ringsum frei, dreht sich Pip ewig; nach 1000 Schritten hält die Welt an.) not dreht eine Antwort um: while not on_lamp(): wiederholt, bis Pip an der Lampe steht.

Befehl Was Pip macht
frontClear() fragt: Ist das Feld vor Pip frei?
onLamp() fragt: Steht Pip an der Lampe?
while (frontClear()) {
  turnLeft();
}

Solange vorn frei ist, dreht sich Pip. Schaut Pip auf eine Wand, ist die Bedingung falsch, und es geht nach der Schleife weiter. (Ist ringsum frei, dreht sich Pip ewig; nach 1000 Schritten hält die Welt an.) ! dreht eine Antwort um: while (!onLamp()) wiederholt, bis Pip an der Lampe steht.

Aufgabe 1Bis zur WandEinstieg

Drei Stollen, alle verschieden lang. Pip geht mit while vorwärts, solange vorn frei ist: front_clear? sagt es.

moveturn_leftfront_clear?say "…"
Tipp

Was in der Schleife steht, macht Pip, solange die Frage front_clear? mit Ja beantwortet wird. In der Schleife reicht ein Schritt.

Aufgabe 1Bis zur WandEinstieg

Drei Stollen, alle verschieden lang. Pip geht mit while vorwärts, solange vorn frei ist: front_clear() sagt es.

move()turn_left()front_clear()say("…")
Tipp

Was in der Schleife steht, macht Pip, solange die Frage front_clear() mit Ja beantwortet wird. In der Schleife reicht ein Schritt.

Aufgabe 1Bis zur WandEinstieg

Drei Stollen, alle verschieden lang. Pip geht mit while vorwärts, solange vorn frei ist: frontClear() sagt es.

move()turnLeft()frontClear()say("…")
Tipp

Was in der Schleife steht, macht Pip, solange die Frage frontClear() mit Ja beantwortet wird. In der Schleife reicht ein Schritt.

Aufgabe 2Steine im FinsternÜbung

Dieselben Stollen, jetzt mit Funkensteinen, auf jeder Karte woanders. Sammle sie auf dem Weg zur Lampe alle ein.

moveturn_lefttakeon_stone?front_clear?say "…"
Tipp

In die Schleife kommt nach dem Schritt die Frage aus der Pilzwiese: Liegt hier ein Stein?

Aufgabe 2Steine im FinsternÜbung

Dieselben Stollen, jetzt mit Funkensteinen, auf jeder Karte woanders. Sammle sie auf dem Weg zur Lampe alle ein.

move()turn_left()take()on_stone()front_clear()say("…")
Tipp

In die Schleife kommt nach dem Schritt die Frage aus der Pilzwiese: Liegt hier ein Stein?

Aufgabe 2Steine im FinsternÜbung

Dieselben Stollen, jetzt mit Funkensteinen, auf jeder Karte woanders. Sammle sie auf dem Weg zur Lampe alle ein.

move()turnLeft()take()onStone()frontClear()say("…")
Tipp

In die Schleife kommt nach dem Schritt die Frage aus der Pilzwiese: Liegt hier ein Stein?

Aufgabe 3Um die EckenKnobelei

Diese Stollen biegen mal nach links, mal nach rechts ab. Pip geht, bis on_lamp? wahr ist: geradeaus, solange es geht, und an einer Wand dorthin, wo es weitergeht.

moveturn_leftfront_clear?on_lamp?say "…"
Tipp

An der Wand dreht sich Pip erst nach links. Ist dort auch Wand, geht es rechts weiter: von links aus noch zwei Vierteldrehungen.

Aufgabe 3Um die EckenKnobelei

Diese Stollen biegen mal nach links, mal nach rechts ab. Pip geht, bis on_lamp() wahr ist: geradeaus, solange es geht, und an einer Wand dorthin, wo es weitergeht.

move()turn_left()front_clear()on_lamp()say("…")
Tipp

An der Wand dreht sich Pip erst nach links. Ist dort auch Wand, geht es rechts weiter: von links aus noch zwei Vierteldrehungen.

Aufgabe 3Um die EckenKnobelei

Diese Stollen biegen mal nach links, mal nach rechts ab. Pip geht, bis onLamp() wahr ist: geradeaus, solange es geht, und an einer Wand dorthin, wo es weitergeht.

move()turnLeft()frontClear()onLamp()say("…")
Tipp

An der Wand dreht sich Pip erst nach links. Ist dort auch Wand, geht es rechts weiter: von links aus noch zwei Vierteldrehungen.

Hier geht es weiter, sobald du deine Antwort oben abgegeben hast.

»Nach rechts abbiegen mit drei Linksdrehungen«, brummt der Wichtel. »Jedes Mal drei Zeilen. Dafür gibt es Zaubersprüche.«

2. Eigene Zaubersprüche

Ein Zauberspruch ist ein Befehl, den du selbst schreibst: Er bekommt einen Namen, und was darin steht, macht Pip jedes Mal, wenn der Name im Plan steht. In der Programmierung heißt so etwas Funktion.

def hop
  move
  move
end

hop
turn_left
hop

def hop bis end bringt Pip den Spruch bei; dabei passiert noch nichts. Erst hop weiter unten führt ihn aus, und zwar zweimal.

def hop():
    move()
    move()

hop()
turn_left()
hop()

def hop(): und was darunter eingerückt steht, bringt Pip den Spruch bei; dabei passiert noch nichts. Erst hop() weiter unten führt ihn aus, und zwar zweimal.

function hop() {
  move();
  move();
}

hop();
turnLeft();
hop();

function hop() { … } bringt Pip den Spruch bei; dabei passiert noch nichts. Erst hop(); weiter unten führt ihn aus, und zwar zweimal.

Bei den ersten drei Katas ruft die Prüfung deinen Zauberspruch selbst auf, auf Karten, die sie dafür aufbaut. Was du unter den Spruch schreibst, um ihn auszuprobieren, lässt sie dabei weg.

Aufgabe 4RechtsherumEinstieg

Schreib den Zauberspruch turn_right: Pip dreht sich eine Vierteldrehung nach rechts. Die Prüfung stellt Pip auf zwei Karten und ruft turn_right auf.

moveturn_leftsay "…"
Tipp

Was im Schacht drei Zeilen waren, steht jetzt im Zauberspruch.

Aufgabe 4RechtsherumEinstieg

Schreib den Zauberspruch turn_right(): Pip dreht sich eine Vierteldrehung nach rechts. Die Prüfung stellt Pip auf zwei Karten und ruft turn_right() auf.

move()turn_left()say("…")
Tipp

Was im Schacht drei Zeilen waren, steht jetzt im Zauberspruch.

Aufgabe 4RechtsherumEinstieg

Schreib den Zauberspruch turnRight(): Pip dreht sich eine Vierteldrehung nach rechts. Die Prüfung stellt Pip auf zwei Karten und ruft turnRight() auf.

move()turnLeft()say("…")
Tipp

Was im Schacht drei Zeilen waren, steht jetzt im Zauberspruch.

Aufgabe 5Kehrt!Übung

Noch ein Zauberspruch: turn_around dreht Pip in die Gegenrichtung.

moveturn_leftsay "…"
Aufgabe 5Kehrt!Übung

Noch ein Zauberspruch: turn_around() dreht Pip in die Gegenrichtung.

move()turn_left()say("…")
Aufgabe 5Kehrt!Übung

Noch ein Zauberspruch: turnAround() dreht Pip in die Gegenrichtung.

move()turnLeft()say("…")
Aufgabe 6Ein Spruch mit ZahlÜbung

walk(n) lässt Pip n Felder vorwärts gehen: walk(3) drei, walk(5) fünf. n ist ein Parameter: Beim Aufruf steht dort eine Zahl, und im Zauberspruch hat n diesen Wert. Du schreibst nur den Spruch; die Prüfung ruft ihn auf drei Karten auf, mit walk(3), walk(5) und walk(1), und jeder Gang ist genau so lang, wie Pip gehen soll.

moveturn_leftsay "…"
Tipp

Eine Schleife, die so oft läuft, wie n groß ist.

Aufgabe 6Ein Spruch mit ZahlÜbung

walk(n) lässt Pip n Felder vorwärts gehen: walk(3) drei, walk(5) fünf. n ist ein Parameter: Beim Aufruf steht dort eine Zahl, und im Zauberspruch hat n diesen Wert. Du schreibst nur den Spruch; die Prüfung ruft ihn auf drei Karten auf, mit walk(3), walk(5) und walk(1), und jeder Gang ist genau so lang, wie Pip gehen soll.

move()turn_left()say("…")
Tipp

Eine Schleife, die so oft läuft, wie n groß ist.

Aufgabe 6Ein Spruch mit ZahlÜbung

walk(n) lässt Pip n Felder vorwärts gehen: walk(3) drei, walk(5) fünf. n ist ein Parameter: Beim Aufruf steht dort eine Zahl, und im Zauberspruch hat n diesen Wert. Du schreibst nur den Spruch; die Prüfung ruft ihn auf drei Karten auf, mit walk(3), walk(5) und walk(1), und jeder Gang ist genau so lang, wie Pip gehen soll.

move()turnLeft()say("…")
Tipp

Eine Schleife, die so oft läuft, wie n groß ist.

Aufgabe 7Die TreppeKnobelei

Eine Treppe nach oben: eine Stufe, dann zwei, drei und vier, jede so hoch wie breit. Deine Zaubersprüche stehen schon da; der Plan darunter braucht nur noch eine Schleife.

moveturn_leftsay "…"
Tipp

Jede Stufe ist: n Felder geradeaus, links hoch, n Felder, rechts wieder in die alte Richtung. n zählt von 1 bis 4.

Aufgabe 7Die TreppeKnobelei

Eine Treppe nach oben: eine Stufe, dann zwei, drei und vier, jede so hoch wie breit. Deine Zaubersprüche stehen schon da; der Plan darunter braucht nur noch eine Schleife.

move()turn_left()say("…")
Tipp

Jede Stufe ist: n Felder geradeaus, links hoch, n Felder, rechts wieder in die alte Richtung. n zählt von 1 bis 4.

Aufgabe 7Die TreppeKnobelei

Eine Treppe nach oben: eine Stufe, dann zwei, drei und vier, jede so hoch wie breit. Deine Zaubersprüche stehen schon da; der Plan darunter braucht nur noch eine Schleife.

move()turnLeft()say("…")
Tipp

Jede Stufe ist: n Felder geradeaus, links hoch, n Felder, rechts wieder in die alte Richtung. n zählt von 1 bis 4.

3. Das Labyrinth

Ein Labyrinth hat Gänge, Abzweigungen und Sackgassen. Den Weg kennt niemand, aber es gibt einen alten Trick: die Hand an der Wand. Wer immer mit derselben Hand an der Wand bleibt, läuft jeden Gang ab, jede Sackgasse hinein und wieder heraus, und kommt irgendwann überall vorbei, wo die Wand hinführt.

Aufgabe 8Die Hand an der WandÜbung

Ein kleines Labyrinth. Der Trick des Wichtels: Pip legt die linke Hand an die Wand und nimmt sie nie weg. Bei jedem Schritt dreht sich Pip erst nach links und dann nach rechts, bis vorn frei ist.

moveturn_leftfront_clear?on_lamp?say "…"
Tipp

In der Schleife: einmal turn_left, dann turn_right, solange vorn kein Weg ist, dann ein Schritt.

Aufgabe 8Die Hand an der WandÜbung

Ein kleines Labyrinth. Der Trick des Wichtels: Pip legt die linke Hand an die Wand und nimmt sie nie weg. Bei jedem Schritt dreht sich Pip erst nach links und dann nach rechts, bis vorn frei ist.

move()turn_left()front_clear()on_lamp()say("…")
Tipp

In der Schleife: einmal turn_left(), dann turn_right(), solange vorn kein Weg ist, dann ein Schritt.

Aufgabe 8Die Hand an der WandÜbung

Ein kleines Labyrinth. Der Trick des Wichtels: Pip legt die linke Hand an die Wand und nimmt sie nie weg. Bei jedem Schritt dreht sich Pip erst nach links und dann nach rechts, bis vorn frei ist.

move()turnLeft()frontClear()onLamp()say("…")
Tipp

In der Schleife: einmal turnLeft(), dann turnRight(), solange vorn kein Weg ist, dann ein Schritt.

Aufgabe 9Das LabyrinthKnobelei

Drei Labyrinthe: eines siehst du hier, die anderen zwei baut der Wichtel für dich, jedes Mal dieselben, aber für jede Person andere. Ein Plan für alle.

moveturn_leftfront_clear?on_lamp?say "…"
Tipp

Die Hand an der Wand führt durch jedes Labyrinth, in dem alle Wände zusammenhängen: Pip läuft jede Sackgasse aus und kommt irgendwann an der Lampe vorbei.

Aufgabe 9Das LabyrinthKnobelei

Drei Labyrinthe: eines siehst du hier, die anderen zwei baut der Wichtel für dich, jedes Mal dieselben, aber für jede Person andere. Ein Plan für alle.

move()turn_left()front_clear()on_lamp()say("…")
Tipp

Die Hand an der Wand führt durch jedes Labyrinth, in dem alle Wände zusammenhängen: Pip läuft jede Sackgasse aus und kommt irgendwann an der Lampe vorbei.

Aufgabe 9Das LabyrinthKnobelei

Drei Labyrinthe: eines siehst du hier, die anderen zwei baut der Wichtel für dich, jedes Mal dieselben, aber für jede Person andere. Ein Plan für alle.

move()turnLeft()frontClear()onLamp()say("…")
Tipp

Die Hand an der Wand führt durch jedes Labyrinth, in dem alle Wände zusammenhängen: Pip läuft jede Sackgasse aus und kommt irgendwann an der Lampe vorbei.

Hier geht es weiter, sobald du deine Antwort oben abgegeben hast.

Ausprobieren: Tausche in deinem Plan links und rechts: die rechte Hand an der Wand. Schau in der Wiedergabe, ob Pip einen anderen Weg nimmt und ob er kürzer ist.
Aufgabe 10Die InselExtra

In diesem Labyrinth läuft Pip mit der linken Hand an der Wand ewig im Kreis. Probier es aus und finde heraus, warum. Dann bring Pip trotzdem zur Lampe.

moveturn_leftfront_clear?on_lamp?say "…"
Tipp

Die linke Hand bleibt an der Außenwand, und die läuft ringsherum. Die Lampe liegt in der Mitte, an einer Wand, die mit der Außenwand nicht zusammenhängt. Welche Wand hat Pip am Anfang auf der anderen Seite?

Aufgabe 10Die InselExtra

In diesem Labyrinth läuft Pip mit der linken Hand an der Wand ewig im Kreis. Probier es aus und finde heraus, warum. Dann bring Pip trotzdem zur Lampe.

move()turn_left()front_clear()on_lamp()say("…")
Tipp

Die linke Hand bleibt an der Außenwand, und die läuft ringsherum. Die Lampe liegt in der Mitte, an einer Wand, die mit der Außenwand nicht zusammenhängt. Welche Wand hat Pip am Anfang auf der anderen Seite?

Aufgabe 10Die InselExtra

In diesem Labyrinth läuft Pip mit der linken Hand an der Wand ewig im Kreis. Probier es aus und finde heraus, warum. Dann bring Pip trotzdem zur Lampe.

move()turnLeft()frontClear()onLamp()say("…")
Tipp

Die linke Hand bleibt an der Außenwand, und die läuft ringsherum. Die Lampe liegt in der Mitte, an einer Wand, die mit der Außenwand nicht zusammenhängt. Welche Wand hat Pip am Anfang auf der anderen Seite?

4. Drei Hebel

Hinter dem Labyrinth ragen Stacheln aus dem Boden, quer über den Weg; da tritt Pip nicht drauf. Daneben steht ein Hebel, und in den Fels hat jemand geritzt: »Dreimal ziehen. Nicht öfter.«

Befehl Was Pip macht
pull zieht am Hebel, auf dem Pip steht
on_lever? fragt: Steht hier ein Hebel?
Befehl Was Pip macht
pull() zieht am Hebel, auf dem Pip steht
on_lever() fragt: Steht hier ein Hebel?
Befehl Was Pip macht
pull(); zieht am Hebel, auf dem Pip steht
onLever() fragt: Steht hier ein Hebel?
Aufgabe 11Der HebelEinstieg

Vor der Lampe ragen Stacheln aus dem Boden; darauf tritt Pip nicht. Sie versinken, wenn Pip genau dreimal am Hebel zieht: pull, auf dem Feld des Hebels. Ein vierter Zug lässt sie wieder herausfahren.

moveturn_leftpullsay "…"
Aufgabe 11Der HebelEinstieg

Vor der Lampe ragen Stacheln aus dem Boden; darauf tritt Pip nicht. Sie versinken, wenn Pip genau dreimal am Hebel zieht: pull(), auf dem Feld des Hebels. Ein vierter Zug lässt sie wieder herausfahren.

move()turn_left()pull()say("…")
Aufgabe 11Der HebelEinstieg

Vor der Lampe ragen Stacheln aus dem Boden; darauf tritt Pip nicht. Sie versinken, wenn Pip genau dreimal am Hebel zieht: pull(), auf dem Feld des Hebels. Ein vierter Zug lässt sie wieder herausfahren.

move()turnLeft()pull()say("…")

Bei mehreren Hebeln muss Pip sich merken, wie oft schon gezogen wurde. Dafür gibt es Variablen, wie in den Katas zum Wiederholen:

steps = 0
while front_clear?
  move
  steps += 1
end
say steps
steps = 0
while front_clear():
    move()
    steps += 1
say(steps)
let steps = 0;
while (frontClear()) {
  move();
  steps++;
}
say(steps);
Aufgabe 12Zu viele HebelÜbung

Auf diesen Karten stehen drei, vier oder fünf Hebel vor den Stacheln, und jeder Zug zählt, egal an welchem. Pip prüft mit on_lever?, ob auf dem Feld ein Hebel steht, und zählt in einer Variable mit, wie oft schon gezogen wurde.

moveturn_leftpullon_lever?front_clear?say "…"
Tipp

pulls fängt bei 0 an. An einem Hebel zieht Pip nur, solange pulls kleiner als 3 ist, und zählt dann eins weiter.

Aufgabe 12Zu viele HebelÜbung

Auf diesen Karten stehen drei, vier oder fünf Hebel vor den Stacheln, und jeder Zug zählt, egal an welchem. Pip prüft mit on_lever(), ob auf dem Feld ein Hebel steht, und zählt in einer Variable mit, wie oft schon gezogen wurde.

move()turn_left()pull()on_lever()front_clear()say("…")
Tipp

pulls fängt bei 0 an. An einem Hebel zieht Pip nur, solange pulls kleiner als 3 ist, und zählt dann eins weiter.

Aufgabe 12Zu viele HebelÜbung

Auf diesen Karten stehen drei, vier oder fünf Hebel vor den Stacheln, und jeder Zug zählt, egal an welchem. Pip prüft mit onLever(), ob auf dem Feld ein Hebel steht, und zählt in einer Variable mit, wie oft schon gezogen wurde.

move()turnLeft()pull()onLever()frontClear()say("…")
Tipp

pulls fängt bei 0 an. An einem Hebel zieht Pip nur, solange pulls kleiner als 3 ist, und zählt dann eins weiter.

Aufgabe 13GezähltExtra

Der Wichtel will wissen, wie viele Funkensteine in jedem Stollen lagen. Pip sammelt sie bis zur Wand ein, zählt mit und sagt am Ende mit say die Zahl.

moveturn_lefttakeon_stone?front_clear?say "…"
Aufgabe 13GezähltExtra

Der Wichtel will wissen, wie viele Funkensteine in jedem Stollen lagen. Pip sammelt sie bis zur Wand ein, zählt mit und sagt am Ende mit say() die Zahl.

move()turn_left()take()on_stone()front_clear()say("…")
Aufgabe 13GezähltExtra

Der Wichtel will wissen, wie viele Funkensteine in jedem Stollen lagen. Pip sammelt sie bis zur Wand ein, zählt mit und sagt am Ende mit say() die Zahl.

move()turnLeft()take()onStone()frontClear()say("…")

5. Bellos Spur

Hinter den Stacheln riecht es nach nassem Hund. Auf dem Boden sind Pfotenabdrücke, und hier und da Pfützen.

Befehl Was Pip macht
puddle_ahead? fragt: Ist vor Pip eine Pfütze?
trail_ahead? fragt: Sind auf dem Feld vor Pip Pfotenabdrücke? (Auch Bello selbst zählt.)
bello_here? fragt: Ist Bello hier?

Zwei Fragen lassen sich verbinden: a && b ist wahr, wenn beide wahr sind (und), a || b, wenn mindestens eine wahr ist (oder), und !a dreht eine um (nicht).

Befehl Was Pip macht
puddle_ahead() fragt: Ist vor Pip eine Pfütze?
trail_ahead() fragt: Sind auf dem Feld vor Pip Pfotenabdrücke? (Auch Bello selbst zählt.)
bello_here() fragt: Ist Bello hier?

Zwei Fragen lassen sich verbinden: a and b ist wahr, wenn beide wahr sind, a or b, wenn mindestens eine wahr ist, und not a dreht eine um.

Befehl Was Pip macht
puddleAhead() fragt: Ist vor Pip eine Pfütze?
trailAhead() fragt: Sind auf dem Feld vor Pip Pfotenabdrücke? (Auch Bello selbst zählt.)
belloHere() fragt: Ist Bello hier?

Zwei Fragen lassen sich verbinden: a && b ist wahr, wenn beide wahr sind (und), a || b, wenn mindestens eine wahr ist (oder), und !a dreht eine um (nicht).

Aufgabe 14Trockene FüßeÜbung

Bello läuft nie durch Pfützen, und Pip will auch keine nassen Füße. puddle_ahead? sagt, ob vorn eine Pfütze ist. Für Pip zählt eine Pfütze jetzt wie eine Wand: Weiter geht es nur, wo vorn frei ist und keine Pfütze.

moveturn_leftfront_clear?puddle_ahead?on_lamp?say "…"
Tipp

Die Hand an der Wand, nur die Frage ist länger: front_clear? && !puddle_ahead? heißt »vorn frei und keine Pfütze«. && ist »und«, ! ist »nicht«.

Aufgabe 14Trockene FüßeÜbung

Bello läuft nie durch Pfützen, und Pip will auch keine nassen Füße. puddle_ahead() sagt, ob vorn eine Pfütze ist. Für Pip zählt eine Pfütze jetzt wie eine Wand: Weiter geht es nur, wo vorn frei ist und keine Pfütze.

move()turn_left()front_clear()puddle_ahead()on_lamp()say("…")
Tipp

Die Hand an der Wand, nur die Frage ist länger: Pip dreht sich weiter, solange not front_clear() or puddle_ahead() gilt, »vorn Wand oder Pfütze«.

Aufgabe 14Trockene FüßeÜbung

Bello läuft nie durch Pfützen, und Pip will auch keine nassen Füße. puddleAhead() sagt, ob vorn eine Pfütze ist. Für Pip zählt eine Pfütze jetzt wie eine Wand: Weiter geht es nur, wo vorn frei ist und keine Pfütze.

move()turnLeft()frontClear()puddleAhead()onLamp()say("…")
Tipp

Die Hand an der Wand, nur die Frage ist länger: Pip dreht sich weiter, solange !frontClear() || puddleAhead() gilt, »vorn Wand oder Pfütze«. || ist »oder«, ! ist »nicht«.

Aufgabe 15Bellos SpurKnobelei

Auf dem Boden der Höhle: Pfotenabdrücke. trail_ahead? sagt, ob auf dem nächsten Feld welche sind. Wo Bello durch eine Pfütze gelaufen ist, hat das Wasser sie weggewaschen; dort geht die Spur trotzdem weiter. Folge ihr, bis bello_here? wahr ist.

moveturn_lefttrail_ahead?puddle_ahead?bello_here?say "…"
Tipp

Die Spur ist wie ein Gang ohne Wände: Die Hand an der Wand geht auch hier, mit »Spur oder Pfütze vorn« statt »vorn frei«.

Aufgabe 15Bellos SpurKnobelei

Auf dem Boden der Höhle: Pfotenabdrücke. trail_ahead() sagt, ob auf dem nächsten Feld welche sind. Wo Bello durch eine Pfütze gelaufen ist, hat das Wasser sie weggewaschen; dort geht die Spur trotzdem weiter. Folge ihr, bis bello_here() wahr ist.

move()turn_left()trail_ahead()puddle_ahead()bello_here()say("…")
Tipp

Die Spur ist wie ein Gang ohne Wände: Die Hand an der Wand geht auch hier, mit »Spur oder Pfütze vorn« statt »vorn frei«.

Aufgabe 15Bellos SpurKnobelei

Auf dem Boden der Höhle: Pfotenabdrücke. trailAhead() sagt, ob auf dem nächsten Feld welche sind. Wo Bello durch eine Pfütze gelaufen ist, hat das Wasser sie weggewaschen; dort geht die Spur trotzdem weiter. Folge ihr, bis belloHere() wahr ist.

move()turnLeft()trailAhead()puddleAhead()belloHere()say("…")
Tipp

Die Spur ist wie ein Gang ohne Wände: Die Hand an der Wand geht auch hier, mit »Spur oder Pfütze vorn« statt »vorn frei«.

Hier geht es weiter, sobald du deine Antwort oben abgegeben hast.

Am Ende der Spur sitzt Bello, nass bis zu den Ohren, und wedelt, als wäre nichts gewesen. Im Maul hat er einen Funkenstein, den größten, den Pip je gesehen hat. »Na also«, sagt der Wichtel. »Und jetzt nichts wie raus hier.«

6. Zurück ans Licht

Der Weg nach oben führt durch alles, was Pip unterwegs gelernt hat. Bello trottet hinterher.

Aufgabe 16Zurück ans LichtKnobelei

Der Weg nach oben: ein langer, gewundener Stollen ohne Abzweigungen, quer durch die Schächte der Glibber. Unterwegs liegen Funkensteine, und vor der Lampe ragen Stacheln aus dem Boden, die nur nach genau drei Zügen versinken, verteilt auf zwei Hebel. Drei Karten, ein Plan.

moveturn_lefttakewaitpullon_stone?on_lever?front_clear?glibber_ahead?on_lamp?say "…"
Tipp

Fang mit dem Plan aus »Um die Ecken« an. Vor jedem Schritt: warten, solange ein Glibber vor Pip ist. Nach jedem Schritt: Stein? Hebel? Und für die Hebel brauchst du wieder eine Variable, die mitzählt.

Aufgabe 16Zurück ans LichtKnobelei

Der Weg nach oben: ein langer, gewundener Stollen ohne Abzweigungen, quer durch die Schächte der Glibber. Unterwegs liegen Funkensteine, und vor der Lampe ragen Stacheln aus dem Boden, die nur nach genau drei Zügen versinken, verteilt auf zwei Hebel. Drei Karten, ein Plan.

move()turn_left()take()wait()pull()on_stone()on_lever()front_clear()glibber_ahead()on_lamp()say("…")
Tipp

Fang mit dem Plan aus »Um die Ecken« an. Vor jedem Schritt: warten, solange ein Glibber vor Pip ist. Nach jedem Schritt: Stein? Hebel? Und für die Hebel brauchst du wieder eine Variable, die mitzählt.

Aufgabe 16Zurück ans LichtKnobelei

Der Weg nach oben: ein langer, gewundener Stollen ohne Abzweigungen, quer durch die Schächte der Glibber. Unterwegs liegen Funkensteine, und vor der Lampe ragen Stacheln aus dem Boden, die nur nach genau drei Zügen versinken, verteilt auf zwei Hebel. Drei Karten, ein Plan.

move()turnLeft()take()wait()pull()onStone()onLever()frontClear()glibberAhead()onLamp()say("…")
Tipp

Fang mit dem Plan aus »Um die Ecken« an. Vor jedem Schritt: warten, solange ein Glibber vor Pip ist. Nach jedem Schritt: Stein? Hebel? Und für die Hebel brauchst du wieder eine Variable, die mitzählt.

Hier geht es weiter, sobald du deine Antwort oben abgegeben hast.

Oben ist es Nacht, und über Funkelbach leuchten die Sterne. Bello schüttelt sich, dass das Wasser nur so spritzt. »Gut gemacht«, sagt der Wichtel und nimmt Pips Laterne. Unten im Stollen brennen jetzt alle alten Lampen.