Diese Spielwelt lässt sich prima durch die objektorientierte Brille betrachten. Besser noch als "orthodoxe" klassenbasierte Programmiersprachen funktionieren hier prototyp-basierte, die ihre "traits" beliebig zur Laufzeit austauschen können. So etwas könnten wir uns aber schnell auch in Python bauen ().
Klassenbasiert ist aber auch OK: Wir können einen Raum als etwas mit einem Namen und einer Beschreibung definieren, das Gegenstände (und den Spieler) aufnehmen kann und Verbindungen (zu anderen Räumen) hat. Auch ein Gegenstand hat einen Namen und eine Beschreibung und kann optional andere Gegenstände enthalten. Vielleicht kann man Gegenstände nehmen, weglegen, zerbrechen, schieben, auf sie oder in sie klettern, benutzen oder lesen, trinken, usw. Verbindungen haben eine Richtung, vielleicht auch eine Beschreibung und führen schließlich zu anderen Räumen, vielleicht abhängig von einer Bedingung. Um gute Beschreibungen zu erzeugen will man von Gegenständen (und Räumen) wahrscheinlich noch wissen, mit welchem Artikel sie geschrieben und wie dekliniert werden sollen. Und, um nicht laufend "ich verstehe nicht" ausgeben zu müssen, gibt es vielleicht Synonyme und abkürzende Schreibweisen, die man jeweils definieren kann. Das ist aber nicht weiter wichtig.
Ich kann eine Mini-DSL entwickeln, um meine Welt zu beschreiben:
Code: Alles auswählen
def room(name, desc):
rooms[name] = Room(name, desc)
def item(name, desc, location, *traits):
items[name] = Item(name, desc)
items[name].location = location
items[name].add_traits(traits)
def connect(dir, room1, room2):
room1.add_connection(Connection(dir, room1, room2))
room("Kabine", "Kabinen an Bord eines Raumschiffs...")
room("Bad", "Wie eine Kabine, ist auch das ...")
item("Broschüre", "Sie beschreibt...", "Kabine")
item("Bett", "...", "Kabine", fixed, supporter)
item("Spiegel", "...", "Bad", scenery)
item("Dusche", "...", "Bad", fixed)
connect("osten", "Bad", "Kabine")
connect("westen", "Kabine", "Bad")
connect("auf/in", "Kabine", "Bett")
items["Bett"].alias = "Möbel"
Die Programmiersprache "Inform 7" (http://inform7.com/) kann obiges stattdessen quasi natürlich-sprachlich darstellen (allerdings wohl nur auf englisch):
Code: Alles auswählen
Die Kabine ist ein Raum. "Kabinen an Bord eines Raumschiffs..."
Das Bad ist östlich von der Kabine. Die Beschreibung ist "Wie eine Kabine, ist auch das Bad..."
Die Broschüre ist in der Kabine. "Sie beschreibt die Herrlichkeit..."
Das Bett ist in der Kabine.
Das Bett ist ein betretbarer Raum.
Setze "Möbel" mit Bett gleich.
Der Spiegel ist Kulisse im Bad.
Die Dusche ist hier. Sie ist unbeweglich.
Finde ich "(wort+) ist eine? (wort)\.", weiß ich, dass hier ein Ding definiert werden soll. Das erste ist der Name des Dings (und ich kann im Deutschen die schwierige Grammatik angehen und gleich mal das Geschlecht erkennen), das zweite sein Typ. Folgt jetzt ein String, ist das eine Abkürzung und gemeint ist die Beschreibung. Finde ich "(wort+) ist|liegt|(?:befindet sich) (richtung) von (wort+)\." kann ich einen weiteren Raum definieren und mit einem anderen verbinden. Aus "ist in" kann ich schließen, dass ein Gegenstand definiert werden soll. Spannend sind Dinge wie "ist hier". Damit muss man wissen, was gerade der aktuelle Raum ist. Bei "Sie ist" muss ich auch den aktuellen Gegenstand kennen.
Wie würdet ihr das Problem angehen?