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

#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