Tables

Häufig kommt es vor, dass man in einem Script jede Menge Variablen des gleichen Datentyps benötigt und diesen Variablen voneinander abhängige Werte zuweisen will. Dabei wäre es äußerst mühsam, jede Variable beim Namen zu nennen und ihr einen neuen Wert zuzuweisen.Wesentlich vorteilhafter wäre dafür ein automatisierter Ablauf. Auch kommt es oft vor, dass man mit Daten-blocks hantieren muss. Angenommen man möchte ein Spiel mit mehreren Spielern erstellen, und jeder Spieler bekommt für seine Daten die Variablen spieler1leben, spieler1punkte, wie sollte man denn dann weitere Spieler hinzufügen? Automatisiert kann man nämlich leider keine Variablen spieler2leben und spieler2punkte hinzufügen lassen. Mithilfe von Tables ist das aber möglich, denn dort kann man automatisiert Einträge hinzufügen lassen.

Was genau ist aber eine Table? Eine Table wird in vielen Programmiersprachen auch als Array bezeichnet und ist im Grunde nichts anderes als eine Tabelle mit Spalten und Zeilen, die man selbst definiert. Mit speziellen Funktionen, die der Lua Core bereithält, lässt sich die Anzahl der vorhandenen Einträge in einer Table auslesen und auch verändern. Ein kleines Beispielscript soll das veranschaulichen.

spieler = {"hans","fritz","peter"}

for i=1,table.getn(spieler) do print(spieler[i]) end

In diesem Beispielscript wird zuerst eine neue Table namens "spieler" erstellt (die Daten einer Table müssen immer von geschweiften Klammern eingeschlossen werden). Die Table besteht im Moment aus nur einer Zeile, aber drei Elementen ("Spalten"), die da wären: hans, fritz, peter. Die 3 Elemente werden jeweils durch ein Komma voneinander getrennt und können Zeichenketten und/oder Zahlen enthalten (ein Mix aus beiden Datentypen ist möglich). Hier kommt nun auch die for-Schleife wieder ins Spiel, mit der man viel Schreibart sparen kann und die Funktionalität des Programms erhöhen kann. In diesem Fall startet die for-Schleife mit dem Initialwert 1. Die Obergrenze wird mittels table.getn(spieler) festgelegt. Hierbei handelt es sich um eine Funktion für Tables aus dem Lua Core, mit dem die Anzahl der Einträge in einer Table ermittelt werden kann. In diesem Fall hätte table.getn(spieler) den Rückgabewert 3, da die Table spieler aus 3 Elementen besteht. Praktischerweise könnten wir ein paar weitere Elemente hinzufügen. Das hat aber keinerlei Beeinträchtigung der Funktionalität der for-Schleife zur Folge. Anstatt von 1 bis 3 "rennt" sie nun von 1 bis zur neuen Anzahl an Elementen in der Table spieler. Die for-Schleife muss hierbei nicht editiert werden! In einem Programm, dass für diese Aktion simple Variablen verwendet, wäre diese Automatisierung und diese Interaktivität gar nicht möglich. Genau genommen könnte man die Anzahl an Spielern während der Laufzeit des Scriptes gar nicht erhöhen.

spieler = {"hans","fritz","peter","ludwig","walter","franz","vincent","juergen"}

for i=1,table.getn(spieler) do print(spieler[i]) end

Neben Variablen vom Typ String und vom Typ Zahl kann ein Tableelement ebenso eine Variable vom Typ Table beziehungsweise eine Table selbst beinhalten. Dass wiederum bedeutet, dass man unendlich verschachtelte Tables erzeugen kann und es meist sogar genügt, für allgemeinere Gruppierungen nur eine einzige Table zu verwenden:

spieler =   {
        {"hans",leben=100,1,schild=150,slogan="ich habe es drauf!"},
        {"fritz",leben=90,3,schild=137,slogan="Fritz flitzt!"},
        {"peter",leben=89,2,schild=110,slogan="Peter 4 president"},
        {"ludwig",leben=100,11,schild=150,slogan="Ludwig, gestatten!"},
        {"walter",leben=56,2,schild=29,slogan="ich habe es auch drauf!"},
        {"franz",leben=100,9,schild=150,slogan="franz kanns!"},
        {"vincent",leben=12,1,schild=135,slogan="ich kann es leider nicht..."},
        {"juergen",leben=100,4,schild=150,slogan="ich schon!"}
      }

for i=1,table.getn(spieler) do print("Spieler: "..spieler[i][1]) print(" | ") print("Lebenspunkte: "..spieler[i].leben) print(" | ") print("Level: "..spieler[i][3]) print(" | ") print("Ruestung: "..spieler[i].schild) print(" | ") print("Slogan: "..spieler[i].slogan) print("\n") end

Die Table spieler enthält also immer noch 8 Elemente auf der Hauptebene. Allerdings handelt es sich bei jedem Element selbst wieder um eine Table, welche selbst jeweils 5 Elemente besitzt. Die for-schleife arbeitet sich nun durch die 8 Hauptelemente im Intervall i[1;8]. Jedes dieser Elemente, welches wiederum eine Table mit Elementen ist, enthält weitere 5 Elemente, die in der Regel über spieler[i][Elementposition] angesprochen werden können. Es gibt aber auch Ausnahmen und somit die Möglichkeiten, in einem Element nicht nur einen Wert, sondern sogar eine Variablendefinition selbst (hier am Beispiel von leben=100, schild=150 und slogan="blablabla") zu speichern. Abgerufen werden kann dieser Wert dann nicht über table[Elementposition][Elementposition], sondern über table[Elementposition].variablenname . Mit table[Elementposition][Elementposition] und table[Elementposition].variablenname lässt sich aber nicht nur der Wert eines Tableelements auslesen, sondern auch editieren,und dass mithilfe der Operatoren, die für "ganz normale" Variablen gelten:

spieler =   {
        {"hans",leben=100,1,schild=150,slogan="ich habe es drauf!"},
        {"fritz",leben=90,3,schild=137,slogan="Fritz flitzt!"},
        {"peter",leben=89,2,schild=110,slogan="Peter 4 president"},
        {"ludwig",leben=100,11,schild=150,slogan="Ludwig, gestatten!"}
        ,,
        {"franz",leben=100,9,schild=150,slogan="franz kanns!"},
        {"vincent",leben=12,1,schild=135,slogan="ich kann es leider nicht..."},
        {"juergen",leben=100,4,schild=150,slogan="ich schon!"}
      }

spieler[5] = {} spieler[5][1] = "walter" spieler[5].leben=56 spieler[5][3]=2 spieler[5].schild=29 spieler[5].slogan="ich habe es auch drauf!"

for i=1,table.getn(spieler) do print("Spieler: "..spieler[i][1]) print(" | ") print("Lebenspunkte: "..spieler[i].leben) print(" | ") print("Level: "..spieler[i][3]) print(" | ") print("Ruestung: "..spieler[i].schild) print(" | ") print("Slogan: "..spieler[i].slogan) print("\n") end

Tables können aufgrund ihrer Komplexität manchmal sehr "erschlagend" wirken. Der beste Weg, um mit ihnen vertraut zu werden, ist und bleibt ein und der selbe: Übung.

Categories

Tags