Pregunta

Actualmente estoy creando un sencillo juego basado en la consola en la que el jugador puede moverse entre diferentes habitaciones, recoger y utilizar los elementos, y comer los alimentos. En el estado actual del juego que está sobre él.

Lo que necesito ayuda con es:

Creación de una clase bien "eventos" para mi juego. La forma en que me gustaría que funcione es que cada artículo y la habitación debe ser capaz de estar asociado con un evento.

Como soy nuevo en este apreciaría cualquier material de lectura relacionado con este tipo de procedimiento o sugerencias en cuanto a cómo sería la mejor manera de configurar mi clase (s) teniendo en cuenta los siguientes puntos , o simplemente cómo atacar este tipo de problemas (que está teniendo problemas para decidir cómo configurar clases) .

Quiero ser capaz de crear diferentes tipos de eventos, por ejemplo:

  • Salida de texto y, a continuación, hacer una pregunta al jugador. Si el jugador da la respuesta correcta, hacer algo.

  • Salida de texto, a continuación, eliminar un elemento del inventario del jugador y, a continuación, mover al jugador a otra habitación.

Lo que estoy tratando de evitar:

  • El punto de todo el juego es practicar un buen diseño de clase, así que las cosas tales como la responsabilidad impulsada por el diseño, la cohesión y el acoplamiento son aspectos importantes. Así quiero que sea lo más sencillo, reutilizable y más independiente posible.

  • Tener que codificar cada evento para que un artículo o sala de llamadas con sólo un método específico en la clase Event.

Lo que estoy pensando en este momento:

Creación de un par de sub-clases para que pudiera crear, por ejemplo, nuevos eventos (y asociarlos) usando: itemObject.setEvent (nuevo evento (nueva pregunta ( "introtext", "outroText", "correctAnswer")));

Por favor, hágamelo saber si se necesita más información! Gracias!

¿Fue útil?

Solución

La programación de juegos Gems libros son grandes ... aunque un poco caro.

Usted probablemente puede encontrar un artículo pertinente o dos sobre el de GameDev Lista de artículos , y es probable que haya un buen cosas enterrado en sus foros

En cuanto a una clase de evento, es casi seguro que quiere una clase base con algún número de subclases (MoveEvent, InventoryEvent, etc). Y si realmente quiere evitar hardcoding cosas, debe definir su juego en los archivos de datos. Habitaciones, objetos y eventos ... además de cualquier otra cosa que virar en adelante. El formato que se utiliza para definir las cosas es totalmente de usted. Recomiendo algo que le da la experiencia práctica, ya que es un ejercicio de aprendizaje: un analizador XML no ha utilizado, por ejemplo. No es el formato más eficiente para analizar, pero esto es un juego de consola, por lo que no es un problema de este tipo.

Una sugerencia que tengo para una subclase de eventos sería el que la cadena puede otros eventos juntos. La interfaz no cambia, y se le permite hacer cosas como "añadir esto a inventario del jugador, quitar eso, y moverlos por aquí".

Otros consejos

Una cosa que tener en cuenta es separar el análisis del texto de entrada y la generación de texto de salida del modelo de dominio subyacente. Su pregunta parece mezclar los dos juntos mientras que yo consideraría la parte de texto del problema, ya que la capa de presentación.

Por ejemplo, su dominio podría constar de los siguientes interfaces:

public enum Action { HIT, TALK_TO, EAT, USE };

public interface GameEntity {
  /**
   * Performs the specified action on this GameEntity, passing in zero or
   * more other GameEntity instances as parameters.
   */
  void applyAction(Action action, GameEntity... params);    
}

public interface Item extends GameEntity { }
public interface Person extends GameEntity { }

Además se podría definir una clase TextParser que procesar la cadena de entrada y realizar llamadas resultantes a la capa de dominio o bien un retorno de respuesta por defecto: "Yo no entiendo.". Por ejemplo, la frase de entrada "llave en la puerta de su uso" daría lugar a la llamada al método:

key.applyAction(Action.USE, door);

He implementado recientemente algo similar a lo que estás describiendo. Empecé por la creación de una clase EventManager que tiene un método "Publicar" y "Suscribirse". Cuando el sistema se inicia, escanea todo los ensamblados cargados (bibliotecas) para las clases que implementan la interfaz IEventListener:

/// <summary>
/// A class that intends to listen for specific events to be published by an
/// event manager.
/// <see cref="EventManager"/>
/// </summary>
public interface IEventListener
{
    /// <summary>
    /// Subscribes to the event types that this listener wishes to listen for.
    /// </summary>
    /// <param name="eventManager"></param>
    void RegisterSubscriptions(EventManager eventManager);
}

... y llama al método RegisterSubscriptions en cada uno de ellos. (Sólo hay una instancia de la EventManager que se usa en todas partes;. Yo uso la inyección de dependencias para obligar a éste como una instancia singleton)

RegisterSubscriptions simplemente llamará al método Suscribirse para cada tipo de evento y manejador de que la clase dada pretende mango. (Estoy usando .NET, por lo que los eventos y controladores son un poco más fáciles de trabajar, pero se puede hacer lo mismo en Java utilizando subclases anónimos.)

Un caso típico podría ser algo así como RoomEntered, y los argumentos asociados a este evento incluiría la ID habitación y tal vez algunas otras propiedades acerca de la habitación. El motor del juego publica este evento cuando el usuario entra en una habitación, proporcionando los argumentos del evento apropiadas para esa habitación, y la clase EventManager es entonces responsable de la invocación de cada controlador que se ha suscrito a ese tipo de evento. Un controlador de este evento podría ser "HandleEnterRoomWithMonsters", que comprueba si la habitación tiene monstruos, y realiza una acción en consecuencia.

¿Esto tiene sentido en general? ¿Tiene alguna pregunta sobre este enfoque?

scroll top