RGSS für Dummköpfe/Arrays und Hashes

Aus Scientia
Version vom 27. Februar 2011, 10:18 Uhr von Alexis Hiemis (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
RGSS für Dummköpfe Schwierigkeitsgrad Stern.png
Autor Max Jet
Thematik RGSS
Vorraussetzungen Programme: keine

Fähigkeiten: keine

Andere Teile

Einleitung

Ein Container ist ein Objekt, dass andere Objekte enthält. Eine Schatztruhe zum Beispiel ist ein Container für einen Schatz, eine Kuh ein Container für Milch usw. Beim Programmieren wirst du mehrere Variablen brauchen und sie in Container zu platzieren könnte den Umgang mit ihnen drastisch vereinfachen. Die meisten Container sind entweder Reihen, so genannte “arrays“ oder „hashes“. Methoden sind Code Blöcke, die du aufrufst. Du weist eine Methode an etwas für dich zu tun, die Methode leistet dem Folge und gibt sogar etwas an dich zurück. Klar macht das alles wenig Sinn, aber das ist nur eine Einleitung.

Arrays (Reihen)

Im ersten Tutorial habe ich über eine Stadt voller John Smiths gesprochen. Jeder führte den gleichen Namen, was große Probleme ergab. Schließlich jedoch hatte der Bürgermeister John Smith die brillante Idee jedem eine Nummer zu verpassen. Also bekam jeder ein Schild mit seiner jeweiligen Nummer angepinnt, John Smith[0], John Smith[1], John Smith[300], etc. Dadurch ergab sich, dass trotz des gleichen Namens ein jeder Bürger seinen eigenen Index erhielt. Es ist nützlich Items nach Gebrauch zu sortieren; beim Programmieren wirst du unzählige Werte in vielen Variablen speichern müssen. Vielleicht brauchst du eine Variable für jedes Item, dass deine Party besitzt?

Leider gibt es da zwei größere Probleme. Zuerst einmal müsstest du in etwa hunderte verschiedene Variablen anlegen, abhängig vom Spiel, und dann würde jede Variable einen eigenen Namen und eine eigene Einleitung brauchen. Zweitens könnte man leicht den Überblick verlieren, weil es sich bei all den Variablen nicht wirklich um eine Gruppe handelt. Du kannst weder eine Sache stellvertretend für alle Variablen vornehmen, noch sie richtig durchsuchen. Man! Solch ein simples System zu erstellen würde ewig dauern!

Mach dir trotzdem keine Sorgen, denn “arrays” sind dazu da die Dinge zu erleichtern. Ein Zahlenfeld ist ein Container für Variablen, von denen alle den gleichen Namen tragen, jedoch eine unterschiedliche Nummer, genannt Index. Sobald du einen Namen mit einem Index versehen hast, kannst du ein Element eines “arrays” behandeln, wie eine eigenständige Variabel. Eine Reihe, also ein „array“, selbst wird als Variable gewertet, enthält jedoch unterschiedliche Werte. Genug mit den Worten, es folgt ein Beispiel!

x = 13 
arr = ['Alex ist ziemlich dumm', 0, x] 
p arr[0] 
p arr[2]

Dieses Beispiel würde "Alex ist ziemlich dumm" und 13 ergeben. Zuerst erschaffen wir eine neue Variable, genannt x und speichern den Wert 13 darin, anschließend schaffen wir ein „array“ mit 3 Elementen 'Alex ist ziemlich dumm', 0 und x (13). Dann zeigen wir das erste und dritte Element des “arrays” an. Easy, oder? Ein paar Dinge solltest du aber trotzdem bedenken.

array = [element1, element2, ...., elementN] 

Wenn du nichts zwischen die eckigen Klammern setzt (also nur [ ] schreibst), erschaffst du ein leeres „array“. Doch merke, dass du stets etwas einem “array” hinzufügen kannst, aber das besprechen wir in einem spätern Tutorial. Außerdem kann ein “array” jegliche Anzahl von Elementen beinhalten, von denen diese auch noch von jedem Typ sein können (auch wenn sie trotzdem meistens vom selben sind). (Anm. von Max Jet: Alle Variablen, zu denen du anhand der abgefertigten Kommandos zugriff hast, befinden sich komischerweise in einem Array und noch irritierender ist, dass die Reihe maximal 5000 Elemente haben kann.) Ebenso solltest du wissen, wie man sich an Elemente wendet.

array_name[index] 

Index kann ein Wert zwischen 0 und der Anzahl an Elementen im „array“ – 1 sein. Das ist wichtig. “Arrays” Elemente starten mit 0, also lautet das erste Element von “arr”, arr[0], das letzte Element in unserem Beispiel ist dann arr[2] in einem „array“ mit drei Elementen. Nun ist arr[2] auch das zweite Element. Das tolle an “arrays” ist, dass du Tonnen von Werten in einer Variable ablegen kannst. Du kannst alle Items in einem “array” einfügen und sich aller Items bedienen, indem du ihren Index verwendest. Die “array class” verschafft dir ebenfalls viele Methoden um mit Reihen umzugehen, denn du kannst Elemente hinzufügen, sie entfernen, sie sortieren, oder gleichzeitig Aktionen mit allen von ihnen durchführen. Um dir zu verdeutlichen, wie wichtig „Arrays“ sind kannst du im RMXP default Script nachsehen. RMXP erschafft “arrays” für die Elemente aus der Datenbank. Zum Beispiel gibt es ein Item “array”, Ein “array” für Waffen, für den Helden usw. Du kannst dir diese „Arrays“ zugänglich machen um Informationen aus der Datenbank zu beziehen. So zum Beispiel funktioniert das Item Menu. Zuerst wird ein “for loop“ verwendet um alle Items aus der Database zu iterieren (Gleich siehst du wie) und dann wird abgecheckt, ob die Party wenigstens ein Item dieser Sorte besitzt. Ist dem so, wird es auf dem Bildschirm angezeigt, etwa wie:

for item in $data_items 
  if $game_party.item_num(item) > 0 
    # Item anzeigen 
  end 
end

Du kannst versuchen diesen Code als einen Befehlsscript zu verwenden, indem du ihn im entsprechenden Feld einfügst. Außerdem kannst du # Item anzeigen durch etwas, wie “print 'Die Party hat ein ' + Name des Items“ ersetzen.

Mach dir keine Sorgen um das seltsame Zeug, welches in diesem Beispiel (“loops“, Zahlenfelder, irgendetwas…) erwähnt wird, ich wollte dir einfach ein kleines Übungsbeispiel zeigen, welches dir „arrays“ zum besseren Gebrauch erklärt.

Wenn es immer noch kompliziert klingt, stell dir “arrays“ al seine Liste voller Variablen vor. Auf Variablen beziehst du dich mittels ihres Indexes, eher nicht durch ihren Namen. Du kannst immer wieder Items hinzufügen, oder entfernen und du kannst mit jeden einzelnen durch ein paar Zeilen operieren.

# for loop: 
for var in array_name 
  mach etwas mit var 
end

Ein “for loop” zu nutzen um durch die Elemente eines “Arrays” zu iterieren ist ein Kinderspiel. Var könnte ein Name sein, den du ausgewählt hast um ein gegenwärtiges Element zu repräsentieren und array_name ist der Name der Reihe. Das „for“ würde durch jedes Element iterieren (beginnend mit 0) und ein Element würde durch jede Iteration fokussieren, am Anfang der Schleife, des “loops“ also. Var würde den Wert von array_name[0] enthalten (das erste Element des „arrays“) und in der nächsten Iteration würde er den Wert von array_name[1] enthalten. Dazu ein Beispiel: (Anm. von Max Jet: Der „for loop“ greift sich sozusagen die Elemente, also einzelne Variablen einer Reihe aus, die du bestimmen kannst, oder auch nicht, so dass alle benutzt werden und führt dann einen Befehl damit aus.)

numberz = [1, 2, 3, 4] 
for c in numberz 
  p c * c 
end

Das Ergebnis würde lauten (1, 4, 9, 16). Das sind die Quadrate der Elemente dieser Reihe. Was ist passiert? Der print Befehl würde 4mal ausgeführt werden (die Größe der Reihe), jedes mal wird die Variable c ein Element des „arrays“ halten. Zuerst hält es das erste Element fest und multipliziert mit sich selbst, dann macht es das gleiche für den Wert zwei, was 4 ergibt usw. usf. War das zu kompliziert? Hier ist noch ein Beispiel:

Namen = ['Alex', 'Joe', 'Tom', 'Bob', 'James'] 
for wasauchimmer in Namen 
  p wasauchimmer 
end

Dieses Beispiel zeigt einfach alle Namen an, also alle Elemente des „arrays“, beginnend mit Alex und endend mit James. Ich glaube nicht, dass “wasauchimmer” ein guter Name für eine “for Variable” ist, aber generell ist es eine gute Idee Kürzel zu benutzen. Du kannst einen Namen benutzen, welcher das Element deiner Variable reflektiert (wie zum Beispiel 'Alex' in diesem Beispiel, oder 'item' in dem anderen Beispiel), weil das „for loop“ hier mehr Sinn macht.

Es gibt noch einen anderen Weg durch die Elemente eines “arrays” zu iterieren, denn du kannst das Zahlenfeld auch als eine Ansammlung von Indexes betrachten, von 0 bis zur eigentlichen Größe -1. Etwa wie das hier.

arr = ['woooo', 1, 250, 'Man du müsstest echt mehr Fleisch essen', -2.8, false, 'Was hast du erwartet? '] 
for i in 0..arr.size - 1 
  p arr[i] 
end

In diesem Fall wird die Variable, die dem “For” folgt als Index verwendet (schließlich geht es von 0 bis arr.size - 1) und zudem noch als Variablen Name. Wegen dem arr.size Ding. Eine Reihe ist eigentlich ein Objekt und das sind coole Sachen, die dein Leben leichter machen. Objekte haben Zugehörigkeiten und Aktionen (Variablen und Methoden), also wenn du ein Objekt namens Hero hast, könnte es eine Eigenschaft, genannt Name besitzen, die dir den Namen des Helden verrät. Um es aufzurufen, tippst du hero.name ein. Verstehst du es nicht? Vergiss es. Behalte nur im Gedächtnis, dass array.size die Anzahl von Elementen in einem Array wiedergibt. Alles wird einfacher werden, wenn wir im nächsten Tutorial die Welt des Objekt orientierten Programmierens kennen lernen. Welche Form wird gebraucht? Nun die zweite Form erfordert mehr Tipparbeit, aber es gibt zwei Vorteile dabei.

  1. Du kannst die gegenüber liegende Variable nutzen (nach dem “for”) um die Nummer der gegenwärtigen Iteration zu gebrauchen, was manchmal nützlich sein kann. Das gleiche kannst du in der ersten Form auch machen, indem du eine Variable nutzt, die du manuell vergrößerst, aber so effizient, wie in der zweiten Form (0..array.size - 1).
  2. Du musst allerdings keine Schleife durch die ganze Reihe ziehen, du kannst den Startwert und den Endwert dieser Gruppe variieren, wie es dir beliebt. Wenn du allerdings eine Schleife vom zweiten bis zum vierten Element brauchst, könntest du folgendes anwenden:
for i in 1…3 
  1. Mehr fällt mir nicht ein.

Also nutze was auch immer dir gefällt. Also wenn du eine Schleife durch einen Teil deiner Reihe ziehst, oder die Anzahl deiner iterationen festhalten willst, benutze die zweite Form.

“Hashes“

”Arrays” gebrauchen für ihren Index Zahlen, arr[0] beispielsweise stellt das erste Element in „arr“ dar und arr[size - 1] stellt das letzte dar. Das ist zwar gut, aber es gibt Momente, wenn du Variablen unter einen Namen gruppieren musst und dennoch meinst, dass die Zahl im Index nichts mit dem eigentlichen Wert zu tun hat. In einer Liste sollte man besser den Index durch eine Zahl anzeigen, dann siehst du nämlich sofort, das das erste Item in einer Liste den Index 0 hat, das zweite 1 usw. Leider werden die Dinge nicht immer auf Zahlen bezogen. Sagen wir einmal du hast eine Gruppe fliegender Affen und du willst ein “Array“ haben um ihr Alter zu speichern (Oh mein Gott ist das ein sinnloses Beispiel!!).

meine_Tierchen = [3, 6, 10, 5] 
p meine_Tierchen[1] 
p meine_Tierchen[3]

Angezeigt würden die Zahlen 6 und 5. Problematisch ist da nur, dass du die Nummer deines Haustieres wissen müsstest um ihr Alter zu erfahren, aber in der Realität würdest du dich auch nicht mittels einer Zahl an das Tier wenden. Namen kämen da wohl besser, was?

p meine_Tierchen['Stalin'] 
p meine_Tierchen['Castro'] 
p meine_Tierchen['Bush']

Mit so einem „array“ könnten wir ganz leicht das Alter von Bush erfahren (Den Affen, nicht den Idioten!). Dafür sind “hashes” gedacht, denn das sind im Grunde genommen nichts anderes, als Behälter für Schlüssel und Paare von Werten. Ein Schlüssel wird gebraucht um den Wert zu erreichen, genau wie ein Index in einer Reihe, einem „Array“. Das coole daran ist, das der Schlüssel ein Objekt sein könnte. Er könnte ein “string” sein, wie im vorherigen Beispiel, oder eine Zahl, oder gar ein boolean’scher Wert. “Hashes” sind den Reihen, “Arrays” recht ähnlich, aber anstatt Elemente in eckigen Klammern hervorzuheben, tust du das mittels dieser Klammern { }. Jedes Element ist ein Schlüssel und Werte Paar, wie das: Schlüssel=>Wert. Dieses Beispiel erzeugt einen “Hash”. (Anm. von Max Jet: MAN! Seid froh, dass ich „hash“ nicht übersetzt habe! Glaubt mir!)

teh_hash = { 'Muh'=>'Kuh', 5 => 'fünf', true => 1, 0.8 => false } 
p teh_hash['Muh'] # Anzeige Kuh 
p teh_hash[0.8] # false 
p teh_hash[true] # 1 
p teh_hash[5] # 'fünf'

Um einen leeren “Hash” zu benennen, nutzt du diese leeren Klammern { }. Schlüssel müssen einzigartig sein, oder du verwirrst den Bearbeiter. Der Name darf nicht derselbe sein!

for loop, WIEDER

Bei “Hashes” kannst du den for loop ebenfalls verwenden, aber das ist ein bisschen anders. Du kannst durch die Schlüssel, oder Werte iterieren.

hash = { 'Schlüssel1' => 'Wert1', 'Wert2' => 'Wert2', 'Wert3' => 'Wert3' } 
for dummer_schlüssel in hash.keys 
  p dummer_Schlüssel 
end 
for lahmer_wert in hash.values 
  p lahmer_wert 
end

Die erste Schleife wird durch alle Schlüssel (keys) iterieren und die Variable dummer_Schlüssel wird den Wert eines Schlüssel bei jedem mal halten. Schließlich werden die Schlüssel angezeigt, was 'key1', 'key2', 'key3' ergibt. Denk daran, dass wir hash.keys nach dem 'in' im “for loop” benutzen. Du musst ein bisschen genauer werden, wenn du eine schleife durch keys und Werte ziehen willst, also musst du .keys dem Namen des “hash“ hinzufügen, wenn du durch Schlüssel wiederholen möchtest und .values, wenn du durch Werte wiederholen möchtest. Im zweiten Fall zeihen wir eine Schleife durch jeden Wert um die Eingabe 'value1', 'value2' und 'value3' zu erhalten.

Schlussfolgerung

Container sind Objekte, die andere enthalten, so wie eine Box mit Items. Du kannst die einzelnen Elemente dieser Box aufgreifen, indem du einen Wert benutzt, genannt Index. ”Arrays“ sind Container mit einer Liste von Elementen, dessen Nummer mit 0 startet und bis zu der Gesamtanzahl -1 verläuft. Einzelne Elemente werden anhand ihres Indexes herausgegriffen. Ein “for loop“ wird benutzt um durch die Element einer Reihe zu iterieren. „Hash” schnuppft man nicht, sondern es ist eine andere Form von Container mit beliebigen Index. Auch dort kannst du den „for loop“ anwenden.

Zusammenfassung

  • Ein “array” ist ein Container, welcher mehrere Werte enthalten kann. Um einzellne Elemente herauszugreifen wird jeweils ein Index angefügt.
  • Der Index einer Reihe, eines “arrays”, reicht von 0 bis zu der Größe des “arrays” - 1 (array.size - 1)
  • Ein “for loop” iteriert”, also wiederholt, durch die einzelnen Elemente.
  • Ein “hash” ist ebenfalls eine Form von Container, doch brauchst du um eine Element heraus zu greifen einen einzigartigen Schlüssel, genannt “key”.
  • Ein “hash” Schlüssel, oder “key” ist ein beliebiges Objekt.
  • Um durch „hash keys”, oder values zu iterieren, benötigst du ebenfalls den for loop.