collapse collapse

 Community


 User Info




Willkommen Gast. Bitte einloggen oder registrieren.

 Partnerseiten

rpgvx.net

Das Forum ist offline

Autor Thema: FlipelyFlip's Scripting Tutorial 2 - "for..in.."-Schleifen  (Gelesen 1204 mal)

Offline FlipelyFlip

  • Will sein Alter nicht verraten xD
  • Administrator
  • VX-Großmeister
  • ****
  • Beiträge: 884
  • Heyho (=
    • Flips Musik Kariere auf Facebook xD
heyey

Weitere Script-Tutorials von mir
FlipelyFlip's Scripting Tutorial 1 - Grundkurs
FlipelyFlip's Scripting Tutorial 2 - "for..in.."-Schleifen

Vorwort

Heute sind wir wieder alle froh, denn es geht weiter mit dem Script-Tutorial (:

Scripting Lesson 1: for .. in .. Schleife

Jetzt kommen wir zu etwas, was in der Scriptwelt recht geläufig ist. Die "for .. in .."-Schleife.
Diese finden wir nahezu überall in den Standardscripts wenn wir aufmerksam danach suchen. Was bewirkt jedoch dieses kleine etwas?

Ganz einfach. Nehmen wir mal einen Apfelbaum. Auf dem Apfelbaum sind zum Beispiel 120 Äpfel oben, jedoch weiß nur der Apfelbauer, in welchen Äpfel die Würmer sind. Jetzt wollen wir aber auch noch wissen, wo die Würmer alle drinnen sind, damit wir ja nicht so einen Apfel zum essen bekommen. Klingt doch logisch, dass wir den Bauern fragen, ob er es uns verrät. Das einzige was er sagt:

for wurm_in_apfel in 1..Äpfel_am_Baum
  if wurm_enthalten.include?(wurm_in_apfel)
    p "Der hat'n Wurm"
  else
    p "Der hat keinen Wurm"
  end
end

Er wird uns nun genau sagen, in welchem Apfel der Wurm drin ist und in welchem nicht, ist doch nicht schlecht oder?
Aber ihr habt nun bestimmt 2 weitere kleine Fragen an mich. Ich kann mir auch schon denken welche :D

erste Frage:
1..Äpfel_am_BaumWieso wurde das hier verwendet und wofür sind die 2 Punkte?

Nehmen wir es mal so her:
Äpfel_am_Baum = 120jetzt hat der Apfelbaum genau 120 Äpfel am Baum. Der Grund warum ich nun "1..Äpfel_am_Baum" geschrieben habe, ist der, dass wir ja wissen wollen in welchen Äpfeln der Wurm drin haust, nicht ob im 120sten Apfel der Wurm drinnen ist.
Die ".." bedeuten  nur, dass er von dem Wert 1 bis zu Wert 120 alle zahlen Einsetzen soll.

zweite Frage:
if wurm_enthalten.include?(wurm_in_apfel)Was bedeutet diese Zeile genau?

Naja irgendwo muss der Bauer ja auch definiert haben, wo die Würmer drinnen sind. Das hat der sich alles auf dem Block "wurm_enthalten" aufgeschrieben. Das könnte dann zum Beispiel so aussehen:
wurm_enthalten = [15, 22, 43, 88, 92, 119]Jetzt geht der Bauer aber von Apfel zu Apfel und muss dir sagen ob der Apfel nun einen Wurm hat oder nicht. Das geschieht durch den Befehl: ".include?(index)" (index wird durch bestimmte Variablen ersetzt, wie bei uns im Beispiel durch wurm_in_apfel).

Scripting Lesson 2: Erstellen eines Arrays

Sodale, jetzt wissen wir also was der Bauer alles weiß und er wird uns auch bei jedem Apfel sagen ob da ein Wurm drin is oder nicht. Jedoch werden wir aber nicht wirklich sagen Können ob das nun der Apfel 112 war oder der Apfel 55. Da wir ja recht faul zum Zählen sind, soll er uns doch einfach nur die Äpfel angeben, die nen Wurm haben und die Äpfel die keinen Wurm haben. Doch wie gehen wir da am besten vor?

Ganz einfach. wir nehmen unser Standardgerüst von vorher wieder her und erweitern es um die paar Dinge die wir oben besprochen haben.

Äpfel_am_Baum = 120
wurm_enthalten = [15, 22, 43, 88, 92, 119]

for wurm_in_apfel in 1..Äpfel_am_Baum
  if wurm_enthalten.include?(wurm_in_apfel)
    p "Der hat'n Wurm"
  else
    p "Der hat keinen Wurm"
  end
end

Nun wenn wir das Ablaufen lassen würden, würden wir 120 mal ein Fenster erhalten in dem entweder "Der hat'n Wurm" oder "Der hat keinen Wurm" enthaltet.

Aber wir wollen ja nicht mitzählen wie oft das auftaucht, sondern wollen wissen, welche Äpfel denn nun genau einen Wurm drin haben.

Holen wir uns mal etwas Hilfe. Wir müssen zwei leere Arrays erstellen. Den ersten nennen wir mal einfach wurmapfel und den zweiten keinwurm.

dann sieht es ja wohl so aus:
Äpfel_am_Baum = 120
wurm_enthalten = [15, 22, 43, 88, 92, 119]
wurmapfel = []
keinwurm = []

for wurm_in_apfel in 1..Äpfel_am_Baum
  if wurm_enthalten.include?(wurm_in_apfel)
    p "Der hat'n Wurm"
  else
    p "Der hat keinen Wurm"
  end
end

Das war nun der erste Schritt den wir machen. Nun brauchen wir eine Variable die langsam hoch zählt, damit wir auch den genauen index des Apfels wissen. Diese Variable muss aber vor der "for.. in .."-Schleife liegen, da wir unsere Werte sonst nur überschreiben würden, aber das wollen wir ja nicht (:

Wir erweitern den Code mal um diese Variable und entfernen die blöden Aussagen des Bauern.
Äpfel_am_Baum = 120
wurm_enthalten = [15, 22, 43, 88, 92, 119]
wurmapfel = []
keinwurm = []

index = 0
for wurm_in_apfel in 1..Äpfel_am_Baum
  if wurm_enthalten.include?(wurm_in_apfel)
   
  else
   
  end
end

damit wir aber bei jedem Apfel einen anderen Indexwert haben, müssen wir den doch hochzählen. Wir wollen ja nix überschreiben. Ich glaube wir packen es am besten unter die "for..in.."-Schleife. Da ist es gut aufgehoben.
Äpfel_am_Baum = 120
wurm_enthalten = [15, 22, 43, 88, 92, 119]
wurmapfel = []
keinwurm = []

index = 0
for wurm_in_apfel in 1..Äpfel_am_Baum
  index += 1
  if wurm_enthalten.include?(wurm_in_apfel)
   
  else
   
  end
end
Was haben wir den da gemacht? D:
Richtig, wir zählen nun die Variable index langsam hoch. Bei jedem Durchlauf, zählt er um 1 weiter. Damit wir auch davon einen Nutzen haben, werde ich die ultimative Hilfe einschalten. Die Makerhilfe!

Scripting Lession 3: Die Makerhilfe

Für viele ist sie total nutzlos. So auch für mich. Anfangs jedoch ;)
Als ich scripten lernte, wurde mir bewusst, dass die Makerhilfe doch sehr hilfreich sein kann, wenn man viele Dinge nicht weiß wie sie im Script funktionieren, oder bestimmte Scriptbefehle sucht. Vor allem hat die Hilfe meistens auch noch schöne Beispiele parat um zu zeigen wie die einzelnen Dinge richtig funktionieren. Ich sehe große Vorteile darin und empfehle euch wärmstens beim Scripten auch mit der Makerhilfe zu arbeiten. Sie ermöglicht euch ein schnelleres lernen von RGSS und beschert euch auch schneller Erfolgsgefühle als über den harten Weg alles zu versuchen bis man verzweifelt aufgibt, weil einem keiner helfen kann.

Aber nun zurück zu unserem eigentlichen Thema. Wir wollen doch wissen, wie wir einen Array um Werte erweitern, obwohl der Array leer ist. Wenn wir im Maker F1 drücken, erscheint die Hilfe rasch und wir gehen auf den Tab Index. Siehe da, an erster Stelle haben wir Arrays. Wir wählen diesen Punkt aus und lesen uns etwas durch, bis wir das Richtige gefunden haben. Englischkenntnisse sind von Vorteil :D

Kurze erklärung zu manchen begriffen aus der Hilfe auf die ihr stoßen werdet:
self = Name des Array/Hash/Moduls
other = Anderer Name eines Arrays/Hashs
nth = Wert/Index
val = Wert
start = An diesem Element/Wert soll begonnen werden
length = Länge (wird aber so gut wie nie benutzt beim Array, nicht zu verwechseln mit der Auflistungsart .length bei Arrays!!)
pos = Die Position bzw. Index des Wertes oder Elements des Arrays
obj = Objekt, bzw selbige wie val

So nun haben wir hoffentlich das richtige gefunden was wir brauchen oder?
Dann reicht es doch nurnoch, wenn ich euch sage, dass der Wert index, den wir schön brav hochzählen in eine eckige Klammer muss (:
Gut, dann können wir ja weiter machen mit der nächsten Lesson :D

Scripting Lesson 4: Letzte Anpassungen

Thehe, hier werde ich euch genauso viel bringen wie beim Punkto 3. Ich sag was ihr machen müsst und verate euch auch wohin damit, aber ich werde euch nicht verraten wie die funktion dafür heißt. Wozu habt ihr denn die Makerhilfe?

Wenn wir uns nun am ende des Ablaufs die beiden arrays "wurmapfel" und "keinwurm" ausgeben lassen, haben wir bei beiden das tolle Wörtchen "nil" dabei. Das wollen wir nun weg machen, da der Bauer uns ja sagt in welchen der Wurm drin ist und in welchen nicht. Der sagt nicht: "In 1 ist kein Wurm drin, in nil ist ein Wurm drin". Ihr versteht doch was ich meine ;)

Da gibt es eine hübsche Methode dafür. Die steht auch schön in der Makerhilfe beschrieben, einfach überfliegen hilft da sogar schon (:

Was ich euch noch als kleinen Tipp gebe, überall wo kein self steht wird wie folgt gearbeitet:
arrayname.methode
Merkt euch das. Der Punkt zwischen den Namen ist sehr wichtig, aber keine Sorge, man zeigt es auch immer im kleinen weißen Fensterchen bei den Punkten vor wie es funktioniert und wie es sich verhält (:

Sobald ihr das habt, könnt ihr den Maker starten und gucken was ihr als Ergebnis erhalten habt.
Wenn ihr damit fertig seid, könnt ihr mir gern eine PN schreiben mit eurer Lösung (:

Bei Fragen steh ich euch gern zur Verfügung (:

Wenn man die Aufgabe richtig gelöst hat und das meiste selbst gemacht hat, dann kann man sich sicher sein, dass man diese "for..in.."-Schleifen versteht und auch später in größeren Scripts anwenden kann (:

lg flip

Re: FlipelyFlip's Scripting Tutorial 2 - "for..in.."-Schleifen

Offline Boogatie Roll

  • VX-Meister
  • ****
  • Beiträge: 676
  • Java[Spiele] Programmierer
    • BRolls Game Website
Re: FlipelyFlip's Scripting Tutorial 2 - "for..in.."-Schleifen
« Antwort #1 am: Mai 28, 2012, 13:48:57 »
Sieht ganz logisch aus, bloß finde ich die for Schleife im Vergleich zu anderen Programmiersprachen hier ein bisschen Umständlich? Normalerweise ist es ja einfach for(start , solange/bis  , schrittweite  ).
Finde mit dem for..in hat man nicht alle Möglichkeiten, falls ich das richtig verstanden habe.
Den EndIndex konntest du jangeben, aber was machst du wenn man den Baum vom 20sten bis zum 120 apfel und nur jeden 3ten apfel abfragen will. (geht das bei RGSS?)
Ansonsten interessiert es mich wies mit den anderen Schleifentypen aussieht: zb. while, do ... normalerweisse braucht man diese nicht, aber soll schon mal vorkommen :D

Noch ne Frage hab ich zur variablendeklarierung:
Äpfel_am_Baum = 120
wurm_enthalten = [15, 22, 43, 88, 92, 119]

Wie funktioniert dass mit dem Datentyp? Stellt der Maker den Datentyp passend zu den Startparametern für diese Variable ein, oder gibt es nur gesamtfassende Datentypen für jede Variable (zb dann nur double und String). Bei deinen Äpfeln und Würmern wären ja beides integer bzw. bytes in den meisten Programmiersprachen. Scheint hier aber nicht wichtig zu sein?

Jop das waren meine Fragen erstmal.

Re: FlipelyFlip's Scripting Tutorial 2 - "for..in.."-Schleifen

Offline FlipelyFlip

  • Will sein Alter nicht verraten xD
  • Administrator
  • VX-Großmeister
  • ****
  • Beiträge: 884
  • Heyho (=
    • Flips Musik Kariere auf Facebook xD
Re: FlipelyFlip's Scripting Tutorial 2 - "for..in.."-Schleifen
« Antwort #2 am: Mai 28, 2012, 14:14:25 »
heyey,

ich bau mein Tutorial eigentlich darauf auf, die Grundtypen zuerst zu lernen, bevor es an ein richtiges Script geht. Daher kommt auch zuerst das alles vor, was man noch häufig verwendet. Ich werd aber auch die while, do Schleife behandeln, wenn die das erste Mal in einem Script aufkreuzen würde, also da brauchst dir keine Sorgen machen (:

Den Startindex kann man natürlich auch definieren, nur hab ich das bis jetzt nicht wirklich wo gefunden, da meist entweder bei 0 ode 1 begonnen wurde. Um aber von nem beliebigen Punkt aus zu starten müsste man seine Variable einfach nur definiern und dann die "for..in.."-Schleife so aussehn lassen:
Äpfel_am_Baum = 120
start_apfel = 20
for wurm_in_apfel in start_apfel..Äpfel_am_Baum

Soviel ich weiß (und da bin ich mir nicht mal zu 100% sicher) wird es als Integer gespeichert, aber wie schon erwähnt, bin mir da nicht sicher. Da kann ich dir aber gern mal nachfragen (:

Theoretisch könnte man selbst mit RGSS jeden dritten Apfel abfragen, jedoch müsste man dafür die "loop do"-Schleife verwenden, da man mit der "for..in.."-Schleife soetwas nicht machen kann, bzw. mir nicht bekannt ist (:

lg flip

 


 Bild des Monats

rooftop party

Views: 3581
By: papilion

 Umfrage

  • Wer soll das BdM gewinnen?
  • Dot Kandidat 1
  • 3 (25%)
  • Dot Kandidat 2
  • 1 (8%)
  • Dot Kandidat 3
  • 2 (16%)
  • Dot Kandidat 4
  • 0 (0%)
  • Dot Kandidat 5
  • 6 (50%)
  • Stimmen insgesamt: 12
  • View Topic

 Schnellsuche





SimplePortal 2.3.3 © 2008-2010, SimplePortal