Karl findet ein Loch in der Wand

Karl geht zunächst so lange nach vorne, bis er auf die Wand trifft, anschließend dreht er sich nach links und geht weiter, bis er das Loch in der Wand gefunden hat.

Versuche mit selbstdefinierten Bedingungen eine Anweisung "Finde das Loch in der Wand" zu schreiben.

Karl läuft an der Wand entlang

Karl befindet sich in einem Labyrinth. Er will aus dem Labyrinth entkommen, indem er einfach solange an der Wand entlang läuft, bis er einen Weg aus dem Labyrinth gefunden hat.

Karl soll lernen, an einer Wand entlang zu laufen. Dabei versucht er stets mit der linken Hand die Wand zu berühren.

Welche Situationen können sich für Karl ergeben?

  • Wie viele Rechtskurven gibt es?
  • Wie viele Linkskurven gibt es?
  • In welchen Situationen macht Karl eine Linkskurve bzw. wann macht er eine Rechtskurve?
  • Wann läuft er vorwärts?

Die drei Situationen

  • R LinksIstWand ist wahr und IstWand ist wahr
  • L LinksIstWand ist falsch 
  • V LinksIstWand ist wahr und IstWand ist falsch

 

Programmiere die folgende Bedingung und die drei Anweisungen:

  1. Bedingung: LinksIstWand
  2. Anweisung: Vorgehen
  3. Anweisung: LinksGehen
  4. Anweisung: RechtsGehen

Programmiere dann die Anweisung: FolgeDerWand.

Was soll Karl tun, wenn er zu Beginn sich nicht an einer Wand befindet?
Erweitere dein Programm um die Anweisung: GeheZurWand

Karl und der Pledge-Algorithmus

Möchte man einen Weg aus dem Labyrinth finden, indem man der Wand immer mit der linken oder rechten Hand entlang läuft hat man ein Problem, wenn sich im Labyrinth eine "Säule" befindet.

Der Pledge-Algorithmnus löst dieses Problem. Die Links- und Rechtskurven werden aufgerechnet.

Da Karl nicht zählen kann, wird mit Hilfe von Ziegelsteinen gezählt. Dies sieht etwas seltsam aus, da Karl die Steine immer hinter sich hertragen muss. Um dies zu ermöglichen muss man im Editor die Einstellung, dass Karl beliebig hoch springen kann dafür ändern. 

Der Pledge-Algorithmus

  1. Der Roboter bewegt sich nach vorne, bis er eine Wand findet.
  2. Dann verfolgt er die Wand so, dass seine linke Hand stets Kontakt zur Wand hat.
  3. Alle Drehungen werden gezählt:
    • Rechtsdrehungen werden positiv gezählt.
    • Linksdrehungen werden negativ gezählt.
    • Ist der Zähler auf Null, läuft er wieder so lange geradeaus, bis er auf ein Hindernis trifft.
Quelltext

Quelltext

Anweisung Umdrehen
  LinksDrehen
  LinksDrehen
*Anweisung

Anweisung VorGehen
  Schnell
  Umdrehen
  wiederhole solange IstZiegel
    Aufheben
    Umdrehen
    Schritt
    Umdrehen
    Hinlegen
    Schritt
  *wiederhole
  Umdrehen
  Schritt
  Langsam
*Anweisung


Anweisung RechtsGehen
  Schnell
  Umdrehen
  wiederhole solange IstZiegel
    Aufheben
    LinksDrehen
    Schritt
    Umdrehen
    Hinlegen
    Schritt
    LinksDrehen
  *wiederhole
  LinksDrehen
  Schritt
  Umdrehen
  Hinlegen
  Umdrehen
  Langsam
*Anweisung

Bedingung NichtIstWandUndNichtIstMarke
  Schnell
  falsch
  wenn NichtIstWand dann
    wenn NichtIstMarke dann wahr *wenn
  *wenn
  Langsam
*Bedingung

Anweisung GeheZurWand
  wiederhole solange NichtIstWandUndNichtIstMarke
    VorGehen
  *wiederhole
  RechtsDrehen
  wenn NichtIstWandUndNichtIstMarke dann
    Schnell
    Schritt
    umdrehen
    Hinlegen
    umdrehen
    Langsam
  *wenn
*Anweisung

Anweisung LinksGehen
  Schnell
  Umdrehen
  wiederhole solange IstZiegel
    Aufheben
    RechtsDrehen
    Schritt
    Umdrehen
    Hinlegen
    Schritt
    RechtsDrehen
  *wiederhole
  RechtsDrehen
  Schritt
  Umdrehen
  Aufheben
  Umdrehen
  Langsam
*Anweisung

Bedingung IstLinksWand
  Schnell
  falsch
  LinksDrehen
  wenn IstWand dann wahr sonst falsch *wenn
  RechtsDrehen
  Langsam
*Bedingung


Bedingung IstRechtsWand
  Schnell
  falsch
  RechtsDrehen
  wenn IstWand dann wahr sonst falsch *wenn
  LinksDrehen
  Langsam
*Bedingung

Bedingung ZiegelSindDaUndNichtIstMarke
  Schnell
  falsch
  umdrehen
  wenn IstZiegel dann wahr sonst falsch *wenn
  wenn IstMarke dann falsch *wenn
  umdrehen
  Langsam
*Bedingung


Anweisung FolgeDerWand
  wenn IstLinksWand dann
    wenn NichtIstWand dann vorgehen
    sonst
      wenn IstRechtsWand dann Umdrehen
        Schritt
        wenn NichtIstWand dann Schritt *wenn
      sonst
        Rechtsgehen
      *wenn
    *wenn
  sonst
    Linksgehen
  *wenn
*Anweisung


wiederhole solange NichtIstMarke
  GeheZurWand
  wiederhole solange ZiegelSindDaUndNichtIstMarke
    FolgeDerWand
  *wiederhole
*wiederhole
// draußen und jetzt noch Aufräumen
umdrehen
wiederhole solange IstZiegel
  Aufheben
*wiederhole

Umdrehen

Zurück