Elegantes Kommando-Parsing in einem OOP-basierten Textspiel

8

Ich spiele mit Ruby ein MUD / Text Adventure (bitte lach nicht). Kann mir jemand irgendwelche Hinweise auf eine elegante, auf OOP basierende Lösung zum Parsing von Eingabetext geben?

Wir reden hier von nichts Komplizierterem als "Zauberstab auf den Tisch legen". Aber alles muss weich sein; Ich möchte den Befehlssatz später schmerzfrei erweitern.

Meine aktuellen Gedanken, etwas vereinfacht:

  1. Jede Objektklasse (Box, Tisch, Raum, Spieler) weiß, wie man einen Befehl erkennt, der 'dazu gehört'.

  2. Die Spielklasse versteht eine Art domänenspezifische Sprache mit Aktionen wie "Objekt X in Objekt Y verschieben", "Beschreibung von Objekt X anzeigen" usw.

  3. Die Spielklasse fragt jeden Gegenstand im Raum, ob er den Eingabebefehl erkennt. Zuerst zu sagen, gewinnt.

  4. Er übergibt die Steuerung an eine Methode in der item-Klasse, die den Befehl verarbeitet. Diese Methode umformatiert den Befehl in der DSL und gibt ihn an das Spielobjekt zurück, um es auszuführen.

Es muss ausgetretene, elegante Wege geben, dieses Zeug zu machen. Ich kann allerdings nichts googeln.

    
Shadowfirebird 05.02.2010, 12:37
quelle

5 Antworten

3

Das Interpreter Design Pattern ist der am meisten objektorientierte Ansatz zum Parsen, dass ich Ich bin mir dessen bewusst, aber ich bin mir sicher, dass Compiler-Experten auf Algorithmen hinweisen werden, die mächtiger sind.

    
Mark Seemann 05.02.2010, 12:45
quelle
2

Klingt so, als ob Sie einen Parser brauchen.

Teilen Sie die Eingabezeichenfolge in Token (Wörter). Dann füttern Sie die Token nacheinander in eine Zustandsmaschine. Ich finde, dass die Push-Down-Automaten eine ziemlich intuitive und mächtige Art ist, ein solches STM zu schreiben.

    
troelskn 05.02.2010 13:22
quelle
1

Für Befehlsinterpreter mag ich dieses einfache, nicht so elegante Muster. Muster in dynamischen Sprachen enthalten weniger Kästchen und Linien als GOF-Muster.

%Vor%

Auf diese Weise fügt ein neuer Befehl nur eine neue Methode hinzu. Keine Tabellen oder Case-Anweisungen müssen angepasst werden.

    
Wayne Conrad 05.02.2010 12:54
quelle
0

Teilen Sie es in Token als das Format wird immer sein:
[Befehl] [Objekt1] ([Bezug] [Objekt2])

Sie könnten method [command] auf dem [object1] in Ihrem Raum aufrufen und ihm ggf. [object2] übergeben.

    
dbemerlin 05.02.2010 12:46
quelle
0

Ok. Du brauchst also eine Semantik? (Drehen ist eine Handlung, zünde ein Objekt an, auf ein Argument ... (Ich beziehe mich auf deinen Kommentar zu dbemerlin)).

Warum nicht eine Grammatik definieren? Hum ... Ich denke, Lex und Yacc sind keine Option? (da es überhaupt kein OOP ist, sondern das, was Sie tun wollen, ist, Benutzereingaben zu "kompilieren", um etwas zu erzeugen - einen Code auszuführen, der die Daten des Raums ändert und ein Ergebnis ausgibt)

Sie können ein OOP-Design für Ihr Objekt und seine Aktion erstellen (so wie alle Objekte eine .describeMe () -Methode haben ..) und daneben einen Eingabe-Parser + Compiler.

Bin ich völlig auf das Thema?

Edit: Nachdem Sie auf das Interpreter-Pattern von Marc Seeman geschaut haben, scheint es der Weg zu sein, den Sie in OOP haben wollen. (Aber Sie werden das Rad etwas neu erfinden)

    
Antoine Claval 05.02.2010 13:10
quelle

Tags und Links