Какие шаблоны проектирования можно использовать для создания системы правил / валидации для такой игры, как шахматы (это всего лишь простой пример, для реальной игры требуются более сложные наборы правил)
Я прочитал несколько вопросов на этом сайте и не нашел ни окончательного ответа, ни ответа, указывающего мне правильное направление.
Эта система потребует следующего:
- Каждый объект, к которому применены правила, должен реализовывать определенный интерфейс с методом, который является отправной точкой для проверки
- Правило должно применяться в 2 этапа: сначала его нужно проверить (можно заложить A на квадрат D4), если true, тогда выполнить метод A, если false, затем выполнить метод B
- Каждый объект может иметь несколько правил, которые должны применяться в определенной последовательности. Когда правило 1 закончено, правило 2 должно начать проверять и т. Д.
- Каждое отдельное правило (например, может перемещаться только на 1 клетку, может перемещаться только по диагонали и т. Д.) Должно быть в своем собственном классе и должно быть повторно использовано и применимо к объектам, которым нужны правила.
- Обратите внимание, что это будет использоваться в многопользовательской игре на сервере
- Обратите внимание, что каждому правилу требуется несколько объектов, чтобы проверить его действительность, например, обычно пешка может сдвинуться на 1 клетку, теперь следующий квадрат на игровой доске заполнен пешкой вашего противника. Результат: ваша пешка не может двигаться. Пешка должна включать в себя другие позиции пешек или игровую доску при ее проверке.
Другим словом для этих правил были бы поведенческие ограничения.
Ответы:
Думайте об игре как о последовательности состояний , разделенных ходами . Каждый раз, когда игрок делает ход, генерируется новое состояние.
(Это как этот комикс XKCD !)
Как
Создайте класс
Move
, который представляет один ход, сделанный одним игроком . (В Реверси достаточным описанием является один набор координат доски, на котором должна быть размещена фигура. В Шахматах достаточно исходной и конечной координат.)Создайте класс
GameState
, который представляет состояние игры в любое время . (В Реверси достаточное описание будет содержать содержимое игрового поля и ход его игрока. В Шахматах вам дополнительно нужно будет указать, есть ли у каждого игрока возможность заблокировать королевский фланг или ферзевый фланг.)Теперь вы, вероятно, можете себе представить
GameState
наличиеisMoveLegal(Move)
метода. В конце концов, он содержит всю информацию, необходимую для принятия этого решения.Почему
Эта конструкция четко изолирует логику правил, уменьшая межкомпонентные зависимости.
Это также делает ИИ легким! Вы можете тривиально сгенерировать все возможные ходы из a
GameState
, проверить, допустимы ли они, сгенерировать большеGameState
s из них и в основном построить дерево, которое вы можете использовать для минимакса , возможно, с отсечкой альфа-бета .источник