Kapitel 6: Variablenbehandlung (auch: Variablen fuer Fortgeschrittene)
6.1 Was bisher geschah... oder: Was bisher bekannt sein sollte: Du solltest in der Lage sein, einfache Objekte zu programmieren, die mudspezifisch sind, und die Grundlagen der Vererbung beruecksichtigen. Zusaetzlich kannst Du bereits Funktionen selbst schreiben. Frage: Welche 3 Dinge machen jede Funktion aus? In diesem Kapitel werden wir lernen, wie man in Funktionen Variablen manipuliert. 6.2 Werte und Objekte Grundsaetzlich unterscheidet man im MUD Objekte anhand von diesen beiden Punkten: 1) Einige haben unterschiedliche Funktionen 2) Alle haben unterschiedliche Werte Beispielsweise haben alle Spielerobjekte dieselben Funktionen. Sie unterscheiden sich jedoch anhand verschiedener Werte. Beispielsweise unterscheidet sich das Spielerobjekt "Inwe" von dem Spielerobjekt "Pina" zumindest dadurch, dass die Variable P_NAME die Werte "Inwe" und "Pina" hat. Alle Properties sind Variablen, die zur Kommunikation zwischen den Objekten gedacht sind. Aenderungen im Spiel verursachen Aenderungen in den Werten in den Objekten, die beteiligt sind. Funktionen werden genutzt, um spezifische Prozesse zur Variablenmanipulation zu benennen. Beispielsweise ist die Funktion create() die Funktion, die zur Initialisierung der Werte des Objektes benutzt wird. Innerhalb dieser Funktion werden andere Funktionen zur Setzung und Manipulation dieser Variablen aufgerufen. 6.3 Lokale und globale Variablen LPC-Variablen koennen (wie in den Datentyp-Betrachtungen bereits kurz erwaehnt) als lokale oder globale Variablen deklariert werden. Lokale Variablen werden innerhalb einer Funktion deklariert und nur innerhalb der Funktion verwendet, sie sind auch ausserhalb nicht verwendbar. Sie werden nur im Speicher gehalten, waehrend die Funktion ausgefuehrt wird. Im Gegensatz dazu stehen globale Variablen allen Funktionen innerhalb des Objektes zur Verfuegung. Diese Variablen belegen solange das Objekt existiert, Arbeitsspeicher und werden erst dann entfernt, wenn das Objekt aus dem Spiel entfernt wird. Vergleiche dazu das Beispiel aus Kapitel 2. 6.4 Manipulation von Werten von Variablen Zuweisungen werden verwendet, um Variablenwerte zu manipulieren. Ein Beispiel koennte so aussehen: x = 5; Damit wird der Variable x der Wert 5 zugewiesen. Es gibt ein paar interessante Konzepte, die hier zum Zuge kommen, die allgemein mit Ausdruecken zu tun hat. Ausdruecke sind beliebige Aneinanderreihungen von Symbolen, die Werte besitzen. Im obigen Beispiel wurde der Variable x der Wert ders Ausdruckes 5 zugewiesen. Konstante Werte sind die einfachste Form von Ausdruecken. Konstanten (also konstante Werte) sind zB int 5 oder string "hallo". Das letzte Konzept ist der Operator. In dem obigen Beispiel wurde der Zuweisungsoperator(=) benutzt. Es gibt viele Operatoren in LPC und die Ausdruecke koennen sehr komplex werden. Wir erhoehen einmal einmal den Schwierigkeitsgrad: y = 5; x = y + 2; Die erste Anweisung benutzt einen Zuweisungsoperator, um der Variable y den konstanten Ausdruck 5 zuzuweisen. Aber das hast Du sicher sofort erkannt. Die zweite Anweisung weist der Variable x den Ausdruck y + 2 zu. Dieser Ausdruck wird durch den Inkrementoperator(+), der den Wert der Variable y und die Konstante 2 verbindet. Klingt kompliziert? Um es anders auszudruecken: Operatoren koennen benutzt werden, um komplexe Ausdruecke zu erstellen. Im obigen Beispiel gibt es zwei Ausdruecke: 1) y+2 2) x=y+2 Wie bereits erwaehnt haben alle Ausdruecke Werte. Der Ausdruck y+2 hat hier Wert der Summe aus y und 2 (hier 7). Der zweite Ausdruck x=y+2 hat auch den Wert von 7. Operatoren haben wichtige Aufgaben: 1) Sie koennen sich bei Eingabe wie eine Funktion verhalten 2) Sie koennen selbst einen Wert besitzen. Nicht alle Operatoren verhalten sich so, wie in 1) beschrieben. Der Zuweisungsoperator(+) weist den Wert, der sich rechts von ihm befindet, der Variable, die sich links von ihm befindet, zu. Der Inkrementoperator(+) als Solches tut nichts, jedoch haben Beide ihren Wert. Neben dem Inkrementoperator gibt es noch mehrere gleichwertige Operatoren, die die anderen Grundrechenoperatinen durchfuehren. Es werden hier nur die moeglichen Operatoren erwaehnt, jedoch nicht alle ausfuehrlich behandelt. Ist ein Ausdruck mit mehreren Operatoren verbunden, wird anhand der Vorraenge von 1-15 zusammengefasst. Sind mehrere gleichwertige Operatoren vorhanden, werden sie nach der dritten Spalte entweder linksbuendig oder rechtsbuendig ausgewertet. Ale Vorraenge von Operatoren auf einen Blick: 1. () [] -> linksbuendig 2. ! ~ ++ -- (auch + - als Vorzeichen) rechtsbuendig 3. * / % linksbuendig 4. + - (als Inkrement/Dekrement) linksbuendig 5. << >> linksbuendig 6. < > <= >= linksbuendig 7. == != (Vergleiche) linksbuendig 8. & linksbuendig 9. ^ linksbuendig 10. | linksbuendig 11. && (logisches UND) linksbuendig 12. || (logisches ODER) linksbuendig 13. ?: rechtsbuendig 14. = += -= *= /= %= rechtsbuendig 15. , linksbuendig Frage: x=5; y=7; z=x+2*y+4; Welchen Wert hat z? z=x*x+2*y*(x-y); Welchen Wert hat hier z? Weitere, haeufig gebrauchte Operatoren sind: ein logisches NICHT, also die Negierung des folgenden Ausdruckes. ++/--: die Erhoehung/Senkung der Variable um 1. (Spezialfaelle von Vorrang 14) Diese Operatoren koennen als postfix (i++) oder prefix(++i)-Operatoren verwendet werden. Als Prefix wird, die Modifikation durchgefuehrt, bevor ein Wert zugewiesen wird. Als Postfix wird es nach der Wertzuweisung passieren. x=0; y=5; x=++y; // x=6, y=6 y=5; x=y++; // x=5, y=6 An diesem kleinen, aber feinen Beispiel kannst Du den Unterschied sicher erkennen. %: der Modulooperator, Bei der Division von ganzzahligen Werten kann ja nur ein ganzzahliger Wert herauskommen. Den Rest ermittelt der %-Operator. <=/=>/>: logische Vergleichsoperatoren. kleiner/kleiner oder gleich/ groesser oder gleich/groesser, liefern 0 bei falsch und 1 bei wahr == : logischer Vergleichsoperator ist gleich, Achtung, nicht mit dem Zuweisungsoperator (=) zu verwechseln! logischer Vergleichsoperator ungleich +=/ -=/ *=/ /=: der linke Teil des Ausdruckes wird um den rechten Teil nach den Grundrechenoperatoren modifiziert. i++ ist grundsaetzlich dasselbe wie i+=1 oder i=i+1, wenn man davon absieht, dass die erste Version eine hoehere Prioritaet hat. ?: : ein Dreikomponenten-Operator, der eine einfache Alternativzuweisung erlaubt. AUSDRUCK?WAHR:FALSCH Wenn der Ausdruck vor dem ? wahr ist, wird der Wahrzweig ausgefuehrt, sonst der Falschzweig (also der hinter dem 6.5 Komplexe Ausdruecke Wie Du vielleicht bemerkt haben solltest, hat der Ausdruck x=5 selbst schon einen Wert von 5. Da auch LPC-Operatoren Werte haben, koennen irgendwelche Ausdruecke, wie Dieses auftauchen: i=(is=sizeof(inv=all_inventory(environment(this_object()))))?j=5:j=0; Frage: Welche Werte haben i, is, inv und j bei der Ausfuehrung? Welche Datentypen werden i, is, inv und j haben? 6.6 Zusammenfassung Es ist bekannt, wie man Variablen deklariert und wie man sie global und lokal nutzt. Ausserdem sind die Unterschiede zwischen global und lokal bekannt. Ausserdem weisst Du, was efuns des Drivers sind und auch was LPC-Operatoren sind. Die wichtigsten Operatoren sind bekannt und man kann Dich mit komplexen Ausdruecken nicht mehr frustrieren. Du weisst, wie man Variablen mit Hilfe von Operatoren manipuliert. Das ist nuetzlich, wenn Du zum Beispiel wissen willst, wieviele Aepfel oder Kirschen der Spieler bereits vom Birnenbaum gepflueckt hat und wie man erfaehrt, ob eine bestimmte Anzahl gepflueckt wurde, damit kein Spieler mehr pfluecken kann. Dazu ein Hinweis: Es ist immer besser, die maximale Zahl, die pflueckbar sind, einzustellen und die dann herunterzuzaehlen anstatt den anderen Weg zu beschreiten. Frage: Wie saehe die Abfrage mit dem ?-Operator aus, wenn die Variable i die Kirschenanzahl enthaelt und 5x gepflueckt werden darf. Dass das spaeter mit einer speziellen Funktion, der sogenannten if-Funktion, besser geloest wird, da dann auch Texte ausgegeben werden und so weiter, was mit dem ?-Operator so einfach nicht funktioniert, ausser man lagert die positive wie negative Aussage in eine weitere Funktion aus, ist eine andere Frage. Du hast damit die wichtigsten theoretischen Dinge gelernt, die es Dir ermoeglichen, eine mehr oder weniger komplexe Subregion zu schreiben. Auf die Funktionen wie SetProp oder AddExit gehe ich hier explizit nicht ein, da das nicht direkt zu LPC gehoert, und verweise dafuer auf die entsprechenden man-Pages im MUD.

Discord
Codeberg