Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level1:branches

Verzweigungen

Verzweigungen erlauben dem Programm, abhängig von einer Bedingung unterschiedliche Instruktionen auszuführen. Eine solche Bedingung wird dabei immer als 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 Ebene 3 (FIXME: link zu best practices) eingehen.

scripting/tutorials/level1/branches.txt · Zuletzt geändert: 2023/05/15 18:27 von fritz_98