Страницы

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

воскресенье, 5 января 2020 г.

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

#ооп #архитектура #qt #cpp


Есть реализация класса 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. Как это реализовать?


Ответы

Ответ 1



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

Ответ 2



Вариант 1) Функция isMoveTo перемещается в FigureList. Это решает часть проблем. Конечно, придется много переписать. Вариант 2) Создается специальный класс, который наследует FigureList. У каждого Figure есть ссылка на этот специальный класс. Так как Figure создается классом FigureList, то никто не мешает ему передать this - то есть ссылку на себя. Это конечно сделает циклические ссылки, но при правильном подходе будет нормально. (при желании можно прикрутить smart_pointer + weak_pointer).

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

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