/
mob1le
/
qt-chess
Обзор
Документация
Войти
/
mob1le
/
qt-chess
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/views/board_view.cpp
208 строк
10 KB
mob1le
Добавлено съедение фигур
16 июн 2026, 16:50
16 июн 2026, 16:50
5610045
Код
Авторство
О чём код?
#include "include/views/board_view.hpp" BoardView::BoardView(BoardModel *board_model, QWidget *parent) : QGraphicsView(parent) { m_board_model = board_model; m_scene = new QGraphicsScene(this); setScene(m_scene); m_scene->setSceneRect(0, 0, 8 * squareSize, 8 * squareSize); m_move_is_valid = false; const QColor lightColor("#F0D9B5"); const QColor darkColor("#B58863"); QBrush lightBrush(lightColor); QBrush darkBrush(darkColor); for (int col = 0; col < 8; col++) { for (int row = 0; row < 8; row++) { const bool isLight = (row + col) % 2 == 0; m_scene->addRect(QRectF(row * squareSize, col * squareSize, squareSize, squareSize), QPen(Qt::NoPen), isLight ? lightBrush : darkBrush); } } initPieces(); connect(this, &BoardView::validateMove, board_model, &BoardModel::isValidatingMove); connect(board_model, &BoardModel::removePieceFromScene, this, &BoardView::removingPieceFromScene); } void BoardView::initPieces() { for (int col = 0; col < 8; col++) { for (int row = 0; row < 8; row++) { Piece *piece = m_board_model->getPiece(col, row); switch (piece->getType()) { case PieceType::Bishop: { if (piece->getColor() == PieceColor::Black) { QPixmap icon = QPixmap(":/piece_images/wikipedia/bB.png"); black_bishops.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(black_bishops.back()); connect(black_bishops.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, black_bishops.back(), &ChessPieceItem::changePos); } else if (piece->getColor() == PieceColor::White) { QPixmap icon = QPixmap(":/piece_images/wikipedia/wB.png"); white_bishops.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(white_bishops.back()); connect(white_bishops.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, white_bishops.back(), &ChessPieceItem::changePos); } break; } case PieceType::King: { if (piece->getColor() == PieceColor::Black) { QPixmap icon = QPixmap(":/piece_images/wikipedia/bK.png"); black_kings.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(black_kings.back()); connect(black_kings.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, black_kings.back(), &ChessPieceItem::changePos); } else if (piece->getColor() == PieceColor::White) { QPixmap icon = QPixmap(":/piece_images/wikipedia/wK.png"); white_kings.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(white_kings.back()); connect(white_kings.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, white_kings.back(), &ChessPieceItem::changePos); } break; } case PieceType::Queen: { if (piece->getColor() == PieceColor::Black) { QPixmap icon = QPixmap(":/piece_images/wikipedia/bQ.png"); black_queens.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(black_queens.back()); connect(black_queens.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, black_queens.back(), &ChessPieceItem::changePos); } else if (piece->getColor() == PieceColor::White) { QPixmap icon = QPixmap(":/piece_images/wikipedia/wQ.png"); white_queens.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(white_queens.back()); connect(white_queens.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, white_queens.back(), &ChessPieceItem::changePos); } break; } case PieceType::Knight: { if (piece->getColor() == PieceColor::Black) { QPixmap icon = QPixmap(":/piece_images/wikipedia/bN.png"); black_knights.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(black_knights.back()); connect(black_knights.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, black_knights.back(), &ChessPieceItem::changePos); } else if (piece->getColor() == PieceColor::White) { QPixmap icon = QPixmap(":/piece_images/wikipedia/wN.png"); white_knights.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(white_knights.back()); connect(white_knights.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, white_knights.back(), &ChessPieceItem::changePos); } break; } case PieceType::Rook: { if (piece->getColor() == PieceColor::Black) { QPixmap icon = QPixmap(":/piece_images/wikipedia/bR.png"); black_rooks.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(black_rooks.back()); connect(black_rooks.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, black_rooks.back(), &ChessPieceItem::changePos); } else if (piece->getColor() == PieceColor::White) { QPixmap icon = QPixmap(":/piece_images/wikipedia/wR.png"); white_rooks.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(white_rooks.back()); connect(white_rooks.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, white_rooks.back(), &ChessPieceItem::changePos); } break; } case PieceType::Pawn: { if (piece->getColor() == PieceColor::Black) { QPixmap icon = QPixmap(":/piece_images/wikipedia/bP.png"); black_pawns.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(black_pawns.back()); connect(black_pawns.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, black_pawns.back(), &ChessPieceItem::changePos); } else if (piece->getColor() == PieceColor::White) { QPixmap icon = QPixmap(":/piece_images/wikipedia/wP.png"); white_pawns.push_back(new ChessPieceItem(icon, piece)); m_scene->addItem(white_pawns.back()); connect(white_pawns.back(), &ChessPieceItem::onPieceMove, this, &BoardView::pieceMoved); connect(this, &BoardView::onChangePosition, white_pawns.back(), &ChessPieceItem::changePos); } break; } case PieceType::Empty: break; default: break; } } } } void BoardView::pieceMoved(Position base_pos, Position target_pos) { Piece *piece_before_validate = m_board_model->getPiece(base_pos.getX(), base_pos.getY()); emit validateMove(base_pos, target_pos); Piece *piece_after_validate = m_board_model->getPiece(target_pos.getX(), target_pos.getY()); // Проверка на успешную валидацию if (piece_before_validate == piece_after_validate) { emit onChangePosition(piece_after_validate, target_pos); } else { emit onChangePosition(piece_before_validate, base_pos); } } void BoardView::removingPieceFromScene(Piece *piece) { if (!piece) return; auto removeIfMatches = [this, piece](auto &vector) { for (auto it = vector.begin(); it != vector.end(); ++it) { if ((*it)->getPiece() == piece) { m_scene->removeItem(*it); return true; } } return false; }; removeIfMatches(white_rooks) || removeIfMatches(black_rooks) || removeIfMatches(white_knights) || removeIfMatches(black_knights) || removeIfMatches(white_bishops) || removeIfMatches(black_bishops) || removeIfMatches(white_queens) || removeIfMatches(black_queens) || removeIfMatches(white_kings) || removeIfMatches(black_kings) || removeIfMatches(white_pawns) || removeIfMatches(black_pawns); }