게시판오목 좌표 LoRA: 15×15와 19×19 격자를 정확히 읽히기예제 소스

예제 소스

오목 좌표 LoRA: 15×15와 19×19 격자를 정확히 읽히기 · 파일 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;
};