Как реализовать «карточку спецэффектов» в карточной игре?

16

Я пытаюсь написать здесь своего рода карточную игру, в некотором роде похожую на Magic The Gathering или Yu-Gi-Oh! карточная игра.

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

Чтобы дать вам представление о том, какие эффекты могут иметь эти карты, вот несколько примеров эффектов карт заклинаний, присутствующих в Yu-Gi-Oh! карточная игра:

  • Возродить существо, которое было уничтожено
  • Взять под контроль существо противника
  • Изменить характеристики существа, основываясь на некоторых условиях (например, Количество существ с определенными именами, которые были уничтожены)
  • Специальный призыв определенных существ, если выполнены некоторые условия.
  • Объедините два или более существ в более сильное существо.
  • Невосприимчивость к некоторым эффектам специальных карт.

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

Теперь, конечно, я пытаюсь сделать это не так сложно, как эти игры, но мне интересно, как они их реализуют?

hndr
источник

Ответы:

17

Есть несколько проектов с открытым исходным кодом такого рода, с различными подходами к реализации правил. Вот запись в блоге от создателя одной из самых известных реализаций MtG, CardForge. Это может быть не полный список, но он содержит несколько проектов с открытым исходным кодом, где вы можете просто просмотреть код или посетить форумы для конкретных вопросов.

Как фактический ответ: ваш лучший выбор для надежной среды - строго использовать объектно-ориентированное программирование. Каждое действие, каждый триггер, каждая способность - это объект. Такие зоны, как Рука, Библиотека тоже являются объектами, что и говорить. В движке правил никогда не передавайте тупые объекты, такие как строки или целые числа, для описания игровых объектов, но только для своих объектов.

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

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

В идеале, если вы идеально реализуете правила игры, ваш код правил не содержит ни одной жестко закодированной карты. Карты с жестким кодированием могут создавать удобные ярлыки, но в долгосрочной перспективе это приведет к расширению вашего кода и возникновению потенциальных ловушек, например, при выпуске новых карт, которые взаимодействуют с этими картами новым способом. В такой игре, как MtG, в которой более 12 000 уникальных карт и нет конца, таких взаимодействий МНОГИЕ.

Hackworth
источник
1
Хороший ответ. Исходя из этого из мира функционального программирования, я бы хотел, чтобы каждая карта была замыканием в игровой среде и была бы еще более смешной. Например, карта может приемлемо создать новую «область», добавив список карт в список областей. Конкретно: Zombie Monster Mayhem: Все побежденные существа возрождаются на новом «Коммунальном кладбище» без их специальных способностей и случайным образом атакуют игрока, основываясь на броске костей.
Брайс
Дополнительная ссылка: github.com/Fluorohydride/ygopro-core для известной реализации YGO с открытым исходным кодом, поскольку YGO также упоминалось в этом вопросе.
SK19
2

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

Toni
источник
Или, как предложил Хакворт, имея какие-то общие блоки, которые объединяются, чтобы получить требуемое поведение. Я думаю, что для этого потребуются также некоторые логические блоки в дополнение к тому, что он предложил. Совместное использование блоков поведения может упростить фильтрацию карт, обладающих какими-то общими качествами.
Тони
1

Я также планирую карточную игру, используя веб-языки с MySQL DB. В настоящее время я собираюсь сделать очень общую настройку, чтобы она была очень гибкой для новых уникальных карт. Например вместо:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

это может быть легко:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

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

Все опции и способности будут определены в БД в этом единственном ряду.

appthat
источник