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

OperatorBeschreibung 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:

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.

Zur Tutorial-Übersicht