Lektion 5
Nun, in Lektion IV habe ich euch ein Beispiel gegeben, in dem eine Wenn-Dann-Verzweigung vor kam. Wie diese so genannte if()-Verzweigung funktioniert möchte ich euch heute erklären.
Eigentlich ist es ganz einfach, die if()-Struktur funktioniert schlicht nach dem Muster wenn das und das oder das zutrifft, tue dieses, sonst mache jenes.
Das Ganze müssen wir gewissermaßen nur ins Angelsächsische übersetzen um es im Aurora-Gefüge nutzen zu können. Natürlich unter Berücksichtigung der richtigen Form.
Funktionsaufbau if (() && () || ()) { } else { }
Das "if" eröffnet die Verzweigung in den direkt anschließenden runden Klammern gehört die Beschreibung dessen, was zutreffen muss, um den Teil im ersten Block auszuführen.
Der erste Block wird direkt nach den runden Klammern durch, ihr erinnert euch, geschweifte Klammern gebildet.
Danach kann ein zweiter Block folgen, welcher durch das Schlüsselwort "else" eingeleitet und wiederum mit geschweiften Klammern umschlossen wird. Dieser "sonst"-Zweig ist aber wie gesagt völlig optional. Solltet ihr ihn nicht benötigen, lasst ihn einfach weg.
Das und und das oder sind die Zeichen && und ||.
Beispiele mit 1 if (1) { } if (TRUE) { } if (5-4) { }
Der Ausdruck in den runden Klammern gilt immer dann als erfüllt, wenn er gleich eins ist. Hier seht ihr, ein paar Beispiele von erfüllten Ausdrücken.
Beispiele mit 0 if (0) { } if (FALSE) { } if (5-5) { }
Hier dementsprechend, ein paar Beispiele von nicht erfüllten Ausdrücken, also Ausdrücken die gleich null sind.
Desweiteren müsst ihr unbedingt verstehen, wie && und || funktionieren, also passt gut auf.
&& Operationen if (TRUE && TRUE) { //ist erfüllt } if (TRUE && FALSE) { //ist nicht erfüllt } if (FALSE && TRUE) { //ist nicht erfüllt } if (FALSE && FALSE) { //ist nicht erfüllt }
&& bedeutet, dass beide Ausdrücke erfüllt sein müssen, damit der gesamte Ausdruck als erfüllt gilt.
|| Operationen if (TRUE || TRUE) { //ist erfüllt } if (TRUE || FALSE) { //ist erfüllt } if (FALSE || TRUE) { //ist erfüllt } if (FALSE || FALSE) { //ist nicht erfüllt }
|| bedeutet, dass nur einer der beiden Ausdrücke erfüllt sein muss, damit der Gesamtausdruck als erfüllt gilt.
Gültige Operatoren == ist gleich != ist ungleich > größer als < kleiner als >= größer gleich <= kleiner gleich ! negiert Ausdrücke
Da ihr in den meisten Fällen zwei Werte vergleichen werden wollt, seht ihr hier eine Liste der Vergleichsoperatoren, die das "Aurora"-Gefüge versteht.
Es fällt besonders auf, dass ein Test auf Gleichheit mit zwei Gleichheitzeichen durchgeführt wird. Das liegt daran, dass ein einzelnes Gleichheitzeichen ja eine Zuweisung vornimmt. Eine solche Zuweisung liefert, wenn sie gelingt TRUE, wenn sie fehl schlägt FALSE zurück. Das kann man gelegentlich mit viel Gehirnschmalz ausnutzen, ist aber in jedem Falle eine riskante Vorgehensweise.
Bitte beachtet, dass die Negation von gleich, also ungleich, != geschrieben wird und nicht !==.
Nun werde ich euch natürlich noch ein Beispiel dazu geben, um sicher zu gehen, dass ihr das auch richtig versteht.
Nehmen wir also an, ihr wollt eine kleine Bodenplatte mit einer intelligenten Falle versehen, die nur dann ausgelöst wird, wenn ein Fremder der Gesinnung Gut oder Böse auf sie tritt. Ihr erstellt also einen Trigger und legt diese Schriftrolle in das OnEnter-Fach.
void main() { object oVictim = GetEnteringObject(); if (GetAlignmentGoodEvil(oVictim) == ALIGNMENT_GOOD || GetAlignmentGoodEvil(oVictim) == ALIGNMENT_EVIL) { ActionCastSpellAtObject(SPELL_LIGHTNING_BOLT, oVictim); } }
Andersherum könnte man auch sagen, alle die, die auf die Bodenplatte treten und nicht neutraler Gesinnung sind sollen den GewitterBolzen zu spüren bekommen. Also quasi die Negation unseres vorherigen Ausdrucks.
void main() { object oVictim = GetEnteringObject(); if (!(GetAlignmentGoodEvil(oVictim) == ALIGNMENT_NEUTRAL)) { ActionCastSpellAtObject(SPELL_LIGHTNING_BOLT, oVictim); } }
Ja ihr habt Recht. Man könnte auch sagen: "Wenn die Gesinnung ungleich neutral ist." Es ist das gleiche wie den gesamten Ausdruck zu negieren.
void main() { object oVictim = GetEnteringObject(); if (GetAlignmentGoodEvil(oVictim) != ALIGNMENT_NEUTRAL) { ActionCastSpellAtObject(SPELL_LIGHTNING_BOLT, oVictim); } }
Ich werde euch den mathematisch/logischen Beweis ersparen, da er euch nur langweilen würde. Probiert es einfach aus, ihr werdet sehen, es ist immer der gleiche Effekt. Nun, das soll es für heute gewesen sein. Wir sehen uns in der sechsten Lektion.