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?
Respuestas:
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:
Esta estructura simple define exactamente lo que enumeré anteriormente. Una
Room
clase de respuesta conjunta tendría propiedades para laDescription
, unaList<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 algunosList<T>
artículos.En lugar de poner un
while
bucle en una función para cada sala (que no puede hacer ahora, ya que deRoom
todos modos solo tiene una clase), crea un bucle principal más generalizado:Tenga en cuenta que la
Command.Parse
funció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.
fuente
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.
fuente