Seite 1 von 1

[Codeüberprüfung] Stimmt der Code so?

Verfasst: 29.07.2007 20:46
von Guild
Hi!

Ich habe gestern angefangen, mit PureBasic zu programmieren. Ich habe zu Testzwecken ein kleines, noch unfertigesTextadventure erstellt. Und ich wollte halt mir die Meinungen von Profis holen.

Achtung! Ich arbeite mit Sprungmarken und GoTo, aber nicht mit (Fake -)Return und GoSub!

Hier ist der Code:

Code: Alles auswählen

OpenConsole()
ConsoleTitle("Novarion ALPHA Edition")

;Menue
PrintN("")
PrintN("--------- Novarion Alpha Edition - Menue ------------")
PrintN("")
PrintN("Herzlich Willkommen zu Novarion! Was möchtest du tun?")
PrintN("")
PrintN("Neues Spiel oder Beenden?")
Menue.s = Input()
Select Menue
Case "Neues Spiel"
Goto Anfang
Case "Beenden"
PrintN("Schade. Trotzdem Viel Spaß noch! Bis zum nächsten Mal!")
End
EndSelect

;Anfang des Spieles
Anfang:
PrintN("--------- Neues Spiel ------------")
PrintN("")
Goto Zelle

;Zelle
Zelle:
PrintN("------------------- Zelle --------------------------")
PrintN("Du wachst in einer Zelle auf. Scheint ein Kerker oder ein Gefängnis zu sein, aber ganz genau weißt du das aber nicht.  Der Wächter, der dich bewachen soll, schläft. Der Schlüssel hängt an einem Schlüsselbund, den er auf den Boden gelegt hat. Er ist aber zu weit weg, um ihn mit der Hand zu sich zu holen. In deiner Zelle liegt ein Stock und ein Schwert. Was wirst du machen?")
PrintN("Wirst du mit dem Stock den Schlüssel holen und den Wächter schlafen lassen, oder mit dem Schwert den Wächter töten und dann den Schlüssel mithilfe des Stocks holen?")
Entscheidung1.s = Input()
Select Entscheidung1
Case "Stock"
PrintN("Der Wächter ist durch das Gekläpper wach geworden, hat dich erwischt und dich kurzerhand einen Kopf kürzer gemacht!")
Goto Gestorben
Case "Schwert"
PrintN("Du hast deinen Gegner lautlos getötet, und dank des Stockes dir den Schlüssel geholt und dich befreit. Weiter so! ")
Goto Raum1
Default
PrintN("Du hast nicht Stock bzw. Schwert eingegeben.")
EndSelect

;Vorraum der Haupthalle
Vorraum:
PrintN("----------------- Vorraum der Haupthalle --------------")
PrintN("Du bist im Vorraum der Haupthalle. Zurück willst du nicht mehr, und die Tür vor dir ist verschlossen. Rechts vor dir siehst du eine Gittertür, in der ein Podest steht. Auf ihm ist ein Schlüssel plaziert. Rechts von dir siehst du zwei Hebel. Welchen Hebel möchtest du betätigen?")
PrintN("")
PrintN("Linker Hebel oder Rechter Hebel?")
Entscheidung2.s = Input()
Select Entscheidung2
Case "Linker Hebel"
PrintN("")
PrintN("Es öffnet sich eine Falltür und du fällst hinunter in die unendliche Dunkelheit......")
Goto Gestorben
Case "Rechter Hebel"
PrintN("")
PrintN("Das Gitter fährt hoch, und du nimmst dir den Schlüssel! Außerdem scheint der Hebelmechanismus blockiert zu sein....")
Schlüssel.l = 1
Default
PrintN("Du hast nicht Linker Hebel bzw. Rechter Hebel eingegeben.")
EndSelect
PrintN("Du hast nun einen Schlüssel! Möchtest du durch die Schlüsseltür gehen?")
PrintN("")
Entscheidung3.s = Input()
Select Entscheidung3
Case "Ja"
PrintN("")
PrintN("Die Tür geht auf, und du gehst nun in die Haupthalle!")
Schlüssel.l = 0
Goto Haupthalle
Case "Nein"
PrintN("")
PrintN("Du möchtest also hier vergammeln? Ist zwar komisch, aber auch egal. Auf jeden Fall hat man gemerkt, dass du geflohen bist, dich gefunden und dich getötet. ")
Goto Gestorben
EndSelect

;Haupthalle
Haupthalle:
PrintN("---------- Haupthalle -----------")
PrintN("Du stehst mitten in der Haupthalle. Etwas weiter weg siehst du das Tor zur Freiheit, allerdings benötigst du.........")
PrintN("")
Goto Ende

;Gestorben
Gestorben:
PrintN("")
PrintN("Du bist gestorben!")
PrintN("Möchstest du es noch einmal probieren?")
Restart.s = Input()
Select Restart
Case "Ja"
PrintN("")
PrintN("Ok, los gehts!")
Goto Zelle
Case "Nein"
PrintN("")
PrintN("Das ist Schade. Ich hoffe, es hat dir trotzdem Spaß gemacht! Auf Wiedersehen!")
End
EndSelect

;Ende
Ende:
PrintN("------- Schlusswort --------")
PrintN("Das Spiel war kurz, ich weiß. Dieses Spiel ist im Moment im Alpha Stadium, und daher unfertig. Falls du Bugs, DeadEnds, Glitches, Exploits oder sonstige Fehler findest, mail dann bitte an bassdriver6000@aol.com.")
PrintN("")
PrintN("Mit freundlichen Grüßen, euer Bassdriver6000")
End
Wäre nett,wenn ihr auch Tipps und/oder Verbesserungsvorschläge geben könntet. Ich bin für jede Kritik und jedes Lob dankbar.

Verfasst: 29.07.2007 20:53
von Kaeru Gaman
Hi,

grundsätzlich würde ich dir empfehlen, mit einem Parser zu arbeiten.

das bedeutet, du schreibst eine umfangreiche unterroutine,
die die eingabe in einzelne wörter zerlegt, die unwichtigen rausfiltert,
die schlüsselwörter identifiziert und einen commandocode zurückliefert.

dazu brauchst du dann natürlich eine umfangreiche wortdatenbank.

aber als ergebnis würde deine routine nur eine zahl zurückliefern,
die ein kommando bedeutet, also z.b. eine 1 für "nach norden bewegen",
egal ob der spieler nun "n", "nord", "nach norden", "gehe nord", "gehe norden", "gehe nach norden", "nach norden bewegen", oder was auch immer mit dieser bedeutung eingibt.

ein kommandoparser ist das rückgrat eines textadventures, und das schon seit jahrzehnten. ;)

Verfasst: 29.07.2007 21:29
von Guild
Und wie könnte ich ihn in PB schreiben, den Kommandoparser?

Und ich möchte ja ein Speichersystem einbauen, aber ich weiss nicht wie. Kannst du mir ein paar Tipps dazu geben?

Verfasst: 29.07.2007 21:41
von Kaeru Gaman
> Und wie könnte ich ihn in PB schreiben, den Kommandoparser?

das ist auf jeden fall eine ziemlich umfangreiche aufgabe.
...ich weiß ja nicht, ob du in anderen sprachen schon umfangreiche projekte geproggt hast...

also, du müßtest eine datei (datenbank) erzeugen, die sowas um die 3000-5000 stichworte hat, mit dementsprechenden kennzeichnungen.
das ist schon mal ne riesen fleißarbeit.

die datei lädst du in den speicher*, am besten als strukturiertes array.
jeder datensatz hätte dann ein wort, und eine zahl, die eben angibt,
ob das wort zu ignorieren ist, oder welchen befehl es darstellt.

(* sieh Help, abschnitt "File")

dann brauchst du eine routine, die den eingabestring per stingbefehle (z.b. StringField)
in einzelne wörter zerlegt, und die mit der datenbank abgleicht.

ich hab vor 20 jahren mal ein tutorial zu dieser parser-programmierung gelesen,
und daraufhin hab ich den gedanken, jemals ein text-adventure zu proggen, an den nagel gehängt... xD

Verfasst: 29.07.2007 21:44
von Guild
3000-5000 Stichworte.... O____o omg!

Ich glaube, ich hänge des auch an den Nagel xD

Verfasst: 29.07.2007 21:48
von Kaeru Gaman
heutzutage würde ich auf jeden fall ein click-and-go-system vorziehen.
die meisten adventures haben ja ne grafische oberfläche...

reine textadventures sind nicht nur deshalb out, weil die oberfläche weniger fesselnd ist,
sondern auch weil es genauso viel (oder mehr) harte arbeit ist,
die technik dahinter auf die beine zu stellen...

lediglich das MUD-system hält sich noch, und das aus drei gründen:
1) es ist multi-user, die interaktion mit menschen ist interessanter als die mit einer festgelegten welt.
2) es ist systemunabhängig, man kann sich von jedem computer mit jedem betriebssystem einloggen, weil nur ein textkommunikationssystem benutzt wird.
3) es wird kein parser benutzt, weil es objektorientiert ist, d.h. jedes objekt interpretiert, ob der aktuelle befehl an es gerichtet ist.
wenn kein objekt mit der eingabe was anfangen kann, liefert der raum eine "verstehe das kommando nicht"-meldung zurück.