Eine Warteschlange

Eine Warteschlange

Unsere Warteschlange ("First in - first out") Mit warteschlange.push x wird das Objekt x zur Warteschlange hinzugefügt, mit x = warteschlange.shift() wird das nächste Element "abgeholt" und an die Variable x zugewiesen.

warteschlange = []

Wir definieren "neue" Igelbefehle, die den ursprünglichen Befehl ausführen, aber zusätzlich eine Funktion in der Warteschlange abspeichern Diese werden wir später abrufen. Bei den Drehbefehlen speichern wir jeweils die Drehung in die andere Richtung ab. So können wir später das Spiegelbild der zuerst gezeichneten Figur erhalten.

VOR = (d) ->
  vor d
  warteschlange.push -> vor d

ZURÜCK = (d) ->
  zurück d
  warteschlange.push -> zurück d

LINKS = (w) ->
  links w
  warteschlange.push -> rechts w

RECHTS = (w) ->
  rechts w
  warteschlange.push -> links w

Die Funktion spiegeln stellt den Igel an die Ausgangsposition und arbeitet dann die Befehle aus der Warteschlange ab Ist die Schlange leer, so gibt warteschlange.shift() den Wert undefined ("undefiniert") zurück. Das ? überprüft den Ausdruck daraufhin, ob er "existiert" oder undefined ist. Die Schleife bricht also ab, sobald die Warteschlange leer ist.

spiegeln = ->
  stifthoch()
  nachhause()
  stiftrunter()
  während (f = warteschlange.shift())?
    f()

Hier ein kleines Beispielprogramm.

bildschirmleer()
wiederhole 2, ->
  VOR 50
  LINKS 60
LINKS 20
wiederhole 5, ->
  VOR 30
  LINKS 72
LINKS -20
wiederhole 4, ->
  VOR 50
  LINKS 60
ZURÜCK 200
RECHTS 140
VOR 100

Und nun lassen wir das Spiegelbild zeichnen.

stiftfarbe rot
spiegeln()

Findet Du heraus, wie man das Programm modifizieren kann, um statt der Spiegelung an der senkrechten eine Spiegelung an der waagerechten Mittelgerade zu bekommen? Oder eine Punktspiegelung am Mittelpunkt?