"In Java Code übersetzen" stimmt so nicht ganz.
Gehen wir das Problem mal etwas systematischer an:
Der Spieler soll mehrere Ausgaben erhalten. Zwischendurch soll er die Möglichkeit haben, aus einer von mehreren Optionen auszuwählen. Die Story, die der Spieler erhalten soll, soll zufällig ausgewählt werden (?).
Es reicht also, wenn du eine einzige Klasse
Story schreibst, bei der jede Instanz dieser Klasse eine andere Story darstellt. Dabei muss diese dann irgendwie diese Einzelteile, also normale Ausgaben und Abfragen, speichern können. Auch wäre es ganz gut, wenn die Stories dann aus einer oder mehreren Dateien ausgelesen werden könnten.
Ich denke, dass nachfolgende Punkte der Reihe nach abgearbeitet werden können:
- Um das Ganze etwas einfacher anzugehen, wäre die einfachste Möglichkeit erstmal, dafür zu sorgen, dass eine Story einen Text beinhalten kann (noch ohne irgendeine Verzweigung).
- Da du, so wie es mir scheint, noch nicht viel mit Dateien gearbeitet hast, wäre es eine gute erste Übung, diese Story in eine einfache Textdatei auszulagern, aus welcher diese ausgelesen wird, damit sie dann "Abgespielt" werden kann.
- Nun könnte man sich überlegen, dass der Nutzer nicht unbedingt den ganzen Text mit einem einzigen Mal vorgesetzt bekommen möchte, sondern erst, wenn er soweit mit lesen fertig ist. In normalen Fließtexten hat man neben Kapiteln und Seiten auch eine Unterteilung mit Hilfe von Absätzen, also wäre es doch ganz gut, wenn auch die bisher vermutlich nur als ein einziger String vorliegende Story in mehrere Abschnitte aufgeteilt wird. Diese könnten dann in Form eines Arrays oder einer Liste vorliegen, bei der nach der Ausgabe eines jeden Abschnitts auf eine Benutzereingabe gewartet wird. Um dies aus der Datei erkennen zu können, könnte entweder jeder Zeilenumbruch oder jede Leerzeile (2 Zeilenumbrüche) zur Abgrenzung der Abschnitte verwendet werden.
- Wie ich oben schon erwähnt habe, gibt es ja auch Überschriften (die im Falle der Konsole wohl mit mehreren Bindestrichen oder mehreren Gleichheitszeichen unterstrichen sein könnten). Eine noch relativ einfache Art, diese umzusetzen, könnte sein, dass diese immer mit einem Gleichheitszeichen anfangen und dann bei der Ausgabe entsprechend anders formatiert werden. aber bevor du dich um die Umsetzung davon kümmerst: so langsam dürfte auffallen, dass eine Story aus ziemlich vielen Dingen besteht: Absätze, Überschriften, später auch die ersehnten Auswahlmöglichkeiten und ganz später vielleicht auch noch weitere Dinge, wie Bilder, Aufzählungen usw. All das sind "Bestandteile" der Story, also könnte man doch überlegen, ob man dafür nicht auch eine entsprechende Klassenstruktur anlegt: Es könnte die abstrakte Basisklasse bzw. das Interface StoryElement vorhanden sein, wovon StoryParagraph, StoryHeadline und später dann auch StoryChoice abgeleitet sein könnten. Vorerst dürfte dies für Abschnitte und die Überschriften genügen.
- Nun also zu dem, was du eigentlich schon die ganze Zeit drin haben wolltest: die Auswahlmöglichkeiten. Diese sind nicht ganz so einfach, die die Absätze bzw. die Überschriften. Vorweg erstmal: eine Auswahlmöglichkeit wird eigentlich immer durch eine Frage oder eine Aufforderung eingeleitet. Dann gibt es ein paar Optionen, unter den man auswählen kann und je nach Option passiert wahrscheinlich auch ein bisschen was anderes. Vorerst ist es wohl erstmal genug, wenn die Speicherung in der Datei so angepasst wird, dass auch die Auswahlmöglichkeiten gespeichert werden sollen. Man könnte nun einfach sagen, dass eine Auswahlmöglichkeit immer mit einem Fragezeichen und die Optionen mit einem Bindestrich oder einer Raute o. ä. eingeleitet werden, aber was passiert dann mit den Absätzen, die bei einer bestimmten Option ausgeführt werden sollen? Sie sollten wohl am ehesten auch nach der Option stehen, zu der sie gehören, nur könnte es da Probleme geben, wenn zwischendurch eine weitere Entscheidung ansteht, da dann die noch folgenden Optionen zu dieser Entscheidung gehören. Es wäre auch möglich, dass die Elemente unterhalb einer Option eingerückt werden, aber da muss man dann beim Bearbeiten aufpassen, dass die Einrückung auch immer die richtige ist. Statt sich ein so eigenes Format weiterhin auszudenken, könnte man auch den Rat beherzigen, der hier bereits gegeben wurde: man könnte doch eine XML-Datei anlegen, die die Story speichert. exemplarisch könnte das ja dann so aussehen:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<story>
<p>Es ist ein wunderhübscher Tag</p>
<choice title="Finden Sie nicht auch?">
<option title="Ja, und ob!">
<p>Es ist immer wieder schön, gleichgesinnte zu treffen</p>
</option>
<option title="Nein, wie kommen Sie denn auf diese Idee!?">
<p>Für diese Frechheit wirst du in der Hölle schmoren!!!</p>
<p person="well-that-escalated-quickly-guy">Well, that escalated quickly!</p>
</option>
</choice>
<p>Auf wiedersehen</p>
</story>
|
Es gibt verschiedene Möglichkeiten, eine XML-Datei in Java zu parsen, allerdings dürften sich diese im Wesentlichen in 2 Gruppen einteilen lassen: solche, bei denen der Dateiinhalt durchgegangen wird und man jedes Mal Bescheid bekommt, wenn ein öffnender Tag auftauchte, ein schließender Tag auftauchte usw. und solche, bei denen Java-Objekte anhand der XML-Struktur aufgebaut werden. Letzteres würde ich als einfacher ansehen. Eine Bibliothek dafür wäre JDOM. Damit das Ganze aber, unabhängig davon, ob XML oder eigenes Format, ein wenig einfacher wird, sollte man den Punkt, dass eine Option wiederum Storyelemente beinhaltet außen vor lassen. Es würde reichen, mit entsprechenden Klassen für die Auswahl und die Optionen erstmal nur dafür zu sorgen, dass die Frage dem Nutzer gestellt wird, er die Optionen eingeblendet bekommt und sich für eine entscheiden kann. (Nach Möglichkeit wird die Auswahl auch ausgegeben.)
- Danach kannst du dich dann auch daran machen, dafür zu sorgen, dass abhängig von der ausgewählten Option etwas passiert. Um genauer zu sein: das, was sich innerhalb der Option befindet, soll dann ausgeführt werden, wenn die Option ausgewählt wird. Idealerweise ist es dann schon möglich, eine Auswahl in eine Auswahl zu legen.
Eigentlich dürfte damit bereits das erledigt sein, was du eigentlich haben wolltest, aber das heißt noch lange nicht, dass nichts mehr gemacht werden kann: Es könnte beispielsweise dafür gesorgt werden, dass an einer bestimmten Stelle der Inhalt einer anderen Datei verwendet wird, dass es einen gewissen Zustand gibt, der sich im Laufe der Geschichte verändert (beispielsweise könnte irgendwie gespeichert werden, wie man sich an einer bestimmten Stelle entschieden hat oder wie "gut" bzw. "schlecht" die Antworten waren. Abgesehen davon gibt es bestimmt noch viele weitere Dinge, aber sobald die Liste erstmal umgesetzt ist, fliegen die dir bestimmt wie von selbst zu.
Bitte versteh mich nicht falsch: ich will nicht behaupten, dass das der einzig wahre Weg ist, wie du vorgehen kannst, zumal man sich wegen der Benennungen streiten kann, allerdings würde ich mir denken, dass es so funktionieren könnte.