Auch ich würde unter einem Textadventure nicht etwas wie Rogue verstehen, sondern sowas (Meine Eingaben stehen hinter ">", der Rest kommt vom Computer):
Code: Alles auswählen
Dead end
You are at a dead end of a dirt road. The road goes to the east.
In the distance you can see that it will eventually fork off. The
trees here are very tall royal palms, and they are spaced equidistant
from each other.
There is a shovel here.
>take shovel
Taken.
>go north
You can't go that way.
>east
E/W Dirt road
You are on the continuation of a dirt road. There are more trees on
both sides of you. The road continues to the east and west.
There is a large boulder here.
>
So ein Spiel ist eigentlich recht einfach zu schreiben - und es kann ein gutes Beispiel für objektorientierte Programmierung sein. Ich teile nicht BlackJacks Einschätzung, dass ein Rogue-like einfacher zu entwickeln ist. Ein Textadventure funktioniert ungefähr so:
Es gibt Orte (Location) und Gegenstände (Item) und Befehle (Command). Ich bin jeweils an einem Ort und kann mittels Befehlen zwischen Orten wechseln oder mit Gegenständen interagieren. Orte haben eine (stimmungsvolle) Beschreibung und eine Liste von Ausgängen (Exit) zu anderen Orten. Außerdem enthalten sie Gegenstände. Gegenstände können Eigenschaften (Properties) haben. Interaktionsmöglichkeiten sind aufheben, wegwerfen, benutzen, öffnen, lesen, usw. Ich habe außerdem eine Liste mit aufgehobenen Gegenstände, die ich mit mir von Ort zu Ort tragen kann.
Die Herausforderung ist nun, dem Anwender Rätsel oder andere Aufgaben zu stellen, die er lösen muss. So muss er beispielsweise herausfinden, dass er eine Truhe mit einem bestimmten Schlüssel nur öffnen kann, wo ein Seil drin ist, welches benötigt wird, die Felswand hochzuklettern, um... Das Prinzip sollte klar sein.
So könnte man ein Spiel definieren:
Code: Alles auswählen
def_location(
'im garten',
'ein düsterer Garten in dem allgegenwärtige Rosenbüsche einen schweren Duft verbreiten',
['Schlüssel'],
{'norden': 'vor dem Haus'}
)
def_location(
'vor dem Haus',
'ein staubiger Platz vor einem alten Herrenhaus, an dessen Wänden wilder Wein wuchert',
['eingangstür'],
{'süden': 'im garten'}
)
def_item('Schlüssel', 'Ein alter rostiger Schlüssel')
def_item('Eingangstür', 'Eine schwere hölzerne Tür', locked=True)
def_verb('öffne', 'öffnen', 'geöffnet')
def_verb('nimm', 'nehmen', 'genommen')
def_action('nimm', 'Schlüssel', take_item)
def_action('öffne', 'Eigangstür', open_door)
def take_item(verb, noun):
if noun in here.items:
if noun.locked:
print "Du kannst %s nicht nehmen" % noun
else:
print "Du nimmst %s" % noun
here.items.remove(noun)
inventory.append(noun)
else:
print "Hier ist kein %s" % noun
def open_door(verb, noun):
if item('Schlüssel') in inventory:
if noun.open:
print "Die %s is bereits offen" % noun
else:
print "Du schließt die %s auf" % noun
noun.open=True
here.exits['betrete'] = 'Eingangshalle'
else:
print "Die %s ist verschlossen" % noun
Mit def_location kann ich einen Ort definieren:
Code: Alles auswählen
locations = {}
def def_location(name, description, items, exits):
locations[name] = Location(name, description, items, exits)
def location(name): return locations[name]
Auf ähnliche Weise kann ich Gegenstände, Verben und Aktionen definieren. Letztes bildet eine Verb + Gegenstand-Kombination auf eine Python-Funktion ab (Stichwort generische Funktion bzw. Multimethode).
Gibt jetzt der Benutzer etwas ein, versuche ich zu verstehen, was das meint und handle entsprechend.
Code: Alles auswählen
def execute(command):
words = command.split()
if len(words) == 1:
word = words[0]
if word = 'inventory':
if inventory:
print "Du trägt diese Gegenstände bei dir:"
for i in inventory: print i
else:
print "Du trägst nichts bei dir."
elif word in here.exists:
print "Du gehst nach %s" % word
here = location(here.exists[word])
print here.name
print here.description
else:
print "Ich verstehe nicht."
elif len(words) == 2:
verb, noun = words
if verb in actions:
if noun in items:
actions[verb].get(noun, cannot)(verb(verb), item(noun))
else:
print "Was ist ein %s?" % noun
return
print "Was soll '%s' bedeuten?" % command
def cannot(v, n):
print "Ich kann das nicht %s: %s" % (v.stem, n)
Stefan