Lektion 6 - Häuser und dann?

Erstellt von Frithjof Tue, 03 Apr 2007 20:48:00 GMT

In Lektion 5 haben wir es endlich geschafft, eine Reihe mit Häusern zu malen. Wir könnten nun in diese langweilige Szene noch etwas Leben bringen. Entlang der Häuser soll eine Straße verlaufen. Auf der Straße soll ein Fahrrad fahren können. Wenn du auf deiner Tastatur auf die R-Taste drückst, soll das Fahrrad nach rechts fahren, drückst du auf die L-Taste, fährt es nach links. Ganz schön viel zu tun! Das schaffen wir kaum in einer Lektion. Außerdem müssen wir noch etwas mehr von Ruby lernen, bevor wir das alles hinbekommen.

Du lernst in dieser Lektion daher einiges an Grundlagenwissen, das wir für die Vervollkommnung unserer Häuserszene benötigen.

  1. Wie bringst du Ruby bei, eine Entscheidung für zwei Möglichkeiten zu treffen? Stelle dir folgende Situation vor: Das Fahrrad kann auf einer Zeile immer nur ein Zeichen (d.h. eine Spalte) nach links oder nach rechts fahren. Es steht zum Beispiel gerade in der Spalte 5 (d.h auf dem 5-ten Zeichen vom linken Rand der DOS-Box). Nun tippst du auf die R-Taste. Das Fahrrad soll sich nach rechts, also in die Spalte 6 bewegen. Würdest du auf die L-Taste drücken, müsste es sich zurück in die Spalte 4 bewegen. Wir brauchen also eine Möglichkeit, im Rubyprogramm zur aktuellen Fahrradposition entweder 1 zu addieren, oder 1 zu subtrahieren – je nachdem welche Taste du gedrückt hast.
  2. Wie bringst du Ruby dazu, einen Codeblock mehrmals zu wiederholen, ohne dass du von vornherein weißt, wie oft genau wiederholt werden soll? Stelle dir wieder vor, du drückst fleißig auf die R- und auf die L-Taste. Das Fahrrad saust hin und her. Ruby darf in der ganzen Zeit das Programm nicht beenden, sondern muss ständig auf deine Eingaben warten – selbst wenn du zwischendurch mal zum Kühlschrank gehst! Erst dann, wenn du eine bestimmte Taste drückst, sagen wir die X-Taste, dann darf Ruby das Programm beenden, weil die X-Taste bedeutet: du hast keine Lust mehr.

Fangen wir also damit an.

Entscheidungen mit Ruby

Entscheidungen in Ruby sind recht einfach. Du musst nur 4 englische Wörter lernen:

if bedeutet wenn
then bedeutet dann
end bedeutet ende, das kennst du schon von den Codeblöcken bei Schleifen.
else bedeutet sonst

Diese englischen Wörter haben im Programmcode von Ruby eine besondere Bedeutung. Sie heißen auch Schlüsselwörter, weil man sie nicht für andere Sachen in einem Programm verwenden darf. Du dürftest bspw. keine Variable mit dem Namen if oder else anlegen. Ruby würde das mit einer Fehlermeldung vergelten.

Wenn du die Wörter oben gelernt hast, dann fällt es dir bestimmt nicht schwer, folgendes Programm zu verstehen:


# lektion_06.rb

require 'rubykids'

richtung = "R" 

if richtung == "R" then schreibe "Ich fahre nach rechts" end
if richtung == "L":     schreibe "Ich fahre nach links" end

Probiere mal aus, den Wert der Variable richtung auf L oder irgendeinen anderen Buchstaben zu ändern. Was passiert?

Schau dir nun folgendes Programm an und spiele genauso mit der Variablen richtung herum. Es passiert nicht dasselbe. Weißt du warum?


# lektion_06.rb

require 'rubykids'

richtung = "R" 

if richtung == "R" 
  schreibe "Ich fahre nach rechts" 
else
  schreibe "Ich fahre nach links" 
end

Erklärung – Entscheidungen mit Ruby

Allgemein kannst du eine Entscheidung mit Ruby so schreiben:


if (aussage)
  # tue etwas, wenn die aussage wahr ist
else
  # tue etwas, wenn die aussage falsch ist
end

# oder

if (aussage) then ... end

# oder statt then kann man auch den Doppelpunkt nehmen

if (aussage) : ... end

Wenn die Aussage nach dem if wahr ist, dann führt Ruby den Codeblock aus, der unmittelbar danach kommt. Der auszuführende Codeblock reicht bis zum else, wenn es kein else gibt, dann reicht der Codeblock bis zum end.

Schreibst du den if-Ausdruck in eine Zeile, musst du zum Abtrennen noch das then (oder den Doppelpunkt) zwischen die zu prüfende Aussage und den Codeblock einschieben.

Man kann das if auch hinten anstellen:


# lektion_06.rb

require 'rubykids'

richtung = "R" 

schreibe "Ich fahre nach rechts" if richtung == "R" 
schreibe "Ich fahre nach links"  if richtung == "L" 

Mehr als zwei Entscheidungen mit Ruby

Mit if – then – else kannst du zwei Entscheidungen treffen. Ruby kann aber auch zwischen mehr Alternativen entscheiden. Verwende einfach zusätzlich beliebige elsif Anweisungen:


# lektion_06.rb

require 'rubykids'

richtung = "O" 

if richtung == "R" 
  schreibe "Ich fahre nach rechts" 
elsif richtung == "L" 
  schreibe "Ich fahre nach links" 
elsif richtung == "O" 
  schreibe "Ich fahre nach oben" 
elsif richtung == "U" 
  schreibe "Ich fahre nach unten" 
end

elsif ist wieder ein Schlüsselwort und darf für nichts anderes verwendet werden.

Es gibt noch einiges mehr zum Thema Entscheidungen zu sagen. Wir werden darauf zurückkommen, sobald wir es brauchen. Was du bisher hier darüber gelernt hast, reicht zunächst völlig aus. Kommen wir lieber noch zum nächsten Thema

Beliebig lange Wiederholungen mit Ruby

Schauen wir uns folgende Wiederholungsschleife in Ruby an:


# lektion_06.rb

require 'rubykids'

while zeichenkette = lies_eine_zeichenkette
  schreibe "Du hast die Zeichenkette '", zeichenkette.ohne_enter, "' eingegeben!" 
end

Starte das Programm einmal mit dem Befehl


C:\entwicklung>ruby lektion_06.rb

und gib irgendetwas über die Tastatur ein und drücke anschließend die Entertaste. Was passiert? Ruby liest, was du eingegeben hast und gibt es wie ein Echo nochmal aus. Du gibst wieder etwas ein und Ruby gibt es wieder aus und immer so weiter. Wann hält das Programm denn endlich mal an? Nie! Solange dein PC Strom hat, wird Ruby das Programm für immer ausführen. Wir haben soeben eine sogenannte Endlosschleife programmiert. Die einzige Möglichkeit das Programm zu beenden ist, Ruby selbst zu beenden. Das kannst du über die Tastatur mit der Tastenkombination Strg-C erreichen. Drücke die Strg-Taste (ganz unten links auf deiner Tastatur), halte sie fest und drücke noch auf die C-Taste. Dann wird Ruby sich eingeschnappt mit einer Fehlermeldung verabschieden.

Die Endlosschleife ist eine sogenannte while-Schleife. While bedeutet soviel wie solange bis. Allgemein kannst du eine while-Schleife so verwenden:


while (aussage)
  # tue etwas, wenn die aussage wahr ist
end

Solange der Wert von aussage wahr ist, führt Ruby den Codeblock bis zum zugehörigen end aus und kehrt wieder nach oben zur erneuten Prüfung der aussage zurück. Sobald die aussage falsch wird, springt Ruby zum nächsten Code nach dem end. Falls dort nichts mehr kommt, ist das Programm zu Ende.

In unserem obigen Beispiel bestand die aussage darin, etwas von der Tastatur einzulesen und in der Variablen zeichenkette abzuspeichern. Ruby wartet auf deine Tastatureingabe und macht erst weiter, wenn du mit Enter deine Eingabe abgeschlossen hast. Somit ist eine Eingabe immer möglich, und die aussage (zeichenkette = lies_eine_zeichenkette) ist immer wahr.

Wollen wir das Programm auf normalem Wege beenden, müssen wir eine Bedingung innerhalb des Codeblocks der While-Schleife einbauen. Wenn wir keine Lust mehr haben, irgendetwas an der Tastatur einzugeben, teilen wir das Ruby mit, indem wir das Wort ende eingeben. Unser Programm sieht dann so aus:


# lektion_06.rb

require 'rubykids'

while zeichenkette = lies_eine_zeichenkette
  if zeichenkette.ohne_enter == "ende" 
    schreibe "Bis bald! " 
    exit
  end
  schreibe "Du hast die Zeichenkette '", zeichenkette.ohne_enter, "' eingegeben!" 
end

Mit der Anweisung exit springt Ruby aus dem Codeblock der while-Schleife, auch wenn die aussage wahr gewesen ist. Alles was noch in der Schleife zu tun wäre, wird nicht mehr ausgeführt. Das Programm arbeitet erst nach dem end wieder weiter. while und exit sind ebenfalls Schlüsselwörter.

Peter und Livia

Peter: Ist ja alles ziemlich pipi einfach. Was ich nur nicht verstehe: warum muss ich in dem Ausdruck manchmal ein doppeltes Gleichheitszeichen schreiben? Kann ich statt richtung == “R” nicht auch richtung = “R” verwenden?

Livia: Das kommt darauf an, was gemeint ist. In diesem Fall möchtest du doch den Wert der Variable richtung mit einer Zeichenkette “R” vergleichen. Zum Prüfen auf Gleichheit verwendest du in Ruby das doppelte Gleichheitszeichen. Würdest du richtung = “R” schreiben, so würdest du ja der Variablen richtung den Wert “R” zuweisen und der vorherige Wert der Variablen würde verloren gehen. Da die Zuweisung von “R” zur Variablen richtung immer funktioniert, wäre die aussage auch immer wahr, auch wenn richtung vorher bspw. den Wert “L” hatte. Eine prima Fehlerquelle.

Etwas anders sieht es mit der aussage bei der while-Schleife aus. Dort haben wir bewusst das einfache Gleichheitszeichen verwendet: zeichenkette = lies_eine_zeichenkette. Hier möchten wir ja gerade der Variablen zeichenkette den neuen Wert zuweisen, den uns der Befehl lies_eine_zeichenkette von der Tastatur liefert. Da diese Zuweisung immer funktioniert, ist auch die aussage immer wahr, daher wird die Schleife ja auch endlos ausgeführt.

- Änderungen
22.09.2007, Unicodeproblem mit Umlauten