diff --git a/src/core/Board.cpp b/src/core/Board.cpp index 09b3f04..283f1c4 100644 --- a/src/core/Board.cpp +++ b/src/core/Board.cpp @@ -2,5 +2,28 @@ Board::Board(int rows, int cols) : m_rows(rows), - m_cols(cols), - m_grid(rows, ) \ No newline at end of file + m_cols(cols) +{ + m_grid.resize(m_rows * m_cols); + m_component = std::make_unique(m_rows * m_cols); +} + +Board::~Board() { + +} + +const int Board::getIndex(int row, int col) { + return row * m_cols + col; +} + +bool Board::initialize() { + m_grid[getIndex(0, 0)] = std::make_unique(PlayerID::P1); + m_grid[getIndex(0, 2)] = std::make_unique(PlayerID::P1); + m_grid[getIndex(6, 6)] = std::make_unique(PlayerID::P2); + m_grid[getIndex(5, 5)] = std::make_unique(PlayerID::P2); +} + + +std::unique_ptr& Board::at(int row, int col) { + return m_grid[row * m_cols + col]; +} \ No newline at end of file diff --git a/src/core/Board.h b/src/core/Board.h index 77fcf32..46ddad9 100644 --- a/src/core/Board.h +++ b/src/core/Board.h @@ -1,5 +1,6 @@ #pragma once #include "Piece.h" +#include "ComponentManager.h" #include #include // 用 (row, col) 表示坐标,0-based @@ -14,11 +15,15 @@ struct Position { class Board { private: - std::vector>> m_grid; + //使用一维数组表示棋盘 + std::vector> m_grid; + std::unique_ptr m_component; const int m_rows; const int m_cols; public: Board(int rows, int cols); ~Board(); - + const int getIndex(int row, int col); + std::unique_ptr& at(int row, int col); + bool initialize(); }; \ No newline at end of file diff --git a/src/core/ConnectedComponentManager.cpp b/src/core/ComponentManager.cpp similarity index 78% rename from src/core/ConnectedComponentManager.cpp rename to src/core/ComponentManager.cpp index ba94be3..7fbc99c 100644 --- a/src/core/ConnectedComponentManager.cpp +++ b/src/core/ComponentManager.cpp @@ -1,6 +1,6 @@ -#include "ConnectedComponentManager.h" +#include "ComponentManager.h" -ConnectedComponentManager::ConnectedComponentManager(int numPieces) +ComponentManager::ComponentManager(int numPieces) : m_totalPieces(numPieces) { //初始化数组大小 ROWS * COLS m_parent.resize(numPieces); @@ -14,14 +14,14 @@ ConnectedComponentManager::ConnectedComponentManager(int numPieces) } } -int ConnectedComponentManager::find(int pieceId) { +int ComponentManager::find(int pieceId) { if (m_parent[pieceId] != pieceId) { m_parent[pieceId] = find(m_parent[pieceId]); } return m_parent[pieceId]; } -void ConnectedComponentManager::unite(int pieceId1, int pieceId2) { +void ComponentManager::unite(int pieceId1, int pieceId2) { int root1 = find(pieceId1); int root2 = find(pieceId2); @@ -49,14 +49,14 @@ void ConnectedComponentManager::unite(int pieceId1, int pieceId2) { addConnection(pieceId1, pieceId2); } -void ConnectedComponentManager::addConnection(int pieceId1, int pieceId2) { +void ComponentManager::addConnection(int pieceId1, int pieceId2) { //将元素放入邻接表 m_adjacentList[pieceId1].insert(pieceId2); m_adjacentList[pieceId2].insert(pieceId1); } -bool ConnectedComponentManager::disconnectFromNeighbor(int pieceId, int neighborId){ +bool ComponentManager::disconnectFromNeighbor(int pieceId, int neighborId){ // 检查是否真的相连 if (!areDirectlyConnected(pieceId, neighborId)) { return false; @@ -70,7 +70,7 @@ bool ConnectedComponentManager::disconnectFromNeighbor(int pieceId, int neighbor return true; } -bool ConnectedComponentManager::disconnectFromComponent(int pieceId) { +bool ComponentManager::disconnectFromComponent(int pieceId) { int oldComponentId = find(pieceId); if (oldComponentId == -1) return false; @@ -96,7 +96,7 @@ bool ConnectedComponentManager::disconnectFromComponent(int pieceId) { return true; } -void ConnectedComponentManager::recomputeComponentsAfterDisconnection(int disconnectedPiece) { +void ComponentManager::recomputeComponentsAfterDisconnection(int disconnectedPiece) { int oldComponentId = find(disconnectedPiece); if (oldComponentId == -1 || m_componentPieces[disconnectedPiece].size() <= 1) { return; @@ -110,7 +110,7 @@ void ConnectedComponentManager::recomputeComponentsAfterDisconnection(int discon handleComponentSplit(oldComponentId, remainingPieces); } -void ConnectedComponentManager::handleComponentSplit(int oldComponentId, const std:: unordered_set& remainingPieces ) { +void ComponentManager::handleComponentSplit(int oldComponentId, const std:: unordered_set& remainingPieces ) { std::unordered_set visited; std::vector> newComponents; @@ -148,7 +148,7 @@ void ConnectedComponentManager::handleComponentSplit(int oldComponentId, const s } -std::unordered_set ConnectedComponentManager::bfsConnectedRegion(int startPiece, const std::unordered_set& availablepieces) { +std::unordered_set ComponentManager::bfsConnectedRegion(int startPiece, const std::unordered_set& availablepieces) { std::unordered_set connectedRegion; std::queue queue; @@ -173,7 +173,7 @@ std::unordered_set ConnectedComponentManager::bfsConnectedRegion(int startP return connectedRegion; } -int ConnectedComponentManager::createNewComponent(int rootPiece) { +int ComponentManager::createNewComponent(int rootPiece) { m_parent[rootPiece] = rootPiece; m_rank[rootPiece] = 0; m_componentPieces[rootPiece] = {rootPiece}; @@ -181,11 +181,11 @@ int ConnectedComponentManager::createNewComponent(int rootPiece) { return rootPiece; } -void ConnectedComponentManager::selectComponentByPiece(int pieceId) { +void ComponentManager::selectComponentByPiece(int pieceId) { m_selectedComponentId = find(pieceId); } -const std::unordered_set& ConnectedComponentManager::getSelectedComponent() const { +const std::unordered_set& ComponentManager::getSelectedComponent() const { static std::unordered_set emptySet; if (m_selectedComponentId == -1 || m_componentPieces.find(m_selectedComponentId) == m_componentPieces.end()) { @@ -195,29 +195,29 @@ const std::unordered_set& ConnectedComponentManager::getSelectedComponent() return m_componentPieces.at(m_selectedComponentId); } -int ConnectedComponentManager::getComponentId(int pieceId) const { +int ComponentManager::getComponentId(int pieceId) const { auto it = m_pieceToComponent.find(pieceId); return (it != m_pieceToComponent.end()) ? it->second : -1; } -const std::unordered_set& ConnectedComponentManager::getPiecesInComponent(int componentId) const { +const std::unordered_set& ComponentManager::getPiecesInComponent(int componentId) const { static std::unordered_set emptySet; auto it = m_componentPieces.find(componentId); return (it != m_componentPieces.end()) ? it->second : emptySet; } -bool ConnectedComponentManager::areConnected(int pieceId1, int pieceId2) { +bool ComponentManager::areConnected(int pieceId1, int pieceId2) { return find(pieceId1) == find(pieceId2); } -const std::unordered_set& ConnectedComponentManager::getPieceConnections(int pieceId) const { +const std::unordered_set& ComponentManager::getPieceConnections(int pieceId) const { static std::unordered_set emptySet; if (pieceId < 0 || pieceId >= m_totalPieces) return emptySet; return m_adjacentList[pieceId]; } -bool ConnectedComponentManager::areDirectlyConnected(int pieceId1, int pieceId2) const { +bool ComponentManager::areDirectlyConnected(int pieceId1, int pieceId2) const { if (pieceId1 < 0 || pieceId1 >= m_totalPieces || pieceId2 < 0 || pieceId2 >= m_totalPieces) { return false; @@ -225,11 +225,11 @@ bool ConnectedComponentManager::areDirectlyConnected(int pieceId1, int pieceId2) return m_adjacentList[pieceId1].find(pieceId2) != m_adjacentList[pieceId1].end(); } -void ConnectedComponentManager::clearSelection() { +void ComponentManager::clearSelection() { m_selectedComponentId = -1; } -std:: unordered_map> ConnectedComponentManager::getAllComponents() const { +std:: unordered_map> ComponentManager::getAllComponents() const { return m_componentPieces; } diff --git a/src/core/ConnectedComponentManager.h b/src/core/ComponentManager.h similarity index 96% rename from src/core/ConnectedComponentManager.h rename to src/core/ComponentManager.h index 7253c53..26d6e6c 100644 --- a/src/core/ConnectedComponentManager.h +++ b/src/core/ComponentManager.h @@ -5,7 +5,7 @@ #include #include -class ConnectedComponentManager { +class ComponentManager { private: // 并查集的父节点数组,使用连续内存存储 std::vector m_parent; @@ -35,7 +35,7 @@ private: public: // 构造函数:初始化指定数量的棋子 - explicit ConnectedComponentManager(int numPieces); + explicit ComponentManager(int numPieces); // 查找操作(带路径压缩) int find(int pieceId); // 合并两个棋子所在的组件(按秩合并) diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 77b2714..6342728 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -4,7 +4,7 @@ Game::Game() { - + m_board = std::make_unique(); } @@ -19,12 +19,15 @@ void Game::cleanup() { bool Game::initialize() { - + // 初始化游戏特定资源(棋盘、棋子等) + if (!m_board->initialize()) { + return false; + } - // 初始化游戏特定资源(棋盘、棋子等) + // ... return true; } diff --git a/src/core/Game.h b/src/core/Game.h index cfbc102..277039a 100644 --- a/src/core/Game.h +++ b/src/core/Game.h @@ -2,14 +2,14 @@ #pragma once #include #include -//#include "Board.h" +#include "Board.h" class Game { private: - + std::unique_ptr m_board; diff --git a/src/core/Piece.cpp b/src/core/Piece.cpp index 2eefd55..f2e06e1 100644 --- a/src/core/Piece.cpp +++ b/src/core/Piece.cpp @@ -1,6 +1,6 @@ #include "Piece.h" -Piece::Piece(PlayerColer color) : m_color(color) { +Piece::Piece(PlayerID ID) : m_owner(ID) { } @@ -8,6 +8,6 @@ Piece::~Piece() { } -PlayerColer Piece::getPlayerColor() const { - return m_color; +PlayerID Piece::getPieceOwner() const { + return m_owner; } \ No newline at end of file diff --git a/src/core/Piece.h b/src/core/Piece.h index a63d39e..a086ba0 100644 --- a/src/core/Piece.h +++ b/src/core/Piece.h @@ -1,18 +1,18 @@ #pragma once -enum class PlayerColer { - WHITE, - BLACK +enum class PlayerID { + P1, + P2 }; class Piece { private: - PlayerColer m_color; + PlayerID m_owner; public: - Piece(PlayerColer color); + Piece(PlayerID ID); ~Piece(); - PlayerColer getPlayerColor() const; + PlayerID getPieceOwner() const; }; \ No newline at end of file