RGSS für Anfänger/Schleife
| {{{TITEL}}} {{{LEVEL}}} | |
|---|---|
| Thematik | {{{THEMA}}} |
| Vorraussetzungen | Programme: {{{TOOL}}} Fähigkeiten: {{{VOR}}} |
Inhaltsverzeichnis
Schleife
Nehmen wir mal an, ich möchte 50 Zufallszahlen zwischen 1 und 250 in einem Array speichern. Dazu könnte ich natürlich 50 mal arr1[n] = rand(250) schreiben, aber die Mühe macht sich ja keiner. Dazu haben ein paar Checkerpansen die Schleifen erfunden. Eine Schleife tut etwas immer und immer wieder. In Ruby gibt es drei Arten von Schleifen. Die for-Schleife, die while-Schleife und die loop-Schleife.
Loop
Loop vergessen wir gleich mal wieder, da es einfach nur ekelig ist, das zu verwenden. Wer Java kann, der wird wissen, daß niemand dort mit label und goto arbeitet. Und ähnlich verhält es sich in Ruby mit loop. Der Vollständigkeit halber schreibe ich es aber dennoch dazu. (Fast nur wichtig in Scene.)
loop do p "foo" end
Diese Schleife würde immer und immer wiederholt. Sie hat kein Ende. Ich empfehle übrigens nicht, das Ding in den RMXP einzugeben, denn das könnte euren PC abschießen. Um einen loop zu beenden, wird break if benutzt.
a = 1 loop do p "foo" a += 1 break if a > 5 end
In jedem Durchlauf wird break if abgefragt. Wenn Variable a jetzt größer als 5 ist, dann wird der loop gebrochen. Also wird fünfmal foo ausgegeben, dann ist Schicht im Scacht. Aber wie schon erwähnt ist loop unschön. Wir haben ja noch for und while.
for
for i in 1..5 p "foo" end
Diese Schleife macht das gleiche wie der loop oben. Rubys for-schleife ist im Gegensatz zu der von Java oder C allerdings einfach nur ein wenig seltsam. Die Syntax muß man erstmal auf sich wirken lassen. Es funktioniert so:
for <laufvariable> in <startwert>...<endwert>.
Hier wird also i am Anfang der Schleife mit 1 besetzt, dann wird foo ausgegeben, dann wird i um einen hochgezählt, wieder foo ausgegeben ... und das endet, wenn i = 5 ist.
Mit der for-Schleie kann man wunderbar Arrays verarbeiten:
array = [1,2,2,true,"Baum"] for i in array p i end
While
Die dritte und meiner Meinung nach schönste Möglichkeit ist while.
i = 1 while i <= 5 p "foo" i += 1 end
Auch hier wird fünfmal foo ausgegeben. Da die Bedingung hier eine Laufbedingung ist, also die Schleife läuft, während sie zutrifft (anders als bei loop, wo es eine Abbruchbedingung war), muß hier i <= 5 stehen. Würden wir i < 5 schreiben, würde nur viermal foo ausgegeben werden. Alternativ können wir i auch mit dem Wert 0 starten lassen und 5 nehmen. So mache ich es für gewöhnlich.
Beispiel
Aber kommen wir zurück zu umserem Beispiel mit den 50 Zufallszahlen im Array. Dazu benutzen wir ebenfalls eine while-Schleife.
While
i = 0 zahlen = [] while i < 50 zahlen[i] = rand(251) i += 1 end p zahlen p zahlen.length
Gehen wir den Code mal von oben bis unten durch. Zunächst geben wir i den Startwert 0. Dann definieren wir ein leeres Array. Wenn wir ein leeres Array machen, heißt das, daß wir es später einzeln füllen möchten. Dann kommt die while-Schleife, die solange läuft, wie i kleiner als 50 ist. Da i mit 0 beginnt heißt das also, sie läuft 50 mal durch. Dann wird dem Array an der Stelle mit dem index i eine Zufallszahl zwischen 0 und 250 zugewiesen. Die rand() Funktion ist bei Ruby gleich mit dabei. Bei ihr muß man beachten, daß die Zahl in den Klammern nicht mitgenommen wird, sondern das quasi die höchstmögliche Zahl + 1 ist. Schließlich erhöhen wir i um 1 und beenden die Schleife. Wenn sie durchgelaufen ist, geben wir das Array aus und danach dessen Länge um zu sehen, ob's auch echt 50 sind. Und wir sehen eine Reihe von 50 zufälligen Zahlen. Das ganze kann auch mit einer for- und einer loop-Schleife gemacht werden. Ich finde beide Lösungen nicht sehr gut, aber ich werde sie dennoch mal hier hinschreiben, falls jemand das bevorzugen sollte.
# Das ganze Gedöns mit for zahlen = [] for i in 0...50 #Bei 3 Punkten wird der letze Wert nicht mitberechnet in der Schleife. zahlen[i] = rand(251) end p zahlen p zahlen.length
# Und mit dem ekeligen loop-Dings zahlen = [] i = 0 loop do zahlen[i] = rand(251) i += 1 break if i > 49 end p zahlen p zahlen.length