예제 소스
SGF 기보로 학습하는 바둑 LLM 인공지능 · 파일 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; ///< 공배 (빈 점)
};