게시판바둑 on-policy 학습: 대국 로그를 KataGo 라벨로 바꾸기예제 소스

예제 소스

바둑 on-policy 학습: 대국 로그를 KataGo 라벨로 바꾸기 · 파일 169개

boardwidget.h

#pragma once

#include "goboard.h"
#include <QImage>
#include <QSet>
#include <QVector>
#include <QWidget>

class QTimer;

/**
 * 19×19 바둑판을 그리고 교차점 클릭을 시그널로 알리는 위젯.
 *
 * 게임 규칙은 모두 GoBoard 가 처리합니다. 위젯은 그리기/입력만 담당.
 */
class BoardWidget final : public QWidget {
    Q_OBJECT
public:
    explicit BoardWidget(QWidget *parent = nullptr);

    /// 보드 셀 1D (size*size). 길이 0 이면 빈 19x19 로 그립니다.
    void refreshFromBoard(const QVector<Stone> &cells, int size);

    /// 마지막 둔 수 표시 (붉은 깜빡이는 링). row<0 이면 표시 해제.
    /// blink=false 면 정적 표시 (예: 종국 직전 마지막 수).
    void setLastMove(int row, int col, bool blink = true);

    /// 보드만 그린 PNG (VLM 송신용). VLM 추론에 도움이 되는 단순 이미지.
    QImage renderToImage(int pxSize = 720) const;

    /// 계가 모드용 오버레이.
    ///   - deadStones: 사석으로 표시할 점들 (해당 자리에 큰 X 마크)
    ///   - territoryBlack/White: 그쪽 영토로 인정된 빈 점 (검/흰 작은 동그라미)
    ///   - dame: 공배 (회색 점)
    /// 모두 비어 있으면 오버레이 미표시 (일반 대국 화면).
    void setScoringOverlay(const QSet<int> &deadStones,
                           const QSet<int> &territoryBlack,
                           const QSet<int> &territoryWhite,
                           const QSet<int> &dame);
    void clearScoringOverlay();

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;

    void drawBoard(QPainter &p, int wpx, int hpx, qreal sp, QPointF off) const;

    int currentBoardSize() const { return m_size; }

    QVector<Stone> m_cells; ///< size*size
    int m_size = kBoardSize;
    int m_lastRow = -1;
    int m_lastCol = -1;
    bool m_blinkOn = true;
    QTimer *m_blinkTimer = nullptr;
    static constexpr qreal kStoneRadiusFactor = 0.46;

    // 계가 오버레이 (없으면 모두 빈 set).
    QSet<int> m_deadSet;       ///< 사석으로 표시할 (r*N+c) 인덱스
    QSet<int> m_territoryBlk;  ///< 흑 영토 (빈 점)
    QSet<int> m_territoryWht;  ///< 백 영토 (빈 점)
    QSet<int> m_dameSet;       ///< 공배 (빈 점)
};