[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ====== 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 [[http://www.siedler-portal.de/vb3/forumdisplay.php?f=95|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 - ([[glossary: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 \\ FIXME In o.a. Code wurde //counter// in //zaehler// geändert, da hiermit eventuelle Konflikte mit dem Siedler internen Counter vermieden werden können. \\ \\ [[:tutorials:index|Zur Tutorial-Übersicht]]