55 lines
2.3 KiB
C++
55 lines
2.3 KiB
C++
#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
|