Вопрос

В настоящее время я создающую простую игру на основе консоли, в которой игрок может перемещаться между разными комнатами, забрать и использовать предметы и едят еду. В текущем штате игры это об этом.

Что мне нужна помощь с:

Создание хорошего класса «события» для моей игры. То, как я бы хотел, чтобы каждый товар и комнату могли быть в состоянии связаться с событием.

Как я новичок в этом, я был бы признателен за любой материал чтения, связанный с такими процедурами, или предложениями относительно Как было бы лучше настроить мой класс (ES), учитывая очки ниже, или просто Как атаковать эту проблему (у этого есть проблемы с решением того, как настроить классы).

Я хочу иметь возможность создавать различные виды событий, например:

  • Выведите текст, а затем спросите игрока вопрос. Если игрок дает правильный ответ, сделайте что-нибудь.

  • Выведите несколько текста, затем удалите элемент из инвентаризации игрока, а затем переместите игрока в другую комнату.

Что я пытаюсь избежать:

  • Весь смысл игры состоит в том, чтобы практиковать дизайн хорошего класса, поэтому вещи, такие как дизайн, связанные с ответственностью, сплоченностью и сцепление. Таким образом, я хочу, чтобы это было максимально простым, многоразовым и независимым, насколько это возможно.

  • Не имея к жесткому коду каждое событие, так что элемент или комната просто называют определенный метод в классе событий.

Что я думаю на данный момент:

Создание нескольких подклассов, чтобы я мог, например, создавать новые события (и ассоциировать их), используя: itemObject.setevent (новое событие (новый вопрос («интротестку», «Отрезовый текст», «корректировка»));

Пожалуйста, дайте мне знать, если нужна дополнительная информация! Спасибо!

Это было полезно?

Решение

Игра Programming Gems Books отлично ... хотя немного дорогое.

Вы, вероятно, можете найти соответствующую статью или два Список статьи Гамдева, и, вероятно, некоторые хорошие вещи похоронены в их форумы

Что касается класса событий, вы почти наверняка хотите базовый класс с некоторым количеством подклассов (MoveeVent, InventoryEvent и т. Д.). И если вы В самом деле Хотите избежать жестких вещей, вы должны определить свою игру в файлах данных. Номера, предметы и мероприятия ... плюс все остальное, что вы начнете позже. Формат, который вы используете для определения вещей, полностью зависит от вас. Я рекомендую то, что даст вам практический опыт, поскольку это обучающее упражнение: анализатор XML, который вы не использовали, например. Не самый эффективный формат для разбора, но это консольная игра, так что это не такая проблема.

Одно предложение, которое у меня есть для подкласса событий, будет одним, который может цеплять другие события вместе. Интерфейс не изменится, и это позволяет вам делать такие вещи, как «добавьте это к инвентаризации игрока, возьми это, и переместите их здесь».

Другие советы

Одна вещь, которую я бы рассмотрел, разделяет анализ входного текста и генерации вывода текста из базовой модели домена. Ваш вопрос, по-видимому, смешивает два вместе, тогда как я рассмотрел текстовую часть задачи в качестве слоя презентации.

Например, ваш домен может состоять из следующих интерфейсов:

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 { }

Кроме того, вы можете определить класс TextParser, который будет обрабатывать входную строку и выполнять полученные вызовы на слой домена, либо возвращать ответ по умолчанию: «Я не понимаю». Например, входная фраза «Использовать ключ в двери» приведет к вызовам метода:

key.applyAction(Action.USE, door);

Говоря о событиях Узор наблюдателя приходит на ум. Вы можете подумать о вашей игре, чтобы внутренне представленные несколькими штатами (вы можете посмотреть это в Википедии тоже, я не могу добавить 2-й ссылку самостоятельно из-за того, что он был новым для этого). Каждый переход с одного этапа в другое - это событие, которое может быть передано для зарегистрированных почтовых увесов этого события.

На примере:

Используйте ключ на блокировке: триггеры удаления ключа и открытия двери; Иммел «каскадную» к следующему событию без ададитонального взаимодействия пользователя (открытие двери): триггеры комнаты, имеющие дополнительный выход и т. Д.

Я недавно реализовал что-то похожее на то, что вы описываете. Я начал с создания класса EventManager, который имеет «публикацию» и «подписаться» методом. Когда система запускается, она сканирует все загруженные сборки (библиотеки) для классов, которые реализуют интерфейс 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);
}

... и вызывает метод регистрационных процессов на каждом из них. (Существует только один экземпляр EventManager, который используется везде; я использую инъекцию зависимости, чтобы связать его как экземпляр Singleton.)

Реинструкции будут просто позвонить в метод подписки для каждого типа событий и обработчика того, что данный класс предназначен для обработки. (Я использую .NET, поэтому события и обработчики немного легче работать, но вы можете сделать то же самое в Java, используя анонимные подклассы.)

Типичное событие может быть что-то вроде соседствующих, а аргументы, связанные с этим событием, будут включать идентификатор комнаты и, возможно, некоторые другие свойства о комнате. Игровой двигатель публикует это событие, когда пользователь входит в комнату, предоставляя соответствующие аргументы событий для этой комнаты, а класс EventManager, а затем отвечает за вызов каждого обработчика, который подписался на этот тип события. Один обработчик для этого события может быть «поборочными поручительными людями», которые проверяют, есть ли комната монстров и соответственно выполняет действие соответственно.

Это имеет смысл в целом? У вас есть какие-либо вопросы по этому подходу?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top