Wie in jeder Sprache gibt es natürlich auch in der Skriptsprache Lua Operatoren zum Verknüpfen von Operanden. In Lua gibt es Rechen-, Vergleichs- und Logikoperatoren, welche man in Kombination mit den verschiedenen Datentypen anwenden kann. Lua besitzt keine Bitoperatoren, wie z.B. eine bitweise Oder-Verknüpfung zweier Zahlen oder ein bitweises Shiften einer Zahl. Ob dies allerdings ein Verlust ist bleibt Geschmacksache. Alle Operatoren in Lua verlangen naturgemäß nach zwei Operanden. Mit Ausnahme dem Minus '-', wenn es als Negation vor eine Zahl gestellt wird, und dem 'not'.
Vergleiche müssen oft angestellt werden. Ist etwas gleich dem anderen, größer, kleiner u.s.w.
Ergebnis eines Vergleichs ist entweder true oder false ; wahr oder unwahr
Operator | Beschreibung | Beispiel | Ergebnis |
---|---|---|---|
== | Ist etwas gleich dem Andern | „Dario“ == „dario“ | false |
~= | Ist etwas ungleich dem Andern | „Dario“ ~= „dario“ | true |
< | Ist etwas kleiner als das Andere | 2 < 3 | true |
> | Ist etwas größer als das Andere | 2 > 3 | false |
<= | Ist etwas kleiner oder gleich dem Anderen | 2 <= 3 | true |
>= | Ist etwas größer oder gleich dem Anderen | 2 >= 3 | false |
In der Computersprache LUA kennen wir als logische Operatoren
and, or und not
Mit and und or können wir Bedingungen (wie oben am Beispiel) verknüpfen
Ergebnis ist dann true oder false
D.h.
Wenn Bedingung 1 und Bedingung 2 erfüllt sein muß dann:
Ergebnis = Bedingung1 and Bedingung2
Wenn Bedingung 1 oder Bedingung 2 erfüllt sein muß dann:
Ergebnis = Bedingung1 or Bedingung2
Jetzt kann man and und or auch das nachfolgende not auch zusammen brauchen.
Das würde aber den Rahmen sprengen.
Am besten in solch einem Fall in der Scriptecke fragen.
Das kann man dort am Beispiel besser erklären.
not ist einfach eine Negierung einer Bedingung. Es wird umgedreht. Aus true wird false, aus false wird true.
Z.B. Dario ist Tot. Dann kommt bei der Bedingung not IsDead(„Dario“) als Ergebnis false heraus.
Es gibt noch andere Anwendungsmöglichkeiten, aber da weiß ich auch nicht, ob wir die hier brauchen.
Jeder kennt den Spruch: Punktrechnung geht vor Strichrechnung.
Also malnehmen und teilen geht vor zusammenziehen und abziehen.
Nun hört das damit nicht auf. Vorrang hat vom Kleinsten bis Größten geordnet:
or and < > <= >= ~= == .. + - * / not - (unär) ^ |
---|
Wie oft brauchen wir Verzweigungen in einer Map? Sehr oft.
Ich werde jetzt mal versuchen, ein wenig Licht in das Dunkel von if und then zu bringen.
Für den Laien grob übersetzt :
if Heute("Freitag") then -- Wenn true dann Morgen("Ausschlafen") -- Block oder Arbeitsanweisung else -- Wenn nicht dann Morgen("Schule/Arbeit") -- Block oder Arbeitsanweisung end -- Ende
Also: Wenn (if) heute Freitag ist, dann (then) kann ich morgen ausschlafen ansonsten (else) muss ich morgen arbeiten.
Nun könnte man, um Euch völlig zu verwirren, noch ein or hineinbringen, was soviel wie oder heißt.
if Heute("Freitag") or Heute("Samstag") then Morgen("Ausschlafen") else Morgen("Schule/Arbeit") end
Dann haben wir da noch ein elseif. Damit kann man weitere Sachen abfragen.
if Heute("Freitag") or Heute("Samstag") then Morgen("Ausschlafen") elseif Ich("krank") then Morgen("Doktor") elseif Ich("besoffen") then Morgen("blaumachen") -- nicht nachmachen else Morgen("Schule/Arbeit") end
Mehr ist das eigentlich nicht. Es kann aber sehr gut helfen.
Was brauchen wir:
Um solche Sachen gut verstehen zu können, ist es nicht schlecht, wenn man das eine losgelöst vom anderen betrachtet. Klar kommt noch ein konkretes Beispiel. Aber für sich alleine betrachtet sind die Bedingungen nicht schwer und das if auch nicht. Dann pappt man sie einfach nach dem Muster zusammen und es funzt. Nachher spielt man damit.
function CountingArmyOne() if ( zaehler > 0 ) then zaehler = zaehler -1 else if IsAlive ("barrack_1") then if ( runde < 5 ) then CreateArmyOne() Message("Ein kleiner Trupp Feinde ist im Anmarsch") zaehler = 300 runde = runde +1 else StartSimpleJob("CreateArmyTwo") return true end else Message ("EXIT") return true end end end
In o.a. Code wurde counter in zaehler geändert, da hiermit eventuelle Konflikte mit dem Siedler internen Counter vermieden werden können.
Zur Tutorial-Übersicht