예제 소스
오목 Next.js 웹과 VLM 착수 API 연결하기 · 파일 59개
boardwidget.h
#pragma once
#include "boardmodel.h"
#include <QVector>
#include <QWidget>
class QTimer;
class BoardWidget final : public QWidget {
Q_OBJECT
public:
explicit BoardWidget(QWidget *parent = nullptr);
/** 그림용 상태만 맞춥니다. 게임 규칙은 MainWindow와 BoardModel에서 처리합니다. */
void refreshFromBoard(const QVector<QVector<Cell>> &cells);
/** 마지막 둔 수 위치를 표시(기본: 깜빡임). row<0 이면 표시 해제.
* blink=false 이면 깜빡임 없이 마커만 정적으로 표시 (예: 승리 수). */
void setLastMove(int row, int col, bool blink = true);
signals:
void intersectionClicked(int row, int col);
protected:
void paintEvent(QPaintEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
QSize sizeHint() const override;
QSize minimumSizeHint() const override;
private:
/** 위젯 크기에 맞춰 격자 간격·첫 교차점(좌상단)을 계산합니다. */
void gridLayout(qreal *outSpacing, QPointF *outOrigin) const;
QPointF pointForIntersection(int row, int col) const;
int currentBoardSize() const
{
return m_cells.isEmpty() ? BOARD_SIZE : int(m_cells.size());
}
QVector<QVector<Cell>> m_cells;
int m_lastRow = -1;
int m_lastCol = -1;
bool m_blinkOn = true;
QTimer *m_blinkTimer = nullptr;
static constexpr qreal kStoneRadiusFactor = 0.42;
};