Textadventure programmieren
-
Ich möchte ein Textadventure programmieren und habe keine Ahnung wie das geht. OK, das hört ihr hier bestimmt ziemlich oft, ich habe aber schon ein paar Vorüberlegungen angestellt (und mir natürlich acuh eine Story etc. ausgedacht - aber das ist ja ein anderes Thema)
Das Adventure soll nur mit Eingabe von Zahlen steuerbar sein. Ob bei der Steuerung von der Spielfigur oder bei Dialogen soll ein System zugrunde gelegt werden (am Beispiel erklärt):
"Du bist in einem Raum. Was willst du tun?
1. Wand einhauen
2. Verstand verlieren
3. Durch die Tür rausgehen"-- So, jetzt ist der Spieler dran. Er muss eine der drei Zahlen eingeben. Wir nehmen man für seine Eingabe die Variable x. Meine Überlegung:
Durch die Eingabe von 1 soll der Effekt a passieren (irgendein Text wird eingebelendet) und es sollen dann nur noch die beiden Möglichkeiten 2 und 3 dastehen, dann natürlich aber als 1 und 2 betitelt.
Durch die Eingabe von 2 komm der Effekt b, nur noch ein 1 und 3 sollen stehenbleiben, betitelt als 1 und 2.
Durch die Eingabe von 3 soll das Spiel enden.
Durch die Eingabe einer anderen Zahl soll das Programm sagen: Das geht nicht oder so-- Das kann man jetzt natürlich als ein Ast-System darstellen, in diesem Fall würde es ja gehen, aber Ast-Systeme sind nach einiger Zeit viel zu kompliziert
Deshalb meine Idee:
Am Anfang definiert man, sagen wir, 10 "Platzhalter". Jeder Platzhalter [ich nenn die hier mal und p1, p2 und so weiter, asoo p(x)] soll dann ausgeführt werden, wenn der Spieler die entsprechende Zahl eintippt. Den Platzhalter ordnet man halt Effekte zu.
Das Problem ist aber, dass man entweder ein Ast-System aufsetzten müsste oder ein simples Adventure programmieren müsste. Man könnte doch aber auch ein mehr oder weniger dynamisches System machen:In unserem Beispiel wären drei Antwotmöglichkeiten da. Um es dynamisch zu halten müssen wir also schreiben:
Wand einhauen
Verstand verlieren
Durch die Tür rausgehen
Man müsste halt festlegen wieviel antwortmöglichkeiten es gibt. sagen wir mal mit der Variable am
am ist in diesem Fall drei, also ordnet das programm den antworten die entsprechende zahl zu, also:
1. Wand einhauen
2. Verstand verlieren
3. Durch die Tür rausgehen
da am=3 ist, sind p1=a,p2=b und p3=c . Alle anderen p-Platzhalter sollen natürlich nicht angezeigt werden.Wenn man 1 anwählt, soll der Effekt a kommen und danach nur noch die beiden anderen Möglichkeiten anwähbar sein, also quasi:
Wenn x=1 ,dann a, dann am=am-1
Die Platzhalter müssten dann natürlich entsprechend umdisponiert werden
a=p(2-1), c=p(3-1) und die Effekte müssten dementspechend "mitkommen". Das x in diesem Fall steht für "ist zugeordent zu"Wenn man 2 anwählt ist das im prinzip das gleiche, nur dass man beachten muss, dass 1 da bleibt und nur die 3 sich verändert, also:
Wenn x=2 ,dann b, dann am=am-1, dann gilt für alle p(x>2): p(x)=p(x-1)Ich hoffe das war jetzt einigermaßen verständlich
Wenn man das System befolgt, kriegt man ein dynamisches adventure, in dem man jederzeit in dialogen eine antwortmöglich wegnehmen kann, eine hinzufügen und eine ersetzten kann, und man muss sich nicht mit einem komplizierten ast-system rumschlagen
Wenn man im Adventure in einem raum ist oder mit einer Person spricht oder ins inventar guckt, werden den p-Variablen entsprechend neue Sachen zugeordnet.
Außerdem sollten mein adventure diese features haben:
- man soll ein inventar haben
- man soll jederzeit speichern könnenJetzt meine Frage: Gibt es ein Programm mit dem man ähnlich dynamisch und flexibel programmieren kann?
Habt ihr vielleicht mal so etwas änliches programmiert? Ist sowas überhaupt möglich?Wenn ihr irgendwelche programmteile habt könnt ihr die reinposten - ich habe ein compiler und weiß wie man ein programm zum laufen bringt (immerhin)
Alles würde mir helfen. Schon mal danke im Voraus.
-
Also das erste geht mit Funktionspointern ( einfach ein Array machen, dann kannst du es immer einfach neu belegen )
Inventar ist auch recht einfach, ne verkettete Liste sollte reichen
Und speichern sollte auch nicht so schwer sein, aber da du ja kein Astsystem willst, musst du u.U. recht viel speichern (oder auch nicht, kommt ganz aufs Konzept an)
Weil du speichern willst, solltest du aber immer für jeden Raum oder Dialog eine Statusvariable haben, die angibt, was im Array (siehe 1) zu stehen hat.Wenn du das alles hast, brauchst du nur Massen und noch mehr Massen von Unterklassen, da jeder einzelne Raum und jede Person andere Funktionen (so stell ichs mir jedenfalls vor) ansprechen.
Je nachdem, was für Funktionen du machst, kommst du auch mit weniger aus.
-
ich würde es so machen:
den aktuellen raum/ort speicherst du als zahl
zB man fängt bei 1 an
eine switch-abfrage packst du in eine schleife rein und in diesem fall nimmst du case 1: ...dann schreibst du sachen und fragst per cin >> die gewünschte möglichkeit
zB:
1. Küche
2. Badezimmer> Eingabe...
per if springst du dann zum nächsten raum:
if (eingabe==1)
{ raum=2 }
else
{ raum=3 }und so weiter

-
vielleicht hilft das hier etwas :
http://www.emco-systems.de/docjunior/Tutz/tutonadv.docIst allerdings schon etwas älter..
-
du machst es dir viel zu schwer, ein paar dinge die du nutzen solltest, wären strings und datadrivendesgin. (google dein freund)
stell dir das ganze als sammlung von html seiten vor.
statt html nimm einfach txt
es gibt also deine txt-screens auf denen du deinen text hast und unten stehen die möglichen antworten (ebenfalls in den txt schon eingegeben).
wenn man nun auf eine zahl klickt, ist es als ob du nen link klickst. du mußt also in der txt datei, eventuell gleich am anfang, in z.b. den ersten 10 zeilen links stehen haben.
eine bsp txt datei
dubisttod.txt dubistderpimp.txt sielachtdichaus.txt derdrachefrisstdich.txt hier steht ein geiler text von wegen drache und so... blabla... rette die princessin, wie schlägst du zu 1. mit der gabel 2. mit ner flaggun 3. mit dem rosatütü 4. du streust salz über dich damit du appetitlich wirkstje nachdem was der spieler nun drückt lädst du eine der dateien ein und zeigst diese wiederrum an.
so kannst du schonmal eine interaktive story erzählen, aber so hast du noch nicht ganz ein adventure.
was du nun brauchst ist ein methode um dir zu merken was passiert ist, mit wem man geredet hat, was für gegenstände man im inventar hat, die antwort darauf ist
std::map<std::string,int> Memory;daran kannst du dir eigenschaften speichern und den status. z.b.
Memory["Mit Barman geredet"] = 1; Memory["Gummiente bekommen"] = 1; Memory["Goldmuenzen gefunden"] = 128; Memory["Fechten gelernt"] = 1; ...so, wie steuert man das nun. natürlich auch datadriven.
wir erweitern die obere idee der textdatei indem wir ein wenig struktur einbringen
1. taste 2. link 3. Eigenschaft 4. Zuweisung 5. Eigenschaft 6. Zuweisung LEERZEILE 1. taste 2. link 3. Eigenschaft 4. Zuweisung 5. Eigenschaft 6. Zuweisung LEERZEILE . . . LEERZEILE LEERZEILE der blablabla text der angezeigt wird mit der auflistung der möglichkeitennun mußt du also immer erst die taste einlesen z.b. "1"
dann den link, also den dateinamen der txt die du laden mußt
dann jeweils einen eintrag aus Memory sowie den dann zugewiesenen wertbsp
1 tuerauf.txt schluessel 0 2 treppehoch stolpern 1 entscheide dich ob du die rutschige treppe hinaufsteigst oder es mit der tuer zum lift versuchst 1.tuer vom lift 2.treppetja, aber interaktiv ist es immer noch nicht, da fehlt ein wenig, das bekommst man mit ein wenig mehr arbeit auch leicht hin, der link zu den einzelnen txt bekommt den wert der eintraege. am besten an einem beispiel zu sehen
1 tuerauf[schluessel].txt 2 zurueckzumlabirinth.txt moechtest du dir tuer oeffnen oder im labirinth weiter nach dem schluessel suchen 1.tuerauf 2.labirinthdu macht also nun 2 txt dateien mit namen
tuerauf0.txt
und
tuerauf1.txt
bevor du die obere tuerauf[schluessel].txt lädst, ersetzt du alles von [ bis einschliesselich ] mit dem eintrag aus Memory für das wort das dazwischen steht, in diesem falle schluessel.
falls nun dieser "schluessel" im inventar ist, wird der dateiname zu tuerauf1.txt darin kannst du dann ebenfalls wieder nen screen machen indem du sagst dass der spieler erfolgreich war
wenn der dateiname zu tuerauf0.txt wird, weil der spieler den schlüssel noch nicht hat, kannst du dem spieler in der tuerauf0.txt sagen "kein schlüssel, tür bleibt zu, such weiter"...wenn du die simplen sachen einbaust (dauert für jemanden der c++ grundlegend kann ca 1monat spartimework), kannst du ohne programmieren textadventure machen so groß wie du es dir wünscht.
-
@rapso
willst du darüber nicht einen artikel für das c++ magazin schreiben
-
Danke erstnal für die Antworten.
Ich habe aber trotzdem eine Frage: Wenn man das System mit den Links benutzt, wird das nach einiger Zeit nicht sehr kompliziert?
Natürlich, wenn man einfache Bedingungen und einfache Rätsel einbaut, geht das.
Aber wenn man eine Figur glaubhaft wirken lassen will, muss man doch vielleicht 5 Antwortmöglichkeiten machen - und da dann jeweils noch Unter-Dialoge mit noch mal ein paar Möglichkeiten. Da braucht man doch, wenn man alle Möglichkeiten durchpielen will, irgendwo an die 50 Textdateien. Die Dateien bauen sich ja auf einander auf, mein Vorschlag war ja der, dass man nicht auf das vorherige aufbaut, sondern es ersetzt. Sodass man nicht jeden einzelnen möglichen Pfad durchspielen muss, sondern mehrere Aktion-Reaktion-Bedingungen einbaut, bei der sich die Reaktion sinnvoll in das bestehende System einordnet.
Gibt es da nicht eine einfachere und vor allen Dingen schnelle Methode, um Dialoge und Aktionen zu simulieren?Jetzt fragt ihr euch vielleicht, wieso ein noob wie ich nicht erst ein simples textadventure macht. Aber das ist es ja, es soll glaubhaft sein. Es gibt viele Textadventures, aber die meisten davon gefallen mir nicht. Sie reagieren nicht flexibel auf die Aktionen des Spielers.
Gibt es auch vielleicht ein bereits bestehendes Programm, dass mir das Programmieren erleichtert. Ich will ja auch gar nicht C++ lernen, ich habe nur Lust dieses Adventure zu machen.
-
Es gab mal auf GIGA *schäm* ne Rubrik oder n Projekt oder was auch immer ...
Jedenfalls hatten sie da nen Freeware Editor vorgestellt mit dem man Spiele wie MonkeyIsland programmieren konnte, und das recht einfach mit drag&drop und wer will a bissel einfaches Scripten.
Das würde deinen programmiererischen Fähigkeiten sicher entsprechen. Das ganze Ding wäre sogar noch Bunt, wobei Features wie Inventar etc.. schon eingebaut sind.Nachteil ist natürlich das es kein Textadventure ist sondern du ein BMP's malen müsstest.
Such einfach mal danach, vielleicht wirst du fündig.
-
stankowait schrieb:
Ich habe aber trotzdem eine Frage: Wenn man das System mit den Links benutzt, wird das nach einiger Zeit nicht sehr kompliziert?
nein wird es nicht, niemand zwingt dich alle möglichkeiten durchzuarbeiten, du kannst deinen spielern die möglichkeit geben links um den baum zu laufen, oder rechts um den baum zu laufen, und nach beiden wegen können sie an der selben stelle, hinterm baum, rauskommen.
ob du eine bedingung in den link einbaust oder nicht, ist ganz dir überlassen, genauso die entscheidung wieviele bedingungen darin stehen.
-
Ja, ich habs gefunden.
Das Programm heißt Adventure Game Studio.
Danke, ich glaube damit werde ich es mal probieren.
-
Wenn Du Klicki-Bunti willst auch mal Visionaire angucken (für Zak 2 benutzt)...
