Как хорошо смоделировать два объекта, которые являются одним и тем же, но имеют две разные функции?

Я ищу хороший способ смоделировать «ход» в настольной игре. Я хочу иметь возможность спросить игрока, каков его ход, и заставить его ответить, а затем иметь возможность выполнять правильные действия на доске в зависимости от его хода. Проблема в том, что есть несколько типов ходов, каждый со своим набором данных. Например, в Scrabble вы можете воспроизвести слово, которое должно вернуть слово, его положение и направление (или набор плиток с позициями или что-то еще), но вы также можете поменять местами плитки (что потребует возврата плиток, которые вы хотите своп) или пройти.

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

Я предполагаю, что Player, возвращающий объект Move, - лучший способ, но я открыт для любых других вариантов моделирования или предложений.

Спасибо!


person Risser    schedule 09.11.2012    source источник
comment
Я лично выбрал бы базовое наследование для этого   -  person JWiley    schedule 09.11.2012
comment
Я не думаю, что иметь общий объект перемещения для всех видов игр - хорошая идея. Или абстракция была бы просто маркером.   -  person Bhesh Gurung    schedule 09.11.2012
comment
Чтобы уточнить, я не ищу решения для нескольких игр. Ищу решение в рамках конкретной реализации конкретной игры. Мне не нужно что-то, что обрабатывает шахматные ходы и ходы скрэббла, но проблема, с которой я пытаюсь справиться, похожа для каждой из этих игр (и других). Благодарность!   -  person Risser    schedule 10.11.2012


Ответы (5)


Как правило, если вы хотите иметь общий тип, но другое поведение для объекта - здесь Move - вам нужно позволить объекту реализовать это поведение. Поэтому вместо того, чтобы спрашивать, как доска может по-разному интерпретировать два разных хода, вы должны подумать, как сделать так, чтобы два разных хода использовали доску по-разному при выполнении своего хода.

Итак: базовый класс (вероятно, должен быть интерфейсом) - это Move, у него есть метод perform (), и два вида перемещений имеют разные реализации метода perform ().

person Anders Johansen    schedule 10.11.2012
comment
Это был лаконичный ответ, который, конечно же, шлепнул по голове. Именно то, что мне нужно. Спасибо! - person Risser; 26.12.2012

Возможно, это не совсем то, что вы ищете, но, похоже, в этом старом посте есть много отличных идей:

Есть ли шаблоны для моделирования настольных игр?

Некоторые ответы включают предложения по реализации Move и, надеюсь, могут дать вам новые идеи.

person Penelope The Duck    schedule 09.11.2012

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

Что касается вашего конкретного вопроса, то одной из общепринятых моделей является возвращение Player Move, но в зависимости от полной информации его реальная ценность может варьироваться от полного успеха до полная катастрофа.

person Marko Topolnik    schedule 09.11.2012

Ход в игре на самом деле не является объектом. Это событие.

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

Точно так же в игре Scrabble ход может возвращать событие игры слов, событие обмена плиткой или событие передачи.

Думайте о событии как о сообщении остальной части игры. Вы можете закодировать событие, как класс. Этот класс событий должен иметь доступ к различным игровым классам, чтобы модель могла создать сообщение.

Класс обработчика событий обрабатывает все игровые события. Этот класс будет классом, который управляет другими игровыми классами. Просто все события должны быть в формате, который может обработать обработчик событий.

person Gilbert Le Blanc    schedule 09.11.2012
comment
Мне нравится эта идея, но у меня все еще есть та же основная проблема в том, что у меня может быть три или четыре разных события. Могу ли я сравнить eventType и передать их отдельным обработчикам? - person Risser; 09.11.2012
comment
Или доска и другие игровые элементы подписываются на игроков в качестве слушателей событий игроков? Опять же, не знаю, как с этим справиться. - person Risser; 09.11.2012
comment
Компоненты Java Swing имеют всевозможные слушатели (события). У вас может быть одно событие с несколькими частями или отдельными событиями. Шахматы поддались бы первому, а Скраббл - второму. Вам решать, что больше подходит для вашей игры. Как я уже сказал в ответе, у вас есть обработчик событий. Опять же, вам решать, в каком классе модели методы обработчика событий имеют наибольший смысл. - person Gilbert Le Blanc; 10.11.2012

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

Но мой главный вопрос заключается в том, действительно ли есть причина, по которой этот интерфейс известен в разных играх. Если нет какого-то общего обработчика, который ожидает определенных форматов действий в разных играх, я бы не стал беспокоиться и просто определил бы разные классы Move для конкретной игры.

person amphibient    schedule 09.11.2012