Возможно, это был бы лучший форум для размещения вопроса в https://gamedev.stackexchange.com/, но вот пара мнений, которые у меня есть, некоторые могут быть неправильными, но, возможно, они помогут (кажется, забавный проект).
1) Я подвергаю сомнению этот дизайн, потому что я мог бы также создать абстрактный метод по сравнению с интерфейсом, но его нельзя было бы распространить на шахматы.
Вы, вероятно, хотите придерживаться интерфейсов, поскольку они будутпозволяют расширять функциональность с меньшим количеством рефакторинга, поскольку вы можете реализовать множество, а не расширять. При использовании методов по умолчанию вы также можете включить любой общий код, если вам нужно.
2) Я также не знал, как связать игрока с таким маркером, как x или o в крестики-нолики. Я использую хэш-карту, чтобы привязать игрока к его маркеру.
Ничего плохого в том, как вы делаете это в данный момент, в том, что касается назначения предмета на фигуру. Возможно, вы захотите сделать его немного лучше, например Piece implements Movable, Drawable
(вернемся к комментарию интерфейса сверху). Относительно того, где хранятся фигуры, если вы хотите сохранить фигуры в игре и заставить игру определить все доступные ходы и действительность каждой фигуры. Или вы можете переместить их в Player.Collection, если игрок или сами фигуры будут отвечать за определение доступности на доске.
Например:
public TicTacToe() {
this.players.add(new Player("Player 1", Color.RED, initPieces());
this.players.add(new Player("Player 2", Color.BLACK, initPieces());
}
Color.RED |ЧЕРНЫЙ будет применяться к фигуре, когда игрок получает контроль над ней. Например, если у вас есть игра, в которой игроки могут украсть токены других игроков, процесс добавления нового токена игроку автоматически обновит его цвет. Затем цвет применяется при вызове piece.draw();
или piece.draw(canvas)
в зависимости от того, что вы делаете.
3) У меня есть некоторое дублирование кода для шашек, в котором у меня есть цвет enum, но у меня также есть переменнаямаркер, который вроде то же самое. Не знаете, как это исправить.
Если вы используете приведенные выше комментарии, вы можете сделать следующее:
Collection<Piece<String>> initPieces(String mark) {
return Arrays.asList(new Piece<>(mark), ...); // create 5
}
public Person(String name, Color color, Collection<Piece> initialPieces) {
// for initialPieces set piece color to color
}
4) Можно ли типизировать объект? Поскольку доска не знает, какой тип фигуры у нее есть, я должен сделать это в классе шашек
Если вы использовали интерфейс Movable при реализации фигуры, вам не нужно разыгрывать, так как обе игры/ Доски будут знать:
List<List<Integer>> moves = piece.getPossibleMoves();
или
this.board = new Board<Checker>();
, что опять-таки гарантирует, что board.getPeice(x,y)
вернет Checker, и кастинг не требуется. Это зависит от того, что может произойти позже в игре, и каковы правила.
5) Реализация крайних случаев на основе игры - шашки, где пешка становится королем.
В большинстве игр есть результаты, которыепроисходят после того, как движение имеет место. Например, как вы упомянули:
- Шашками вы удалите фигуру других игроков, если они были прыгнуты
- Шашками вы станете пешкой короля, если они достигнут другой стороны доски.
- Шахматы: вы удалите фигуру другого игрока, если они окажутся на
. В вашем примере игры в шашки вам нужно будет вызывать что-то после setNewPiecePosition, которое обрабатывает успешные ходы. Для шашек вам понадобится этот метод:
- Проверить начальную и конечную позиции и определить, была ли фигура другого игрока в середине. Если это так, вы удаляете эту фигуру с доски (и / или список фигур других игроков).
- Определите, может ли игрок снова двигаться, если он кого-то перепрыгнул, тот же игрок может снова выбрать из обновленногосписок доступных ходов.
- Определите, находится ли новая позиция в конце доски, затем замените Пешку Королем в коллекции фигур игроков.