next up previous contents index
Next: Die Bevölkerung des Gartens, Up: Schritt für Schritt ins Previous: ,,Da schied Gott das

Subsections


,,... ein Buch, geschrieben inwendig und auswendig ...''

Auswendig ist nicht allzu schwer:

Object  Heft

 with   short_name "Heft",

        adj "klein",

        dekl 1,

        description "Es ist ein kleines Heft mit nicht allzuvielen Seiten. Auf

                     dem Titel steht: ~Der Abentteuerliche Informissimus

                     Teutsch - Eine Einführung in die Programmierung mit

                     Inform und der deutschen Library.~ Irgendwie macht es

                     einen unfertigen Eindruck.",

        name 'heft' 'informissimus' 'klein' 'handbuch' 'info',

        before [;

           open, search: "In dem kleinen Heft findest du Informationen über das

                  Spiel."

           close: "Du schließt das kleine Heft.";

        ],

 has    neuter;

Auch der Befehl ,,Lies das Heft'' führt dazu, dass die description ausgegeben wird - Lesen eines normalen Objekts ist gleichbedeutend mit dem Betrachten - ##Examine. Den Reiz eines Buches macht aber aus, dass verschiedene Dinge darin stehen; dass man also mit Befehlen wie ,,Lese die Hinweise im Heft'' - Konsultiere das Heft über den Garten''- ,,Schlage im Heft über das Thema Eden nach'' - an die im Buch selbst enthaltenen Informationen kommt und nicht nur die Beschreibung des Buchdeckels erhält.

Die Library löst für solche Befehle die Aktion ##Consult aus und übergibt als noun das Objekt, in dem gelesen werden soll (hier: Heft). Dann aber wird es schwierig.

Parsen selbst gemacht

Den Teil der Eingabezeile, in dem steht, was gelesen werden soll, muss das Programm selbst analysieren. Zu diesem Zweck übergibt die Library eine Variable consult_words, die die Anzahl der zu analysierenden Worte enthält und einen Zeiger consult_from auf die Eingabezeile, der auf das erste Wort des Textes deutet, der gelesen werden soll, im letzten oben angeführten Beispiel wäre dieser Text ,,das Thema Eden''; consult_words wäre gleich 3; der Zeiger consult_from weist auf das Wort ,,das''.

Außerdem haben wir noch die Funktion NextWord() zur Verfügung, die das nächste Wort aus der Eingabezeile liest und mit dem internen Wörterbuch des Spiels vergleicht. Welches Wort das ,,nächste'' ist, erkennt die Funktion aus der globalen Variablen wn. Diese müssen wir - aus consult_from - initialisieren, um an der richtigen Stelle anzufangen. Praktischerweise zählt NextWord() die Variable wn bei jedem Aufruf um 1 hoch.

Die before-Regel für die Aktion ##Consult könnte - für Themen, die bis zu drei Worte lang sind und das Wort Thema enthalten können - etwa so aussehen:

before [ w1 w2 w3 thema;                  ! vier lokale Variable 

   Consult: wn = consult_from; 

            w1 = NextWord();              ! erstes Wort des Themas 

            w2 = NextWord();              ! evtl. zweites Wort des Themas 

            w3 = NextWord();              ! evtl. drittes ...  

           if (consult_words==1 && w1~='thema' or 'themen') 

              thema = w1; 

           else 

              if (consult_words==2 && w1=='dem' or 'den' or 'die' or 'der' or 'das' )                   thema = w2; 

              else 

                 if (consult_words==2 && w1=='thema') 

                    thema = w2; 

                 else 

                    if (consult_words==3 && w2=='thema') 

                       thema = w3; 

                    else "Versuche es mit: ~Lies über <das Thema> im Heft nach~";

Beachte:

Die in 'einfachem Hochkomma' stehenden Worte sind keine schlichten Zeichenketten, sondern es sind im dictionary des Spiels eingetragene Konstanten, intern realisiert als Zeiger auf eine Tabelle mit den tatsächlichen Worten. (Jedes Wort, das im Programmtext in 'einfachen Hochkommas' geschrieben wird, wird in dieses Wörterbuch eingetragen.) Weil es aber konstante Werte sind, können sie in einer switch-Anweisung (zur Erinnerung: Kapitel 3.1.3)verwendet werden:

         switch (thema) { 

            'adam', 'mich', 'eva', 'mensch', 'frau': 

                "Adam und Eva sind die ersten Menschen. Deutsche Lehrbücher 

                 fangen immer bei Adam und Eva an."; 

            'heft', 'inform' , 'informissimus': 

                "Zusammen mit diesem Spiel sollten Sie den ~Abentteuerlichen

                 Informissimus Teutsch~ erhalten haben - eine Anleitung und eine

                 Kurzreferenz zum Programmieren deutschsprachiger interaktiver

                 Belletristik."; 

            'vorwort', 'hinweise' 'hilfe': 

                "Dies ist interaktive Belletristik."; 

            'garten', 'baum', 'Baeume': 

                "Im Garten Eden stehen viele Bäume, sie sind lustig anzusehen 

                 und ihre Früchte sind gut zu essen. Nur die Bäume in der Mitte 

                 des Gartens sind den Menschen verboten worden."; 

            'eden', 'spiel': 

                "Dieses Spiel ist ~nur~ das Bei-Spiel zum ~Abentteuerlichen

                 Informissimus Teutsch~."; 

            default: "Darüber steht nichts in dem kleinen Heft."; 

         } 

 open: ...

 close: ...

],


Parsen mit GInfo.h

Es geht aber auch einfacher. Man kann den Parser der Library die Arbeit machen lassen; dazu muss man ihm aber Objekte vorgeben, die die möglichen ,,Anfragen'' an den Inhalt des Heftes abdecken - und Regeln, wie er diese Objekte verwenden kann. Eine Klasse - Topic - für solche Objekte und die notwendigen Regeln enthält die zusätzliche Bibliothek GInfo. Sie definiert ausserdem ein ,,Aufhängerobjekt'' namens Topics, mit dem gesteuert werden kann, ob bestimmte Themen gerade ,,aktuell'' sind (dann sind sie children von Topics) oder nicht (dann kann man sie mit z.B. remove TMann; entfernen (und mit move TMann Topics; wieder ins Spiel bringen)).

Die einzelnen Objekte enthalten nur ihren eigenen Namen, grammatische Zusatzinformation - und in der name-property die Worte, mit denen sie vom Spieler angesprochen werden können ('Thema' erben sie von Topic). Wir lernen hier außerdem eine neue Kurzschreibweise kennen: Topic TMann bedeutet dasselbe wie Object TMann ... class Topic.

Include GInfo; 
 
Topic TMann Topics

 with short_name "Adam",

      name 'Adam' 'Mann' 'Mensch' 'mich' 'mir' 'dich' 'dir',

      dekl 0,

 has  male proper; 
 
Topic TFrau Topics

 with short_name "Eva",

      name 'Eva' 'Frau' 'Mensch' 'Gefaehrtin' 'Gehilfin',

      dekl 0,

 has  female proper; 
 
Topic TSpiel Topics

 with short_name "Programm",

      name 'Spiel' 'Programm' 'Eden' 'Information' 'Informationen' 'info',

      dekl 1;              

! neuter erbt das Objekt von der Klasse Topic 
 
Topic THilfe Topics

 with short_name "Hilfe",

      name 'Hilfe' 'Anleitung' 'Einführung',

      dekl 9,

 has  female;

Gibt nun der Spieler den Befehl: ,,Lies im Heft über Adam nach'', dann übergibt der Parser wie vorhin die Aktion ##Consult und als noun das Objekt Heft; aber jetzt als zweites Objekt des Satzes das Objekt TMann in der Variablen second und die Programmierung ist ganz einfach:

before [;

   Consult:

      switch (second) {

              TMann, Tfrau: 

                      "Adam und Eva sind die ersten Menschen.

                       Deutsche Lehrbücher fangen immer bei 

                       Adam und Eva an.";

              THeft:  "Zusammen mit diesem Spiel werden Sie in 

                       naher Zukunft den ~Abentteuerlichen

                       Informissimus Teutsch~ erhalten ..."

              THilfe: "Dies ist interaktive Belletristik. Mehr 

                       erfahren Sie mit ~Hilfe~.";

              TGarten, TSpiel:  
                      "Dieses Spiel ist ~nur~ das Bei-Spiel

                       zum ~Abentteuerlichen Informissimus 

                       Teutsch~.

              ...

      }

   ...

],

Damit es korrekt funktioniert, muss das Heft noch das Attribut legible bekommen und nach Include grammarg; muss noch der zweite Teil des GInfo-Pakets eingebunden werden mit dem Befehl:

Include GinfoG;
Mehr über GInfo.h steht in Kapitel 5.1.


next up previous contents index
Next: Die Bevölkerung des Gartens, Up: Schritt für Schritt ins Previous: ,,Da schied Gott das
Frank Borger
2003-05-02