¿Cómo puedo representar habitaciones y acciones asociadas e inventario en un juego de aventura basado en texto?

8

Estoy empezando a aprender a hacer juegos. He creado un juego simple basado en texto donde el usuario puede caminar entre habitaciones e interactuar con los objetos en cada habitación. Sin embargo, siento que mi enfoque ha llevado a un montón de código de espagueti malo. No estoy seguro de cuál sería una buena forma de estructurar un juego como este.

Mi enfoque era tener una clase con un método para cada salón y todos los objetos e interacciones que se pudieran hacer en ese salón. Por ejemplo, este es el método para el estudio:

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 ();
            }
        }
    }
}

No creo que este sea un enfoque que escalará; es decir, realmente no puedo escribir funciones como esta para cada habitación. Creo que usar archivos de alguna manera sería una buena estrategia para evitar la "codificación dura" que estoy haciendo actualmente. ¿Pero no estoy seguro de cómo puedo lograr eso?

Mohamed Serry
fuente
Esto es realmente más un tema de programación general, excepto tal vez los bits sobre bucles de juegos y demás (que es muy amplio). Sin embargo, es difícil de decir, porque su pregunta no está clara como está escrita.
No entiendo cómo no está claro, ya que hice todo lo posible para explicar. tal vez podrías ayudarme?
Mohamed Serry
Mucho tiene que ver con la falta de puntuación, mayúsculas y espacios entre párrafos. Básicamente, parece que estás preguntando cómo evitar tener que codificar una sola clase por sala en tu juego. ¿Es eso correcto? Si es así, puedo ayudar a editar su pregunta.
hasta cierto punto sí. Quiero evitar codificar todo el juego básicamente.
Mohamed Serry

Respuestas:

10

Está en el camino correcto con su noción de usar archivos para ayudar a aliviar la cantidad de comportamiento codificado que tiene. Desea que los datos de su juego se manejen lo más posible: no es un concepto complicado, es exactamente lo que parece. Conduce el comportamiento del juego a través de datos en lugar de hacerlo directamente a través del código.

Una buena mentalidad a la hora de determinar cómo conducir un sistema a través de datos es buscar las generalidades. ¿Qué cosas son comunes entre todas las instancias de estos sistemas? Los elementos comunes se convierten en propiedades del sistema, y ​​los valores de esas propiedades son los datos. Las habitaciones, por ejemplo, generalmente tienen una descripción y una lista de salidas. También pueden tener un "inventario", una lista de artículos que están en la habitación.

Una opción que puede seguir es usar archivos de texto sin formato o XML (los cuales son bastante fáciles de analizar en C #) para almacenar datos y contenidos de la sala.

Considere un archivo estructurado XML como este:

<room name="Study">
  <description>
  You enter a well-furnished study. A heavy wooden desk sits in one corner, an ugly lamp illuminating its surface.
  </description>
  <exits>
    <exit command="north">Hallway</exit>
  </exits>
  <items>
    <item name="Pen">
  </items>
</room>

Esta estructura simple define exactamente lo que enumeré anteriormente. Una Roomclase de respuesta conjunta tendría propiedades para la Description, una List<T>de las salidas (que son referencias a otras habitaciones y el comando "ir" utilizado para llegar allí, en el ejemplo anterior, ir al norte llevaría al jugador al pasillo). También hay algunos List<T>artículos.

En lugar de poner un whilebucle en una función para cada sala (que no puede hacer ahora, ya que de Roomtodos modos solo tiene una clase), crea un bucle principal más generalizado:

while(!done) {
  Console.WriteLine(currentRoom.Description);
  var command = Command.Parse(Console.ReadLine());
  switch(command.Verb) {
    case "go":
      nextRoom = allRooms[currentRoom.GetExitForDirection(command.Object)];
      if (nextRoom == null) {
        Console.WriteLine("You cannot go that way.");
      }
      else {
        currentRoom = nextRoom;
      }
      break;
    ...
  }
}

Tenga en cuenta que la Command.Parsefunción se deja como un ejercicio extra para usted, pero básicamente debe analizar la entrada del usuario y devolver algún tipo de par "verbo / objeto" o similar (vea esta pregunta para un arranque rápido al hacerlo, está un poco más allá del alcance de su pregunta). En el ejemplo anterior, el verbo sería "ir" y el objeto puede ser "norte" o "sur" o lo que sea.

Pero más allá de eso, lo que está haciendo este ciclo es presentar las habitaciones de forma generalizada; cada vez que imprima la descripción de la sala, espere la entrada del usuario. Si la entrada del usuario es "ir a otra sala", encontrará que la salida de la sala actual corresponde a la dirección que ingresó el usuario. Si no hay salida en esa dirección, dígalo, de lo contrario, configure la habitación actual a esa nueva habitación. Entonces repite.

Puede continuar refinando este enfoque (por ejemplo, lo anterior imprime la descripción de la sala después de cada comando; ¿puede ver cómo hacer que imprima la descripción solo la primera vez que ingresa a la sala? ¿Qué tal ese plus cuando escribe un "look" "comando?). También puede escalarlo para incluir el manejo de artículos de manera similar.

Comunidad
fuente
Muchas gracias por su apoyo josh. Intentaré esto y trataré de desarrollar el progreso tanto como pueda
Mohamed Serry
1

Si conoce html, puede pensar en las salas como páginas web, las salidas como enlaces, las acciones tal vez como anclas y el juego en sí como un navegador. Lo único que necesita administrar el juego es un inventario y NPC, que es básicamente una clase estática o dos con el estado de cada elemento y personaje en el juego, si se ha tomado, si ya se usó / se habló, lo tiene sido destruido / derrotado

Si usa html en lugar de xml puro de una manera similar a lo que Josh describió, podría depurar en el navegador, al menos en lo que respecta a la navegación.

AturSams
fuente
La respuesta de Josh es más completa desde el punto de vista técnico y directamente relevante, pero esta analogía es bastante buena y puede ayudar a comprender el concepto general
2014