Kapitel 6 Variablen6.1 Vorhandene VariablenVariablen sind Merker für Werte. In T.A.G. können Variablen auch Merker für Objekte, Räume und Befehle sein. Einige Variablen haben wir schon kennengelernt, nämlich die Inventar-Daten und aRaum. Es gibt aber noch weitere Variablen, die bereits vordefiniert sind. Die wichtigsten sind wahrscheinlich die Objektvariablen. Die Variablen aObj und aObj2 stehen für die Objekte, die im Befehl des Spielers erwähnt werden. Manche Befehle verlangen kein Objekt, und oft ist aObj2 Null, d.h. nicht vorhanden. (Es gibt auch noch ein aObj3, aber es wird so gut wie nie verwendet.) Die wichtigste Raumvariable ist aRaum, die immer angibt, wo sich der Spieler befindet. Ihr sollte nie explizit ein Wert zugwiesen werden, sondern sie sollte mit GeheZu automatisch angepasst werden. Die meisten Variablen stehen nur für Zahlen, in T.A.G. können dies die Zahlen von 0 bis 255 sein. Diese Variablen heißen in T.A.G. (nicht ganz korrekt) Flaggen. Eine Flagge kann normalerweise nur zwei Zustände annehmen, nämlich gesetzt und nach gesetzt. In T.A.G. gilt eine Flagge als gesetzt, wenn ihr Wert größer als Null ist. Bereits benutzte Flaggen sind die bereits erwähnten maxInv, maxGew, maxVol, Inv, InvGew und InvVol. Zwei weitere Flaggen, Minuten und Stunden, geben die Zeit im Spiel an. Jeder Zug dauert eine Minute, und es wird still mitgezählt. Die meisten Adventures benutzen keine Zeitangeben, dies wird aber manchmal in Krimi-Adventures verwendet. Manchmal muss man negative Zahlen oder Zahlen, die größer sind als 255, speichern. Dazu gibt es ein besonderes Zahlenformat, Integer. Integer-Zahlen können Werte von -2 Mrd. bis 2 Mrd. annehmen. Bereits definierte Integerwerte sind Züge, in dem angegeben wird, wieviele Züge der Spieler bereits gemacht hat, und Pktzahl, ein Integer, der nur gelesen werden kann, und der die Gesamtpunktzahl des Spielers enthält (s. Kap. 10.2). Ein weiterer Integer, Nummer, wird verwendet, wenn in der Angabe des Spielersanstelle eines Objekts eine Zahl angegeben wird, wie z.B. in »Wähle 112 auf Telefon«. aObj wäre in diesem Fall ein besonderes Objekt mit dem Namen Zahl. 6.2 Variablen definieren und ändernMan kann sich natürlich weitere Variablen definieren. Dazu muss außerhalb eines Definitionsblocks eine der Anweisungen ObjVar [ID] [Anfangswert]
stehen. Die ID muss natürlich, wie immer, eindeutig sein. Der Anfangswert kann weggelassen werden, dann ist er automatisch Null (bzw. kein Raum oder kein Objekt, was auch mit Null gekennzeichnet wird). Wie der Name schon sagt, sind Variablen genau das, nämlich variabel. Man kann eine Variable z.B. auf einen bestimmten Wert ändern, indem man in einem Ausführungsblock die Anweisung sei [Variable] [Wert] benutzt. Wert kann hier ebenfalls eine Variable sein, dann haben die Variablen den selben Wert, nämlich den der zweiten Variable. Man muss nur aufpassen, dass man hier nicht Äpfel mit Birnen verwechselt: Objektvariablen können nur Werte haben, die ein Objekt sind. Raumvariablen können nur Räume speichern, und Flaggen und Integer nur Zahlen. Alle Variablentypen können jedoch den Wert 0 annehmen. Es gibt einige weitere Anweisungen, die eine Variable relativ zu ihrem jetzigen Wert ändern:
Diese braucht man nicht so häufig, außer inkr und dekr vielleicht. Bei inkr und dekr kann man den Wert auch weglassen, er ist dann eins. Wenn man Flaggen nur als Schalter benutzt, kann man auch folgende Abkürzungen benutzen:
Natürlich kann man Variablen auch vergleichen. Dazu gibt es die Bedingung ([Variable] = [Wert]) die dann erfüllt ist, wenn der Wert der Variable und der abgegebene Wert gleich sind. Wert kann auch hier eine andere Variable sein, aber man muss wieder aufpassen, dass man nicht »Äpfel mit Birnen vergleicht«. Für Zahlenwerte gibt es auch die beiden Bedingungen (x < y) und (x > y), die prüfen, ob x kleiner oder größer als y ist. Diese Bedingung kann man auch für Objekte und Räume verwenden, auch wenn sie keinen großen Sinn macht: Sie vergleicht dann ob Objekt/Raum x vor Objekt/Raum y definiert wurde, was aber im allgemeinen egal ist. Aufgabe 18 * T.A.G. bietet außerdem die Möglichkeit, Variablen »zufällig« zu belegen. Um zum Beispiel den Wurf eines Würfels zu simulieren, kann man Zufall Augen 1 6 benutzen, was die Variable Augen mit einem Wert von eins bis sechs inklusive belegt. Jeder der sechs möglichen Werte ist gleich wahrscheinlich. Eine Variante der Zufall-Anweisung ist, anstatt einen Start- und Endwert eine Liste der möglichen Werte in Klammern anzugeben: Zufall xObj (Messer Gabel Schere) Auch hier treten alle möglichen Werte mit der gleichen Wahrscheinlichkeit auf. 6.3 Sachverhalte merken mit VariablenDazu ein Anwendungsbeispiel: Wir erzeugen jetzt einen Safe, der ein Rädchen hat, das immer auf eine Nummer von 0 bis 99 gestellt ist: Flagge code 66 Obj Safe Name 'Safe' m vor 'stahl' 'geld' 'panzer' subst 'safe' m 'tresor' m 'schrank' m Ort Keller Zust abgeschlossen Attr immobil Behälter Besch 'Der Safe ist sehr stabil und hat ein kleines Rädchen an der Tür, das momentan auf [code] gestellt ist.' Erst 'Ein schwach metallisch schimmernder Panzerschrank steht in einer Ecke des Kellers.' Obj Rädchen Name 'Rädchen am Safe' n vor 'stell' subst 'rad' n 'rädchen' n Ort an Safe Attr Fest Besch 'Das Stellrädchen ist momentan auf [code] eingestellt.' So, wir haben eine Variable code definiert, die die Position des Stellrädchens angibt. Im Moment ist sie immer 66. Das wird auch mit [code] ausgegeben, wenn man den Safe oder das Rädchen untersucht. Das soll sich ändern: Obj Rädchen ... VorAusf (drehen) Bed (Safe abgeschlossen) 'Wieso? Der Safe ist bereits auf.' Zufall code 0 99 Stop 'Du drehst das Rädchen auf [code].' EndeAusf Aktion * Ausf Wenn (code = 23) und (Safe abgeschlossen) dann Text '[#]Vom Safe hörst du ein leises "Klick!"' ObjZust Safe geschlossen Ende EndeAusf So, nun gibt es eine Möglichkeit, das Rad zu verdrehen. Allerdings nur zufällig. Immerhin wird jetzt mit [code] der momentan eingestellte Code ausgegeben. Diese Eigenschaft des Rädchens merken wir uns mit der Flagge code. In einer Aktion, die nach jedem Zug ausgeführt wird, wird nun gecheckt, ob der Code 23 ist und der Safe noch zu ist. Dann nämlich soll der Safe sich mit einem »Klick« entriegeln. Das hätte man natürlich auch direkt in die VorAusf packen können. Aber im nächsten Kapitel wollen wir noch eine andere Möglichkeit, das Rädchen zu verstellen, vorstellen, da ist diese Vorgehensweise wahrscheinlich besser. Übrigens: Aktionen, die mit einem Sternchen definiert werden, d.h., die in jedem Zug ausgeführt werden, benötigen keine ID. 6.4 Zeitabhängige EregnisseMan kann Variablen auch dazu benutzen, um zeitabhängige Ereignisse zu beschreiben. Nehmen wir dazu einmal an, unsere Taschenlampe hätte nur eine Brenndauer von 100 Zügen. Diese Brenndauer wird in der Variable Brenndauer gespeichert. Also: Obj Lampe ... VorAusf (anmachen) Bed (Brenndauer > 0) 'Du schaltest die Lampe ein, aber die Batterien sind leer, und so machst du sie wieder aus.' (öffnen) Stop 'Wozu? Die Batterien tun es noch, und es gibt nichts, wozu man sie sonst gebrauchen könnte.' EndeAusf Damit haben wir verhindert, dass der Spieler die Lampe einschaltet, wenn die Batterien leer sind. Nun müssen wir nur noch dafür sorgen, dass die Lampe in jedem Zug ihre Batterie etwas entlädt. Dazu kann man eine Aktion mit einem Sternchen definieren. Das Sternchen heißt »Führe diese Aktion nach jedem Zug aus, und zwar unabhängig davon, ob der Befehl ausgeführt wurde«. Das heißt, wenn der Spieler versucht, das Haus zu nehmen oder den Tisch zu essen, verliert die Lampe ebenfalls Leuchtkraft. Also definieren wir die Aktion: Aktion Batterieverbrauch * Ausf Wenn (Lampe ein) dann Dekr Brenndauer wenn (Brenndauer = 1 2 3 5 10) Text 'Die Lampe wird zunehmend schwächer.' wenn (Brenndauer = 0) dann Text 'Mit einem letzen Flackern gibt die Taschenlampe endgültig ihren Geist auf.' ObjZust Lampe aus Ende Ende EndeAusf Man kann mehrere Bedingungen desselben Typs zu einer abkürzen. So bedeutet (x = 1 3 5) dasselbe wie (x = 1) oder (x = 3) oder (x = 5). Bei verneinten Bedinungen wird mit und verknüpft: /(aObj fest immobil) heißt /(aObj fest) und /(aObj immobil). 6.5 TextbefehleNun wird unser Adventure immer variabler, und das bringt es mit sich, dass die Ausgabe der Texte darauf angepasst wird. Wir haben die sogenannten Textbefehle einmal ganz kurz kennengelernt. Nun wollen wir sie uns einmal genauer anschauen. Textbefehle sind Sequenzen, die innerhalb eines Ausgabetextes in eckigen Klammern stehen. [x], [#], [f] und [n] kennen wir bereits. Am häufigsten verwendet werden wohl die Befehle zur Ausgabe von Objekten:
T.A.G. verzichtet auf den Genitiv, da er komplizierte Regeln zur Bildung benötigt, und gibt sich mit der korrekten Ausgabe von Dativ und Akkusativ zufrieden, die sowieso häufiger vorkommen. Damit kann man nun Sätze ausgeben, wie Text '[Der aObj] verschwindet hinter [dem aObj2].' und T.A.M. setzt dann die passenden Objekte ein:
Etwas unschön ist es allerdings, wenn bei solchen allgemeinen Antworten Objekte eingesetzt werden, die im Plural stehen, und die im Nominativ (»der«) ausgegeben werden sollen:
So etwas hätte unser Deutschlehrer gar nicht gern gesehen, deshalb gibt es auch Textbefehle zur Ausgabe von Verben:
Nun ist es etwas unschön, auch bei der Endung das Objekt angeben zu müssen. Daher gilt als Vereinfachung: Wenn das Objekt fehlt, wird das aus dem vorherigen Befehl eingesetzt. Damit ändern wir den Text Text '[Der aObj] verschwinde[t] hinter [dem aObj2].' und erhalten immer einen korrekt konjugierten Satz. Etwas Aufwand vielleicht, aber bestimmt die Sache wert. Außerdem habe ich versucht, die Befehle so zu halten, dass der Satz nicht zerrissen wird. Denkt man sich im Satz oben die Klammern weg, bleibt ein ganz normaler Satz über. Weitere wichtige Textbefehle sind:
Ist der erste Buchstabe in der Klammer groß, so ist auch der erste Buchstabe der Ausgabe des Textbefehls groß. [Der aObj] und [der aObj] sind also verschieden. Bei allen weiteren Buchstaben ist, wie allgemein bei T.A.G., die Groß- und Kleinschreibung egal. Es gibt eine weitere Art von Textbefehlen, die aus zwei Zeichen in eckigen Klammern bestehen, und die Sonderzeichen darstellen. [ss] ist das deutsche scharfe s, [^e] ein e mit Zirkumflex, [a"] ein ä, [<<] spitze Anführungszeichen links usw. Diese Textbefehle sind nur dann nützlich, wenn man die passenden Zeichen nicht auf seiner Tastatur hat, denn anstatt [a"] kann selbstverständlich auch einfach »ä« geschrieben werden. (Mehr dazu im Handbuch) 6.6 SchleifenEine weitere wichtige Steuerstruktur sind Schleifen. Dabei werden bestimmte Ausführungen öfters wiederholt. Wie oft, das wird im allgemeinen mit einer Bedingung festgelegt. Die einfachsten Schleifen sind: solange ([Bedingung])
wiederhole
Diese Schleifen sind sehr ähnlich. Die Anweisung wird sooft wiederholt, bis die Bedingung wahr ist. Dabei muss natürlich in den Anweisungen etwas passieren, damit die Bedingung irgendwann wahr werden kann. Der Unterschied zwischen den beiden Schleifen ist, dass die Ausführung bei wiederhole-bis mindestens einmal abgearbeitet wird, bei solange nicht. (Wenn die Bedingung zu Beginn falsch ist, wird der Anweisungsblock bei solange direkt übersprungen.) Bei Schleifen ist ein wenig Vorsicht geboten: Wenn die Bedingung immer wahr ist, wird die Anweisung immer wiederholt. Man nennt dies eine Endlos-Schleife. Ein Beispiel wäre: solange (1 < 5) Text '*' Ende Weitere Schleifen lassen eine Variable von einem Anfangs- zu einem Endwert laufen: Schleife [Variable] [Anfang] [Ende]
Diese Schleifen heißen in den meisten Programmiersprachen for-Schleife. Sie sind ein einfaches Hochzählen einer Variable: Schleife x 1 10 Text '[num x]...[x]' Ende Anstatt einer Flagge kann eine Schleife auch eine Objekt- oder Raumvariable sein. Dann werden alle Objekte oder Räume abgearbeitet, [Anfang] und [Ende] müssen nicht angegeben werden: Sei x 0 Schleife xObj Inkr x Ende Text 'Es gibt [x] Objekte in diesem Adventure.' Eine nützliche Sache ist das Verbinden einer Schleife mit einer Bedingung, die an die Variable in runden Klammern angehängt wird: Sei x 0 Schleife xRaum (xRaum dunkel) Inkr x Ende Text 'Es gibt [num x] dunkle Räume in diesem Adventure.' Zusammenfassung: Es gibt Variablen für Zahlen, Objekte, Räume, Zustände, Richtungen und Befehle, also quasi zu jedem Element von T.A.G.. Mit den Anweisungen sei, inkr, dekr usw. kann der Wert einer Variable verändert werden. Aktionen, die mit einem Sternchen * definiert werden, werden nach jedem Zug ausgeführt. Zur flexiblen Ausgabe von Variablen und Objekten stehen in T.A.G. eine Reihe von Textbefehlen zur Verfügung. Verweise:
|
Einleitung |