[ T. A. G. ] [ Tutorium ]

 

Kapitel 6

Variablen

 

6.1    Vorhandene Variablen

Variablen 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 ändern

Man kann sich natürlich weitere Variablen definieren. Dazu muss außerhalb eines Definitionsblocks eine der Anweisungen

    ObjVar [ID] [Anfangswert]
    RaumVar [ID] [Anfangswert]
    Flagge [ID] [Anfangswert]
    Integer [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:

inkr [Variable] [Wert]
Erhöhung um [Wert]

dekr [Variable] [Wert]
Erniedrigung um [Wert]

mult [Variable] [Wert]
Multiplikation mit [Wert]

div [Variable] [Wert]
Division durch [Wert]

mod [Variable] [Wert]
Rest der Division durch [Wert]

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:

setze [Flagge]
gibt der Flagge den Wert 1

lösche [Flagge]
gibt der Flagge den Wert 0

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 *
Erweitere die Vase so, dass man sie nirgendwo abstellen kann, außer auf dem Tisch.

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 Variablen

Dazu 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 Eregnisse

Man 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    Textbefehle

Nun 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:

[der [Objekt]]
[den
[Objekt]]
[dem
[Objekt]]
Ausgabe mit bestimmtem Artikel. Der Fall wird durch der, den und dem bereits festgelegt. Das ist auch der Grund, warum es hier »der« und nicht »das« Objekt heißt: nur für das Maskulinum sind die drei Artikel verschieden.

[ein [Objekt]]
[einen
[Objekt]]
[einem
[Objekt]]
Ausgabe mit unbestimmtem Artikel. Namen im Plural haben keinen unbestimmten Artikel.

[kein [Objekt]]
[keinen
[Objekt]]
[keinem
[Objekt]]
Ausgabe als Verneinung.

[[Objekt]]
Ausgabe des Objekts im Nominativ und ohne Artikel.

   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:

»Der schokoladenbraune Teddybär verschwindet hinter der Bettdecke.«

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:

»Die sechs Murmeln verschwindet hinter der Mauer.«

So etwas hätte unser Deutschlehrer gar nicht gern gesehen, deshalb gibt es auch Textbefehle zur Ausgabe von Verben:

[ist [Objekt]]
ist »ist«, wenn Objekt im Singular ist, ansonsten »sind«.

[hat [Objekt]]
gibt »hat« oder »haben« aus.

[wird [Objekt]]
gibt »wird« oder »werden« aus.

[t [Objekt]]
gibt »(e)t« oder »en« aus. Dies ist die Endung für schwache Verben.

[[xxx]/[yyy] [Objekt]]
Gibt [xxx] im Singular und [yyy] im Plural aus. Dies kann für unregelmäßige Verben benutzt werden: [gibt/geben aObj].

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:

[[Flagge]] gibt den Zahlenwert der Flagge aus.

[num [Flagge]] gibt den Zahlenwert der Flagge aus, aber benutzt Zahlwörter für die Zahlen bis hundert.

[[Zeit]] gibt die Uhrzeit im Spiel im Format hh:mm aus.

[[Aktion]] ruft die Aktion aus dem Text heraus auf.

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    Schleifen

Eine 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])
        [Anweisungen]
    Ende

    wiederhole
        [Anweisungen]
    bis ([Bedingung])

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]
        [Anweisungen]
    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:
Variablen sind Merker für bestimmte Sachverhalte. Variablen in T.A.G. sind global, d.h. der Wert einer Variable ist von überall aus abrufbar.

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:
Handbuch, Kapitel 4.2: Flaggen und Variablen
Handbuch, Kapitel 5.1.2: Variablenzuweisungen
Handbuch, Kapitel 6.2: Ablauf eines Zuges
Handbuch, Kapitel 7.2: Anweisungen im Text
Variablendefinitionen in karn.adv


Nächstes Kapitel
Voriges Kapitel
nach oben
Inhalt


________
Startseite --> Textadventures --> T.A.G. --> Tutorium --> Kapitel 6
Übersicht
Martin Oehm

[ www.martin-oehm.de - Startseite ]
[ Textadventures ]
[ T. A. G. ]

Inhalt

Einleitung
Spielwelt
Objekte I
Objekte II
Anweisungen
Variablen
Befehle
Klassen
Personen
Diverses

Lösungen