Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Проектирование архитектуры игры “шахматы”

Есть реализация класса Figure #include "figure.h"
Figure::Figure(QPoint coord,QString name,QRect rect,QString color,QObject *parent) : QObject(parent) { this->name=name; this->color=color; QPixmap img2("C:/Documents and Settings/Denis/QTProjects/chess/spatial.png"); this->_img=img2.copy(rect);
} void Figure::isMoveTo(QPoint from,QPoint to) { //данная функция виртуальная } И есть класс FigureList (список всех фигур): QList

При вызовы функции Figure->isMoveTo(QPoint(1,1),QPoint(1,2)) мы по координатам в списке должны получать тип фигуры,то есть класс Figure должен иметь доступ к FigureList. Как это реализовать?


Ответ

Я бы сделал по-другому. Это не дело фигуры — знать, где расположены другие фигуры. Фигура должна уметь ответить на вопрос: может ли она потенциально перейти на данное поле? перейти на данное поле со взятием? И какие поля при этом будут пройдены. (Различие между переходом и взятием актуально для пешек, например.) А вот уже внешняя по отношению к фигуре логика должна определить, что за фигура стоит на целевом поле, своя/чужая, нет ли на проходимых полях других фигур и т. п. Обратите внимание на специальный случай взятия на проходе (снимается фигура, не стоящая на целевом поле) и рокировки (двигаются две фигуры). Кстати, на английском шахматная фигура называется piece, так что я бы переназвал класс. И ещё: я бы разделил логику фигуры (определяющую, куда фигура может пойти и каков номер поля, на котором она находится) от представления фигуры (определяющего, какая картинка представляет фигуру на экране, и каковы координаты прямоугольника на экране, где она изображается). Это два очевидно разных класса с очевидно разными областями ответственности.

Комментариев нет:

Отправить комментарий