Я пытаюсь понять, как проектировать и мыслить объектно-ориентированным образом, и хочу получить отзывы от сообщества по этой теме. Ниже приводится пример шахматной игры, которую я хочу разработать в объектно-ориентированной манере. Это очень обширный дизайн, и на данном этапе я сосредоточен только на том, чтобы определить, кто отвечает за какие сообщения и как объекты взаимодействуют друг с другом, чтобы имитировать игру. Пожалуйста, укажите, есть ли элементы плохого дизайна (сильное сцепление, плохое сцепление и т. Д.) И как их улучшить.
В шахматной игре есть следующие классы
- Доска
- Игрок
- Кусок
- Площадь
- Игра в шахматы
Доска состоит из квадратов, поэтому на нее можно возложить ответственность за создание и управление объектами Square. Каждая фигура также находится на квадрате, поэтому каждая фигура также имеет ссылку на квадрат, на котором она находится. (Имеет ли это смысл?). Каждая фигура должна перемещаться с одного поля на другое. Класс игрока содержит ссылки на все части, которыми он владеет, а также отвечает за их создание (должен ли игрок создавать фигуры?). У игрока есть метод takeTurn, который, в свою очередь, вызывает метод movePiece, принадлежащий классу фигур, который изменяет местоположение фигуры с ее текущего местоположения на другое. Теперь я не понимаю, за что именно должен отвечать класс Board. Я предположил, что это необходимо, чтобы определить текущее состояние игры и узнать, когда игра закончится. Но когда кусок меняет это ' Расположение как обновить доску? должен ли он поддерживать отдельный массив квадратов, на которых существуют фигуры и который обновляется по мере движения фигур?
Кроме того, ChessGame изначально создает объекты Board и player, которые, в свою очередь, создают квадраты и фигуры соответственно и запускают моделирование. Вкратце, так может выглядеть код в ChessGame.
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
Я не понимаю, как будет обновляться состояние платы. Должна ли фигура иметь ссылку на доску? Где должна лежать ответственность? Кто какие ссылки держит? Пожалуйста, помогите мне с вашими комментариями и укажите на проблемы в этом дизайне. Я намеренно не сосредотачиваюсь на каких-либо алгоритмах или других деталях игрового процесса, поскольку меня интересует только аспект дизайна. Я надеюсь, что это сообщество может предоставить ценную информацию.
takeTurn()
если ход p1 завершает игру. Менее придирчивый комментарий: мне кажется более естественным назвать игроковwhite
иblack
.