===== Verzweigungen =====
Verzweigungen erlauben dem Programm, abhängig von einer Bedingung unterschiedliche Instruktionen auszuführen. Eine solche Bedingung wird dabei immer als [[ scripting:tutorials:level1:variables#booleans | Boolean ]] ausgedrückt.
Konstruiert werden Verzweigungen wie folgt: Das Schlüsselwort **if** leitet eine Verzweigung ein, danach folgt die zu prüfende Bedingung. Das Schlüsselwort **then** zeigt das Ende der Bedingung an. Anschließend gibt man alle Instruktionen an, die man ausführen will, sollte die Bedingnung **true** sein. Die Verzweigung endet mit dem Schlüsselwort **end**.
-- Rechne 24h-Zeitdarstellung in 12h-Zeitdarstellung um und gib Uhrzeit als String aus
Hours = 13
Minutes = 26
Seconds = 5
Period = "a.m."
PostMeridiem = Hours > 12
if PostMeridiem then
Hours = Hours - 12
Period = "p.m."
end
Time = Hours..":"..Minutes..":"..Seconds.." "..Period
----
**Hinweis**: Unsere Beispiele in diesem und den folgenden Kapiteln können besser nachvollzogen werden, wenn man die Programmzeilen nebenbei ausprobieren kann. Dazu kann man diese Webseite hier verwenden:
[[ https://www.lua.org/demo.html ]]
Um dabei bei der Ausgabe ein Ergebnis zu sehen, kann man ''print'' verwenden. Will man beispielsweise die Variable ''Time'' ansehen, kann man
Time = Hours..":"..Minutes..":"..Seconds.." "..Period
print(Time)
schreiben. Wenn die Variable einen anderen Namen hat, muss man diesen dementsprechend austauschen.
----
Unser Beispiel kann noch etwas vereinfacht werden. Zunächst muss die Bedingung nicht zwangsläufig zuerst in einer Varable zwischengespeichert werden, wenn das Ergebnis nur für diese Verzweigung gebraucht wird. Darüber hinaus erlauben Verzweigungen auch, andere Instruktionen auszuführen, sollte die Bedingung nicht Wahr sein. Dazu benötigt man das Schlüsselwort **else**.
-- Dieser Code ist komplett äquivalent zum ersten Beispiel oben
Hours = 13
Minutes = 26
Seconds = 5
if Hours > 12 then
Hours = Hours - 12
Period = "p.m."
else
Period = "a.m."
end
Time = Hours..":"..Minutes..":"..Seconds.." "..Period
Die Verzweigungen in Lua sind sehr nah an natürlicher Sprache: "**Wenn** (Bedingung erfüllt) **dann** (Instruktionen) **sonst** (Instruktionen) **Ende**". \\
Wenn man sich seine Verzweigungen auf diese Art als Satz formuliert, kann man schnell prüfen, ob die Logik dahinter das ausdrückt, was man möchte. \\
Da Bedingungen immer Booleans sind, kann man alle logischen und Vergleichsoperatoren verwenden:
-- Hier den Wochentag eintragen
Weekday = "Monday" -- :(
IsItWeekend = false
if Weekday == "Saturday" or Weekday == "Sunday" then
IsItWeekend = true -- :)
end
Man kann Verzweigungen auch ineinander schachteln:
-- Finde aus drei verschiedenen Zahlen die kleinste:
Number1 = 3
Number2 = 7
Number3 = 1
if Number1 < Number2 then
if Number1 < Number3 then
SmallestNumber = Number1
else
SmallestNumber = Number3
end
else
if Number2 < Number3 then
SmallestNumber = Number2
else
SmallestNumber = Number3
end
end
Beachte dabei, wie **jede** Verzweigung mit **if** eingeleitet und mit **end** beendet werden muss. \\
Eine Besondere Rolle haben Verzweigungen wie diese hier:
Difficulty = "normal" -- Schwierigkeitsgrad, der entweder "easy", "normal", "hard" oder "veryhard" ist
if Difficulty == "easy" then
NumberOfEnemyTroops = 4
else
if Difficulty == "normal" then
NumberOfEnemyTroops = 7
else
if Difficulty == "hard" then
NumberOfEnemyTroops = 11
else
if Difficulty == "veryhard" then
NumberOfEnemyTroops = 15
end
end
end
end
Kurzum, eine Variable, in unserem Fall der Schwierigkeitsgrad, kann nur einen von wenigen fest definierten Werten haben und wir wollen herausfinden, welcher das ist. Für so einen Fall erlaubt das Schlüsselwort **elseif** eine übersichtlichere Schreibweise:
-- Dieser Code ist wieder äquivalent zu dem darüber
Difficulty = "normal"
if Difficulty == "easy" then
NumberOfEnemyTroops = 4
elseif Difficulty == "normal" then
NumberOfEnemyTroops = 7
elseif Difficulty == "hard" then
NumberOfEnemyTroops = 11
elseif Difficulty == "veryhard" then
NumberOfEnemyTroops = 15
end
Sollte die Liste an möglichen Werten die Länge 4 deutlich überschreiten, gibt es weitaus elegantere Wege, so eine Abfrage zu formulieren. Darauf wollen wir allerdings erst später in [[ scripting:tutorials:level3:best_practices |Ebene 3]] eingehen.
----
Im nächsten Kapitel teilen wir den Code in wieder verwendbare, logische Blöcke auf.
[[ scripting:tutorials:level1:variables | Voriges Kapitel: Variablen ]]\\
[[ scripting:tutorials:level1:functions_blocks | Nächstes Kapitel: Funktionen ]]\\
[[ scripting:tutorials:level1:branches | Zurück nach oben ]]