Geschrieben um 22:29 am 27.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Pupil Gumby Beiträge: 12 | Ich habe einen Wald mit vielen Bäumen, darunter ist ein spezieller roter Baum. Nun soll man den roten Baum aber nicht mit 'untersuche Baum' untersuchen können (da dann die Beschreibung der normalen Bäume kommen sollte), sondern nur mit 'untersuche roten Baum'. Gibt es eine Möglichkeit in Tag, ein Adjektiv untrennbar an den Namen zu binden, oder muss man sich da etwas anderes überlegen? |
Geschrieben um 09:00 am 30.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Prof Gumby Beiträge: 634 | In diesem Fall empfiehlt sich, die genaue Wortfolge explizit in der Aktion ObjParser zu definieren. Diese wird vor dem normalen Parsen von Objekten aufgerufen, ein Objekt gilt als eindeutig gefunden, wenn die Variable aObj einen Wert zugewiesen bekommt. Der Wortzähler muss dann auf dem ersten Wort stehen, das nicht zum analysierten Objekt gehört. (Mehr dazu in Kapitel 15 des T.A.G.-Handbuchs.) Der rote Baum wird ohne eigenes Objektvokabular - oder nur mit zusätzlichem Vokabular, das nicht mit den anderen Bäumen in Konflikt tritt, 'rotbuche' zum Beispiel - definiert und das Spiel bekommt folgende Aktion:
Mit leseArt wird der passende Artikel gelesen, in diesem Fall ein makuliner, also 'den' oder 'dem'. Wenn es einen solchen Artikel gibt, wird der Wortzähler weiterbewegt - und genau dazu dient diese Anweisung, denn es wird nicht verlangt, dass ein Artikel eingegeben wird. Danach wird auf 'rot' mit passender maskuliner Endung geprüft und eventuell der Wortzähler vorangeschoben. Hier wird das Ergebnis dieser Analyse, abgelegt in x, allerdings verwendet und das nächste Wort, diesmal ohne Endungen, geprüft. Ist es 'Baum', so wird der Wortzähler mit nächstesWort vorgeschoben und mit aObj wird nun das Ergebnis des Objektparsers angegeben. Wenn die Wortfolge nicht 'roten baum' oder 'den roten baum' war, wird der Wortzähler zurückgesetzt und die reguläre Analyse beginnt. Diese könnte dann 'baum' ohne Adjektiv finden, nicht jedoch den roten Baum. So wird eine Nachfrage des Parsers umgangen. |
Geschrieben um 15:26 am 30.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Master Gumby Beiträge: 103 | Martin kann viel zuviel definieren und:
Mir fällt da eine viel einfachere Lösung ein:
|
Geschrieben um 16:08 am 31.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Pupil Gumby Beiträge: 12 | @Amateur Zitat:
Denn dann fragt ja der Parser nach, welchen Baum man untersuchen will. Da hast du leider recht...der Sinn war ja, dass man den roten Baum nur untersuchen kann, wenn man weiß er existiert. @Martin Danke, die Lösung funktioniert perfekt - aber leider nur solange man den roten Baum auch in dem Raum untersucht, in dem er tatsächlich ist, ansonsten kommt es zu einem spielabsturzverursachenden Fehler...ich hab schon versucht eine Raumabfrage in die IF-Schleife mit einzubringen, aber entweder bin ich zu dumm oder es funktioniert aus einem andern Grund nicht. |
Geschrieben um 08:31 am 01.09.2004 | Zitat | Editieren | Löschen | |
Mitglied Prof Gumby Beiträge: 634 | <td valign="top"><div class="post"><p><strong>Zensunni:</strong></p> <blockquote> <p>aber leider nur solange man den roten Baum auch in dem Raum untersucht, in dem er tatsächlich ist, ansonsten kommt es zu einem spielabsturzverursachenden Fehler.</p> </blockquote> <p>Hmm. Bei mir gibt es hier auch einen Fehler - wieder einmal ein Fehler im Interpreter. Der stürzt allerdings nicht ab, sondern meldet mir nur "Ich sehe hier kein."</p> <p>Normalerweise solltest du den Raum des geparsten Objekts nicht abfragen müssen, das macht der Parser schon. Mit dem oben angegebenen Code kannst du den Baum nicht außerhalb des Waldes untersuchen, aber du könntest jemanden, der den Baum nicht sieht, danach fragen.</p> <p>Dummerweise wird beim manuellen Parsen der Name des Objekts nicht angelegt, der ja auch total unsinnig sein könnte. Daher ist die Fehlermeldung falsch uns schreibt nichts. (Ich könnte mir vorstellen, dass durch schlechte Initialisierung hier Buchstabensalat statt nichts ausgegeben wird. Wie es hier zum der Absturz des Interpreters kommen kann, sehe ich allerdings nicht.</p> <p><strong>Zensunni:</strong></p> <blockquote> <p>ich hab schon versucht eine Raumabfrage in die IF-Schleife mit einzubringen, ...</p> </blockquote> <p>Das Problem kann man schon mit einer Raumabfrage umgehen:</p> <pre><code> Aktion ObjParser Ausf &nbsp; lokal x &nbsp; &nbsp; wenn &#40;roter_Baum hier&#41; dann &nbsp; &nbsp; leseArt m x &nbsp; &nbsp; leseAdj 'rot' m x &nbsp; &nbsp; wenn &#40;x&#41; und &#40;Wort = 'baum'&#41; dann &nbsp; &nbsp; &nbsp; nächstesWort &nbsp; &nbsp; &nbsp; sei aObj roter_Baum &nbsp; &nbsp; Ende &nbsp; Ende EndeAusf ``` Damit ist nun die fehlerhafte Fehlermeldung des Parsers umgangen, wenn ich den Baum dort anspreche, wo er nicht zu sehen ist, kommt die Antwort "Ich kenne 'roten' nicht." Weder sehr hilfreich noch korrekt. Um das zu reparieren definiert man eine Deko, die das von **ObjParser** gefundene Vokabular abfängt, und die nie zu sehen ist: </code></pre> <p>Deko roter_Baum_Deko</p> <p>Name 'rot^ Baum' m</p> <p>Adj 'rot'</p> <p>Subst 'baum' m</p> <p>Ort Nirwana</p> <p>Besch 'Ein Hilfsobjekt, das "roter Baum" außerhalb</p> <p> des Walds abfängt.'</p> <pre><code> Nun sollte alles funktionieren. Man kann den roten Baum auch als Gesprächsthema benutzen - dann jedoch muss man **roter_Baum** und **roter_Baum_Deko** abfangen, um sicherzustellen, dass das Thema überall - im Wald und außerhalb des Waldes - verstanden wird.</code></pre></div></td> |
Geschrieben um 14:50 am 01.09.2004 | Zitat | Editieren | Löschen | |
Mitglied Pupil Gumby Beiträge: 12 | Vielen Dank, jetzt funktioniert es perfekt Zitat:
Ich hab mich wahrscheinlich mal wieder undeutlich ausgedrück: Nicht der Interpreter stürzte ab, sondern das Spiel. Es wurde der gesamte Bildschirm gelöscht und oben links 'Ich sehe hier kein' und unten rechts ein '[...]' ausgegeben. Danach gab es keine Reaktionen mehr auf Tastendrücke irgendwelcher Art, und es blieb nur noch das gewaltsame Ende per Alt + F4. |