Lektion 7 - Häuser, Straße und Fahrrad 2

Erstellt von Frithjof Tue, 10 Apr 2007 19:35:00 GMT

Diese Lektion schließt den ersten Satz der Lektionen (1, 2, 3, 4, 5, 6, 7) auf rubykids.de ab. Wir wollen hier unsere Häuserszene, wie bereits schon angedeutet, abrunden mit einer Straße, auf der du ein Fahrrad durch die L- bzw. R-Taste nach links bzw. rechts bewegen kannst. Wir werden dazu alles verwenden, was wir bisher über Ruby kennengelernt haben.

Zunächst das fertige Programm. Schaue es dir in Ruhe an und notiere dir vielleicht die Stellen, die du nicht verstehst. Wenn du alle Lektionen bisher durchgearbeitet hast, sollte nicht allzu viel unklar sein.

Denke bitte daran: ich gehe davon aus, dass du als Betriebssystem Windows XP verwendest. Mit einer anderen Windowsversion wird sicher auch alles funktionieren. Aber mit Linux oder Mac OS X wird es Fehler geben. Grund ist das Einlesen von der Tastatur. Das funktioniert bei jedem Betriebssystem etwas anders. Hier biete ich nur eine Lösung für Windows an.


# lektion_07.rb

require 'rubykids'

# Variable für das Fahrzeug, hier ein Fahrrad (etwas Phantasie bitte!)
fahrzeug       = "o^o" 

# Variable für die Länge der Straße
strassen_laenge = 60

# Variable für die rechte Stelle, bis zu der das Fahrzeug nur fahren darf.
# Wir wollen es nämlich nicht über den Rand herausfahren lassen.
fahrzeug_ende_rechts = strassen_laenge - fahrzeug.laenge + 1

# *** 1. Häuserreihe malen
dach         = "/^\\" 
erste_etage  = "|.|" 
erdgeschoss  = "|_|" 

anzahl_haeuser = 10
platz_zwischen_haus = "   " 
zaun                = ":::" 

schreibe_leer
# Alle Dächer in einer Zeile ausgeben
anzahl_haeuser.mal do
  schreib dach, platz_zwischen_haus
end

# wir springen erst jetzt in die zweite Zeile!
schreibe_leer 
# Alle ersten Etagen in der nächsten Zeile
anzahl_haeuser.mal do
  schreib erste_etage, platz_zwischen_haus
end

# und noch die dritte Zeile!
schreibe_leer
# Nun noch alle Erdgeschosse mit Zaun
anzahl_haeuser.mal do
  schreib erdgeschoss, zaun
end

schreibe_leer

# *** 2. Strasse von links nach rechts malen
# Oberer Rand:
strassen_laenge.mal { schreib "_" }
schreibe_leer
# Der Mittelstreifen:
strassen_laenge.mal { schreib "." }
schreibe_leer
# Und noch den unteren Rand, hier fährt dann das Fahrzeug
strassen_laenge.mal { schreib "_" }

# Variable für die aktuelle Stelle des Fahrzeuges
stelle = 0

# Variable für den Wert der Taste, die gedrückt wird
taste  = "" 

# *** 3. In einer Schleife wiederholt das Zeichen von der Tastatur
# lesen und nur die Zeile mit dem Fahrzeug neu malen. Der Rest 
# darüber bleibt wie er war.
while taste = lies_ein_zeichen
  # Wenn L-Taste gedrückt, dann das Fahrzeug nach links bewegen
  stelle = stelle - 1 if taste == "l" 

  # Wenn R-Taste gedrückt, dann das Fahrzeug nach rechts bewegen
  stelle = stelle + 1 if taste == "r" 

  # While-Schleife verlassen, wenn X-Taste gedrückt
  exit if taste.buchstaben_klein == "x" 

  # Falls das Fahrzeug nach links aus dem Fenster herausfahren will,
  # wieder auf die Anfangsstelle ganz links stellen
  if stelle < 1 then stelle = 1 end

  # Falls das Fahrzeug nach rechts weiter fahren will, als die Strasse
  # lang ist, auf die rechteste Endestelle stellen
  if stelle > fahrzeug_ende_rechts then stelle = fahrzeug_ende_rechts end

  # Zeile löschen, d.h. wieder vorne mit der Ausgabe anfangen 
  schreib "\r" 

  # Den Teil der Strasse vor dem Fahrzeug ausgeben
  (stelle-1).mal { schreib "_" }

  # Das Fahrzeug selbst ausgeben
  schreib fahrzeug

  # Den Teil der Strasse nach dem Fahrzeug ausgeben
  (fahrzeug_ende_rechts-stelle).mal { schreib "_" }
end

Speichere das Programm in der Datei lektion_07.rb und führe es wie üblich aus:


C:\entwicklung>ruby lektion_07.rb

Unmittelbar nach dem Programmstart sollte das Programm etwa so aussehen:

Drücke ein paar mal die R-Taste, so als ob du ein kleines R tippen möchtest. Das Fahrrad fährt nun mit jedem Tastendruck ein Zeichen weiter nach rechts. Du kannst bis zum rechten Ende der Straße fahren, dann kannst du drücken sooft du willst, es fährt nicht mehr weiter.

Drücke nun ein paar mal die L-Taste, so als ob du ein kleines L tippen möchtest. Das Fahrad fährt wieder zurück und stoppt, wenn es wieder am Ausgangspunkt angekommen ist. Du kannst die Tasten auch drücken und festhalten – so fährt es schneller.

Wenn du keine Lust mehr hast, drücke die X-Taste, so als ob du ein kleines X tippen möchtest.

Probiere andere Fahrzeuge aus! Nimm dazu einfach ein paar andere Zeichen, die sich über die Tastatur eingeben lassen und irgendwie wie ein Fahrzeug aussehen. Zum Beispiel könnte das hier: .[__].h. ein LKW sein, der gerade nichts geladen hat. Das Fahrzeug sollte nur nicht länger sein, als die Straße.

Wie es funktioniert

Der Clou mit dem Fahrzeug ist, dass wir es geschafft haben, die letzte Zeile immer wieder an derselben Stelle auszugeben. Bei jeder Ausgabe wird die vorherige Ausgabe überschrieben. Dadurch entsteht der Eindruck, dass sich das Fahrzeug bewegt. Der Trick ist die Zeile


  ...
  # Zeile löschen, d.h. wieder vorne mit der Ausgabe anfangen 
  schreib "\r" 
  ...

in der wir eine komische Zeichenkette ausgeben. Sie besteht aus einem Backslash und einem kleinen R. Wie du gelernt hast (ich glaube es war in Lektion 2), bedeutet der Backslash, dass das Zeichen danach eine besondere Bedeutung hat. Daher wird mit dem Befehl schreib "\r" nicht ein kleines r auf der Kommandozeile der DOS-Box ausgeben, sondern es passiert folgendes: die DOS-Box setzt den Cursor in derselben Zeile auf den Anfang zurück, ohne die bisherige Ausgabe in dieser Zeile zu löschen! Das kleine r steht nämlich für carriage return, zu Deutsch: Wagenrücklauf. Der Begriff stammt noch aus Zeiten der mechanischen Schreibmaschinen. Mama hat bestimmt noch eine auf dem Dachboden versteckt und kann sie dir irgendwann mal vorführen. Dort gibt es einen Hebel, mit dem man den Wagen (die Rolle wo das Papier eingespannt ist) nach rechts zurück schiebt, sodass man links weiterschreiben kann. Es lässt sich einstellen, ob beim Wagenrücklauf die Rolle auch gleich in die nächste Zeile gedreht wird, oder ob sie in derselben Zeile stehen bleiben soll. Für den Computer hat man einfach dieses Bild des Wagenrücklaufs übernommen. Das Zeichen dafür ist eben \r. Das Zeichen für das Drehen der Rolle in die neue Zeile ist \n, vom englischen newline (neue Zeile) abgeleitet.

Würden wird also schreib "\r\n" verwenden, würde der Wagen – ach Quatsch - der Cursor an den Anfang zurück und in die nächste Zeile springen. Das wollen wir aber nicht, daher lassen wir einfach das \n weg.

Peter und Livia

Peter: Bei mir sieht es irgendwie komisch aus. Die Straße passt gar nicht in die DOS-Box.

Livia: Dann versuche weniger Häuser (Variable anzahl_haeuser) und eine kürzere Straße (Variable strassen_laenge) zu verwenden. Du kannst aber auch deine DOS-Box vergrößern. Klicke dazu auf das Symbol in der linken oberen Ecke der DOS-Box und wähle aus dem Menü Eigenschaften, dann die Reiterkarte Layout. Im Bereich Fensterpuffergröße und Fenstergröße setzt du den Wert für die Breite beispielsweise auf den Wert 120 und klickst dann auf OK.

Peter: Das Programm ist ziemlich lang. Soll ich das etwa alles abtippen?

Livia: Wenn du Ruby wirklich erlernen möchtest – klar! Wenn du aber ein echtes Rubykid werden möchtest, schreibst du den Code der Lektion 7 zunächst sogar von Hand auf ein Schmierblatt! Es ist nämlich so: nur was uns durch das Schreiben durch die Hand geht, geht auch wirklich durch den Kopf. Du kannst den Code natürlich auch mit der Maus markieren, mit Strg-C kopieren und dann mit Strg-V in die Datei einfügen. Aber wundere dich nicht, wenn du das Programm genauso schnell wieder vergißt, sobald du deinen Computer ausschaltest.

Peter: Ich habe zu den Lektionen noch Fragen, wie kann ich die auf rubykids.de loswerden?

Livia: Hänge einfach an den Artikel der Lektion einen Kommentar an. Dazu klickst du zuerst auf die große Überschrift der Lektion und gehst dann ganz ans Ende der Seite und gibst deine Frage ein.

- Änderungen
22.09.2007, Unicodeproblem mit Umlauten

Trackbacks

Verwenden Sie den folgenden Link zur Rückverlinkung von Ihrer eigenen Seite:
http://www.rubykids.de/trackbacks?month=04&year=2007&article_id=lektion07&day=10

Meine Nachricht

Einen Kommentar hinterlassen

  1. info@axes24.com 3 months later:
    bei der ausführung der code erhalte ich die meldung dass metode länge im zeile 15 nicht defenirt ist :(
  2. Frithjof 3 months later:
    Sofern require 'rubykids' am Anfang des Programms steht, könnte es noch daran liegen, dass du entweder beim Ausführen des Programms den Parameter -Ku an der Kommandozeile vergessen hast, oder die Datei im Unicode Format abgespeichert ist.
Comments