Inhaltsverzeichnis
Vergleichsoperationen und Verzweigungen
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'.
Vergleichsoperationen
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 |
Logische Operationen
In der Computersprache LUA kennen wir als logische Operatoren
and, or und not
and or
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
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.
Prioritäten
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) ^ |
---|
Verzweigungen
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:
- Das if, die Bedingung von oben, das then und das end. Die einfachste Form.
- Will man noch andere verschiedene Sachen abfragen ist da noch das elseif, Bedingung und das then.
Hiervon kann man so viele dazwischen einsetzen wie man braucht. - Möchte man jetzt auch irgendetwas machen, wenn alles andere nicht zutrifft,
so nimmt man zum Schluß noch das else dazwischen ohne then. - Wichtig ist noch zu wissen, das erste was zutrifft wird genommen. Die anderen werden dann nicht mehr abgefragt.
- In jedem Block/Arbeitsanweisung kann dann wieder alles Mögliche stehen, auch wieder eine If-Abfrage
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.
Das Beispiel
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