Textadventure in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drxt
User
Beiträge: 19
Registriert: Samstag 26. Januar 2008, 17:12

Hallo,

Ich möchte jetzt mal versuchen ein Textadventure in Python zu schreiben.
Aber ehrlich gesagt, ich habe noch nie eins gespielt...*wegduck*
Ich will das aber einfach versuchen, um die Benutzung von Klassen und Objekten ein bisschen zu üben.
Kennt jemand ein Textadventure, das in Python geschrieben ist?
Ich würde mir gerne mal angucken wie so ein Spiel aufgebaut ist, bzw. üben den Quelltext von anderen zu verstehen.

drxt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

drxt hat geschrieben:Kennt jemand ein Textadventure, das in Python geschrieben ist?
Ja.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
drxt
User
Beiträge: 19
Registriert: Samstag 26. Januar 2008, 17:12

Ups, habe den Thread ein bisschen hastig geschrieben und einfach nicht daran gedacht, dass es im Forum vielleicht schon einen Thread zu sowas gibt...sorry...

Trotzdem danke!

drxt
BlackJack

Ist das denn wirklich was Du willst? Unter Textadventure verstehe ich jedenfalls etwas anderes als Rouge & Co. Eben eher ein Programm mit viel Text und Geschichte. So etwas wie Zork oder The Hobbit.
drxt
User
Beiträge: 19
Registriert: Samstag 26. Januar 2008, 17:12

Ja, eigentlich habe ich ein Textadventure mit, nun ja, mehr Text gemeint.
Aber das Spiel, das Leonidas gepostet hat, ist auch gut...im Endeffekt ist es egal was ich versuche zu programmieren...Hauptsache ich kann daran ein wenig üben.
Außerdem kann ich dann das Textadventure-Genre und das Rogue-like-genre miteinander kombinieren und eine neues total innovatives Spiel erschaffen und damit eine Renaissance der textbasierten Spiele herbeiführen
:twisted: :twisted: :twisted:

...ok, der war billig :-|

drxt
BlackJack

Ein Rouge-like ist wahrscheinlich einfacher. Wobei ich da nicht den Programmieraspekt denke, sondern dass zu einem Textadventure eine wirklich gute Geschichte gehört, während man bei einem Rouge-like auch mit rumlaufen, kämpfen und Punkte sammeln recht weit kommt.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du hättest genauer lesen müssen! BlackJack meinte die inhaltliche Herausforderung - nicht die programmier technische ;)

Aber Du hast da eigentlich ein schönes Beispiel gegeben! Vor allem kann man das Stück für Stück verbessern. Also z.B. die "Daten" in eigene Dateien auslagern, einen echten Parser schreiben (basierend auf einer Grammatik), usw.

Aber zu Beginn sieht man sehr schnell etwas und kann das auch noch gleich nutzen :)
drxt
User
Beiträge: 19
Registriert: Samstag 26. Januar 2008, 17:12

Danke sma.
Aber im Moment sind meine Textadventure-Pläne erstmal auf Eis gelegt, bzw. die internationale Spielerschaft muss sich gedulden bevor sie mein volltolles Spiel zocken kann.

Ich habe gemerkt, dass ich zwar genug Wissen hätte das Spiel zu programmieren, der Aufwand mit meinen kleinen Kenntnissen aber zu groß wäre. da ich viele Feinheiten noch nicht beherrsche, mir aber vor allem die Kenntnis zu vielen Funktionen (oder heißt das Methoden? Ich lese immer wieder beide Begriffe. Was ist richtig? Sind sie äquavalent?) nicht habe.

drxt
BlackJack

Ganz grob: Auf Modulebene und innerhalb von Funktionen oder Methoden definiert man Funktionen und in einer Klassendefinition definiert man Methoden.

Äquivalent ssind beide in dem Sinne, dass es beides "callables" sind, also aufrufbare Objekte. Was beide mit Klassen gemeinsam haben.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

BlackJack: Rouge != Rogue ;)
Antworten