You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
2.3 KiB
54 lines
2.3 KiB
#ifndef LIGHTSOUT_BOARDWIDGET_H |
|
#define LIGHTSOUT_BOARDWIDGET_H |
|
|
|
#include <QWidget> |
|
#include <QVector> |
|
|
|
// Виджет игрового поля: хранит истинные состояния клеток (real, 0/1), |
|
// отображает XOR каждой клетки с четырьмя соседями, опционально показывает |
|
// подсказку (точку) на клетках, чьё истинное значение равно 0. |
|
class BoardWidget : public QWidget { |
|
Q_OBJECT |
|
public: |
|
explicit BoardWidget(QWidget *parent = nullptr); |
|
|
|
// Создаёт новую игру: поле size x size, случайная решаемая позиция. |
|
void newGame(int size); |
|
|
|
// Включает/выключает показ подсказки (точка на клетках real == 0). |
|
void setHintEnabled(bool enabled); |
|
|
|
// Показывается ли сейчас подсказка. |
|
bool isHintEnabled() const { return m_hintEnabled; } |
|
|
|
// Число ходов с начала партии. |
|
int moves() const { return m_moves; } |
|
|
|
signals: |
|
// Испускается после каждого хода; solved == true, если все клетки погашены. |
|
void stateChanged(bool solved); |
|
|
|
protected: |
|
void paintEvent(QPaintEvent *event) override; |
|
void mousePressEvent(QMouseEvent *event) override; |
|
|
|
private: |
|
// Прямоугольник, занимаемый сеткой клеток (центрированный квадрат). |
|
QRectF boardRect() const; |
|
|
|
// Отображаемое значение клетки: XOR её и четырёх соседей. |
|
int displayValue(int row, int col) const; |
|
|
|
// Переключить клетку (обрабатывает клик), пересчитать и проверить победу. |
|
void toggleCell(int row, int col); |
|
|
|
// Проверяет, все ли отображаемые клетки погашены. |
|
bool isSolved() const; |
|
|
|
int m_size = 0; // размер поля (3..8) |
|
QVector<quint8> m_real; // истинное состояние клеток |
|
bool m_hintEnabled = false; // показывать подсказку |
|
int m_moves = 0; // число ходов |
|
}; |
|
|
|
#endif // LIGHTSOUT_BOARDWIDGET_H
|
|
|