Qt::Шахматы. Часть 2
Во второй части цикла статей, посвященного написанию шахмат, будет рассмотрена организация ходов по доске. Для начала введем два класса: QPiece – фигура и QGame – игра.
QPiece
Вообще далее фигура будет абстрактным классом, а работать мы будем с ее наследниками, но сейчас, для организации ходов по доске можно будет обойтись без них.
Фигура будет наследником от QSvgWidget, виджета, для отображения svg картинок.
Свойства фигуры
- State- состояние. Фигуры будет иметь два основных состояния: Simple (обычная фигура) и Deleted (уже срубленная). Доступно для записи и для чтения.
- Color– цвет фигуры (белая или черная). Свойство доступно только для чтения. Тип bool.
- Position– позиция фигуры на доске. Доступно для записи и чтения.
- Board – доска. Тип QBoard, доступна только для чтения.
Объявление:
- class QPiece : public QSvgWidget
- {
- Q_OBJECT
- public:
- enum State { Simple, Deleted };
- QPoint position();
- void setPosition( QPoint value );
- bool color();
- static QGame *game();
- void setState( State value );
- State state();
- QBoard *board();
- QPiece( QPoint position, QWidget *board );
- protected:
- QBoard *_board;
- QPoint _position;
- State _state;
- bool _color;
- };
паттерны, qt, cpp
Qt::Шахматы. Часть 1. Введение
В этом цикле статей будет разработано приложение для игры в шахматы. Вообще, написание шахмат, без искусственного интеллекта, довольно распространенная задача по практике в объектно-ориентированном программировании. Тут есть и наследование, полиморфизм, инкапсуляция, можно даже придумать, куда приделать паттерны :).
Сначала мы напишем шахматы типа человек против человека, а искусственному интеллекту будет посвящен уже другой цикл статей. В качестве IDE будем использовать отличный Qt Creator (скачать можно здесь, если в системе нет Qt, то лучше качать полностью Qt SDK).
Требования к программе
- Проверка хода согласно правилам для каждой из фигур.
- Проверки на шах, мат и пат.
- Возможность рокировки.
- Подсветка возможных ходов.
- Размер доски должен подстраиваться под размер окна.
Внешний вид
Определимся с внешним видом приложения. За основу можно взять оформление glChess, шахмат, которые идут в комплекте с Gnome. Картинки фигурок должны быть в векторном формате, что бы шахматы смотрелись одинаково хорошо при любом размере окна. Такие картинки были найдены на просторах интернета, скачать их можно здесь (формат svg).
В конечном итоге приложение может выглядеть так (KDE4):
Зеленым подсвечивается выбранная в данный момент фигура, синим - возможные ходы и красным фигуры, которые можно срубить.
qt, cppC++ Builder::Resize. Часть 2
В перовой части этого цикла мы добились того, что вокруг некоторого визуального компонента отрисовываются восемь маркеров. Но ни изменения размеров ни перетаскивания мы не обеспечили.
Перетаскивание объекта
Сделаем сначала возможность перетаскивание компонента. Как было оговорено ранее, это будет реализовано в классе TResize. Перетаскивание объекта можно реализовать самым простым способом – переопределением некоторых событий мыши (Down, Move и Up). Но тут возникает проблема, так как сам компонент, с которым мы работает, объявлен типа TControl, а события мыши у него закрыты (в protected).
Эту проблему можно решить привидением к типу, лежащему ниже в иерархии классов, но этот будет довольно сложно реализовать, так как придется определять, является ли компонент TGraphicControl или TWinControl. Поэтому проще самому ввести класс, наследника TControl, в котором открыть события мыши. Назовем его TWinCntrl, и уже к нему будет приводить наш компонент.
- class TWinCtrl : public TWinControl {
- __published:
- __property OnMouseMove;
- __property OnMouseUp;
- __property OnMouseDown;
- };
Для реализации перетаскивания компонента сначала добавим следующие private поля:
FDrag : bool – флаг, обозначающий перетаскивают ли сейчас объект.
FOldTop, FOldTop: int – положение курсора на объекте до начала перетаскивания.
- bool FDrag;
- int FOldTop;
- int FOldLeft;
Так же добавим в качестве методов в класс TResize, обработчики событий мыши:
- void __fastcall MouseDown( TObject *Sender, TMouseButton Button,
- TShiftState Shift, int X, int Y );
- void __fastcall MouseMove( TObject *Sender, TShiftState Shift, int X,
- int Y );
- void __fastcall MouseUp( TObject *Sender, TMouseButton Button,
- TShiftState Shift, int X, int Y );
И в конечном итоге, объявление класса будет выглядеть так:... читать дальше
builder, cpp
