Шаблон проектирования для сложных игровых алгоритмов

Это продолжение этого вопроса. Контекст тот же, так что беглый просмотр может быть полезен. Я обдумывал это в течение нескольких дней и ничего не добился, поэтому я сдаюсь и иду сюда.

Мне интересно, какие шаблоны проектирования вступают в игру при создании системы, подобной той, которую я описал там. Допустим, у меня есть боевой алгоритм, который может иметь любое количество бойцов с каждой стороны. Сначала выясняем, кто на кого нападает, а потом казним.

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

Мой предыдущий вопрос показывает, как декоратор потерпел неудачу. В ответе был предложен шаблон «Стратегия», но я не горю желанием писать дюжину различных типов стратегий, а затем несколько конкретных классов для каждого из них. Но даже тогда мне все равно пришлось бы нарушать принцип «Открыто-Закрыто», если бы мне понадобилось совершенно новое поведение, совершенно не похожее ни на что, что у меня уже было. Также будут случаи, когда мне нужно объединить несколько стратегий одновременно, что может привести к декорированным стратегиям или составным стратегиям. Например, когда вы получаете урон, вы можете 1. иметь способность, которая сокращает урон вдвое, 2. иметь предмет, который еще больше снижает урон, 3. возвращать часть урона атакующему и 4. получать очки характеристик. .

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

Я не хочу публиковать огромную стену кода, поэтому, если есть какая-то конкретная часть моей системы, которую вы хотели бы увидеть, просто спросите в комментарии.


person Tesserex    schedule 08.09.2012    source источник


Ответы (1)


Это большой вопрос, требующий знания вашей игровой механики. Но начну с этой рекомендации. Первый шаг — убедиться, что у вас есть четко определенный и задокументированный порядок действий, а затем преобразовать его в фреймворк или шаблон для вашего алгоритма разрешения боя. Например:

Например, когда вы получаете урон, вы можете 1. иметь способность, которая сокращает урон вдвое, 2. иметь предмет, который еще больше снижает урон, 3. возвращать часть урона атакующему и 4. получать очки характеристик. .

Что, если сначала произойдет № 3 (отражение урона), затем № 4 (вы получаете характеристики, возможно, даже защищаете очки), затем № 1 и № 2. В этом случае защитник максимизировал восстановленный урон и потенциально максимизировал свою защиту.

Вы перечислили эти шаги в определенном порядке, но почему? Вы должны определить свои правила таким образом, чтобы знать, когда применяется каждый шаг (атака и защита). Только тогда вы сможете создать систему для разрешения боя. Например:

  1. Начните с базового урона
  2. Применяйте эффекты атакующего, которые срабатывают при атаке
  3. Применяйте защитные эффекты, срабатывающие при атаке
  4. Примените все врожденные способности атакующего, увеличивающие урон.
  5. Примените все способности снаряжения атакующего, увеличивающие урон.
  6. Примените все врожденные способности защитника, увеличивающие броню.
  7. Примените все способности снаряжения защитника, увеличивающие броню.
  8. Применение атакующих эффектов, срабатывающих при защите
  9. Применение защитных эффектов, срабатывающих при защите
  10. Получить урон
  11. Применяйте атакующие эффекты, которые срабатывают при нанесении урона.
  12. Применяйте защитные эффекты, срабатывающие при нанесении урона

Это от бедра, я не знаю вашей системы правил.

Как только вы это сделаете, подумайте о моделировании боя, включающего источник, цель, (начальный) урон, список эффектов атаки и список эффектов защиты. Эти эффекты должны быть закодированы как шаблон (шаблон метода шаблона) с OnAttack(), OnApplyInnate(), OnApplyEquipment(), OnDamaged() и т. д. Затем вы можете повторять эффекты на различных этапах боевого разрешения, давая каждому возможность применить его эффект в нужное время.

person tcarvin    schedule 10.09.2012
comment
Подводя итог, не помещайте код разрешения урона в Combatant. Переместите его в класс Combat, который содержит необходимую информацию для его устранения, включая список CombatEffects, внесенных атакующим и защитником. Обычно взаимодействуйте с эффектами так, как и в порядке, контролируемом вашей системой правил, позволяя каждому изменять урон или создавать другие побочные эффекты (например, отражение урона). Последний метод ApplyDamage должен вычитать очки жизни и выполнять любые побочные эффекты. - person tcarvin; 11.09.2012