#ifndef LIGHTSOUT_BOARDWIDGET_H #define LIGHTSOUT_BOARDWIDGET_H #include #include // Виджет игрового поля: хранит истинные состояния клеток (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 m_real; // истинное состояние клеток bool m_hintEnabled = false; // показывать подсказку int m_moves = 0; // число ходов }; #endif // LIGHTSOUT_BOARDWIDGET_H