Ein kleiner Text-Adventure-Automat in C++ (interaktive Einführung)

05.11.2013

C++ ist eine weit verbreitete Programmier-Sprache, die es erlaubt die Vorgehensweise des Programms sehr genau (auf Low-Level) zu bestimmen was einerseits sehr genaue Kontrolle über das Programm ermöglicht (wichtig, um besonders effiziente Programme zu schreiben) und einen viel besseren überblick darüber verschafft, was das Programm macht aber anderseits leider oft unhandlich und umständlich zu handhaben und besonders für Anfänger schwer verdaulich ist (z.B. da auch die Speicherverwaltung programmiert werden muss). Im Folgenden soll gezeigt werden, wie schon mit einer Seite Quellcode ein verhältnismäßig müächtiges Programm geschrieben werden kann: Ein Textadventure-Automat.

1

Das hier beschriebene Text-Adventure ist im wesentlichen die Umsetzung eines Spielbuchs, einer interaktiven Geschichte im folgenden synonym verwendet) mittels eines Computer-Programms. Um das Prinzip anschaulischer zu machen, ist dieser Artikel selbst als interaktiver Text verfasst.

  • Ist dieses Konzept bereits bekannt so geht es weiter bei 3.
  • Ansonsten gibt es weitere Informationen dazu hier: 4.

2

Achtung: dies ist ein unerreichbarer Abschnitt, der nur als Fehlermeldung existiert. Nur wer wie gewohnt linear liest (oder einfach neugierig ist), landet hier. Bitte diesen Text nicht der Reihe nach lesen, sondern den den Entscheidungen zugeordneten Nummern folgen!

3

Ein Interaktiver Text funktioniert im Wesentlichen wie ein Hypertext. Im Web lässt uns der Klick auf einen Link zur verlinkten Seite springen. Hier ist es ganz ähnlich: jede Entscheidung entspricht einem Link. Nur das bei einem Spielbuch die lesende Person die Links manuell ausführt.
Eine einfache Möglichkeit, aus einem Spielbuch eine "elektronische" Version zu erzeugen, ist tatsächlich es als HTML Dokument abzuschreiben und jede Entscheidung auf die zugehörige Station zu verlinken.

  • Zu einfach? Dann weiter mit 8.
  • Lieber doch etwas Theorie? Weiter bei 7.

4

Der Text der Geschichte ist in numerierte Abschnitte unterteilt (im folgenden Stationen genannt). Die Geschichte beginnt mit der ersten Station. Ist eine Station gelesen, so gibt es eine Entscheidung zu treffen. Diese bestimmt bei welcher Stations-Nummer es weitergeht.

  • Wenn soweit alles klar ist, geht es weiter bei 6.
  • Immer noch keine Ahnung, worum es geht? Weiter bei 5.

5

Vielleicht ist es jetzt besser, diesen Artikel zur Seite zu legen und stattdessen Beispiele auszuprobieren. Etwa die Spielbücher der Fighting Fantasy Reihe oder das Text-Adventure Zork. Zwischendurch für den Überblick ein kurzer Besuch bei Wikipedia mit Lektüre von http://de.wikipedia.org/wiki/Textadventure.

Übrigens gibt es sogar Lehrbücher nach diesem Prinzip, wie etwa KLEPPNER und RAMSEY: Lehrprogramm Differential- und Integralrechnung...

ENDE

6

Manche beginnen lieber mit der Theorie, andere mit der Praxis.

  • "Wie mache ich es elektronisch?!" hier entlang 3.
  • "Welche theoretischen Ansätze stecken dahinter?!" da entlang 7.

7

Ein Spielbuch bzw. Textadventure ist ein schönes, konkretes Beispiel für die abstrakte, mathematische Struktur Graph (genauer gesagt: gerichteter Graph). Einen Graphen kann man sich wie ein Netz vorstellen, das aus Knoten (hier: Stationen) besteht, die durch Kanten (hier: Entscheidungen) verbunden sind.

Noch etwas genauer betrachtet handelt es sich hier um einen deterministischen endlichen Automaten, kurz DEA (bzw. engl. DFA). Aus diesem Blickwinkel heiflen die Stationen/Knoten Zustände. Jede Entscheidung stellt aus dieser Sicht eine Eingabe dar, die den Automaten veranlasst, eine Transition durchzuführen, also den Zustand (bzw. hier: die Station) zu wechseln.

  • "Wie war das nochmal mit dem praktischen Ansatz?" Hier...8.
  • "Ok, das reicht für heute!" siehe 5.

So sieht der Graph/DEA dieses interaktiven Textes aus.

8

Eine nicht ganz triviale aber flexiblere und erweiterbare Möglichkeit besteht darin, einen Automaten (bzw. sehr vereinfachten Interpreter) zu programmieren, der uns das manuelle "blättern" im interaktiven Text abnimmt. Um nicht bei jeder Änderung der Geschichte das Programm umschreiben zu müssen,
befindet sich die Geschichte in einer einfachen Text-Datei, z.B. story.txt.

  • Die Beschreibung der story.txt findet sich hier 9.
  • Mehr zur Programmierung des Automaten gibt es hier 10.

9

Die Datei story.txt hat folgenden Aufbau:

Jede Station besteht aus drei Zeilen mit jeweils einer Nummer am Anfang gefolgt von einem Text und abgeschlossen mit Zeilenumbruch. Die erste Zeile enthält die Nummer der Station und einen Beschreibungs-Text. Die zweite und dritte Zeile beschreiben die Entscheidungen (um die Sache nicht zu verkomplizieren nur zwei) und enthalten je die Ziel-Station der Entscheidung und einen Beschreibungs-Text. Die vierte Zeile ist jeweils leer und dient der optischen Abgrenzung.


Kurzes Beispiel einer möglichen story.txt...
(der End-Zustand ist hier mit einem negativen Wert gekennzeichnet)

... und Visualisierung des Story-Graphen.
  • Noch etwas Geduld? Weiter bei 10.
  • Ungeduldige lesen gleich den Quell-Text: 11.

10

Der Automat besteht zunächst aus einer Hauptschleife, die pro Zustandänderung/pro Entscheidung (d.h. Wechsel von einer Station zur nächsten) einmal durchlaufen wird, bis der Endzustand erreicht ist.

In der Variable CurrentStation steht die Nummer der aktuellen Station.

Bei jedem Durchlauf der Hauptschleife wird (ineffizient aber einfach) die gesamte story.txt durchgelesen, bis der Abschnitt mit der aktuellen Stationsnummer gefunden wurde. Nach Ausgabe des Beschreibungstextes für die Station und die Entscheidungen (es gibt keine Ausgabe der Stationsnummern, diese beschreiben die Struktur des Story-Graphen und sind nur zur Verabreitung durch den Automaten gedacht) darf der Spieler entweder 1 oder 2 eingeben. Der Automat setzt CurrentStation auf den der Entscheidung zugeordneten Wert, dann wird die Schleife wiederholt.

  • "Wie war das nochmal mit der Theorie?" Hier...7.
  • "Und, wie programmiere ich das Ding jetzt?" Zum Source-Code...11.

11 ENDE


Der Quellcode des Text-Adventure Automaten passt bequem in 65 Zeilen