Ich fange gerade erst an zu lernen, Spiele zu machen. Ich habe ein einfaches textbasiertes Spiel erstellt, in dem der Benutzer zwischen Räumen herumlaufen und mit den Objekten in jedem Raum interagieren kann. Ich habe jedoch das Gefühl, dass mein Ansatz zu einem Haufen schlechten Spaghetti-Codes geführt hat. Ich bin mir nicht sicher, wie man ein solches Spiel gut strukturieren kann.
Mein Ansatz war es, eine Klasse mit einer Methode für jeden Raum und alle Objekte und Interaktionen zu haben, die in diesem Raum durchgeführt werden konnten. Dies ist beispielsweise die Methode für die Studie:
public static void Study()
{
bool studyexited = false;
while (!studyexited) {
string usercommand = Console.ReadLine ();
usercommand.ToLower ();
switch (usercommand) {
case "turn left":
GameEventText.StudyLeft ();
break;
case "turn right":
GameEventText.StudyRight ();
break;
case "go forward":
Notes firstsetofclues = new Notes ("First Note");
GameEventText.StudyFront ();
string firststudycommand = Console.ReadLine ();
firststudycommand.ToLower ();
if (firststudycommand == "read note") {
firstsetofclues.Firstnotereading ();
}
Console.WriteLine ("Picking up this note would prove valuable");
string secondstudycommand = Console.ReadLine ();
secondstudycommand.ToLower ();
if (secondstudycommand == "pick up note") {
if (MainClass.PlayerInventory.AddItem (firstsetofclues))
{
Console.WriteLine ("The note has been added to your inventory");
} else {
Console.WriteLine ("Your inventory is full");
}
MainClass.PlayerInventory.Inventorydisplay ();
}
}
}
}
Ich glaube nicht, dass dies ein skalierbarer Ansatz ist. Das heißt, ich kann solche Funktionen nicht für jeden Raum schreiben . Ich glaube, dass die Verwendung von Dateien in irgendeiner Weise eine gute Strategie wäre, um die "harte Codierung" zu vermeiden, die ich derzeit mache. Aber ich bin mir nicht sicher, wie ich das erreichen kann?
Antworten:
Sie sind auf dem richtigen Weg mit Ihrer Vorstellung, Dateien zu verwenden, um das Ausmaß Ihres hartcodierten Verhaltens zu verringern. Sie möchten Ihre Spieldaten so weit wie möglich steuern: Es ist kein kompliziertes Konzept, es ist genau das, wonach es sich anhört. Steigern Sie das Spielverhalten über Daten und nicht direkt über Code.
Eine gute Einstellung bei der Bestimmung, wie ein System über Daten gesteuert werden soll, ist die Suche nach allgemeinen Informationen. Welche Gemeinsamkeiten haben alle Instanzen dieser Systeme? Die Gemeinsamkeiten werden zu Eigenschaften des Systems, und die Werte dieser Eigenschaften sind die Daten. Zimmer zum Beispiel haben normalerweise alle eine Beschreibung und eine Liste von Ausgängen. Sie können auch ein "Inventar" haben, eine Liste von Gegenständen, die sich im Raum befinden.
Eine Option, die Sie verfolgen können, ist die Verwendung von Nur-Text- oder XML-Dateien (beide sind in C # recht einfach zu analysieren), um Raumdaten und -inhalte zu speichern.
Stellen Sie sich eine XML-strukturierte Datei wie folgt vor:
Diese einfache Struktur definiert genau das, was ich oben aufgeführt habe. Eine cooresponding
Room
Klasse hätte Eigenschaften für dieDescription
eineList<T>
der Ausgänge (die Verweise auf andere Räume und den „go“ Befehl verwendet , um dorthin zu gelangen, in dem obigen Beispiel in Richtung Norden würde den Spieler auf den Gang nehmen). Es gibt auch eineList<T>
Reihe von Gegenständen.Anstatt eine
while
Schleife in eine Funktion für jeden Raum einzufügen (was Sie jetzt nicht tun können, da SieRoom
sowieso nur eine einzige Klasse haben), erstellen Sie eine allgemeinere Hauptschleife:Beachten Sie, dass die
Command.Parse
Funktion als Übungsgröße für Sie übrig bleibt, aber im Grunde genommen Benutzereingaben analysieren und eine Art "Verb / Objekt" -Paar oder ähnliches zurückgeben sollte (siehe diese Frage für einen Kickstart, dies geht etwas über Ihren Rahmen hinaus Frage). Im obigen Beispiel wäre das Verb "go" und das Objekt könnte "north" oder "south" oder was auch immer sein.Darüber hinaus präsentiert diese Schleife die Räume verallgemeinert. Jedes Mal, wenn Sie fertig sind, drucken Sie die Raumbeschreibung aus und warten auf Benutzereingaben. Wenn die Benutzereingabe "In einen anderen Raum gehen" lautet, finden Sie den Ausgang des aktuellen Raums entsprechend der vom Benutzer eingegebenen Richtung. Wenn es in dieser Richtung keinen Ausgang gibt, sagen Sie dies, andernfalls stellen Sie den aktuellen Raum auf diesen neuen Raum ein. Dann wiederholen.
Sie können diesen Ansatz weiter verfeinern (z. B. druckt das Obige die Raumbeschreibung nach jedem Befehl aus; können Sie sehen, wie die Beschreibung nur beim ersten Betreten des Raums gedruckt wird? Wie wäre es damit, wenn Sie einen "Look" eingeben? " Befehl?). Sie können es auch skalieren, um die Handhabung von Elementen auf ähnliche Weise einzuschließen.
quelle
Wenn Sie HTML kennen, können Sie sich die Räume als Webseiten vorstellen, die Ausgänge als Links, die Aktionen vielleicht als Anker und das Spiel selbst als Browser. Das einzige zusätzliche, was das Spiel verwalten muss, ist ein Inventar und NPCs, die im Grunde genommen eine oder zwei statische Klassen mit dem Status jedes Gegenstands und Charakters im Spiel sind. Wurde es genommen, wurde es bereits benutzt / angesprochen, oder? wurde zerstört / besiegt.
Wenn Sie HTML anstelle von reinem XML auf ähnliche Weise wie von Josh beschrieben verwenden, können Sie im Browser debuggen, zumindest was die Navigation betrifft.
quelle