void CGameLogic_G::InitMap(CGraph &g) { int nRows = CGameControl_G::s_nRows; int nCols = CGameControl_G::s_nCols; for (int i = 0;i < nRows;i++) { for (int j = 0;j < nCols;j++) { g.m_Vertices[i*nCols + j] = j; } } srand((int)time(NULL)); int nVertexNum = nRows*nCols; for (int i = 0;i < nVertexNum;i++) { int nIndex1 = rand() % nVertexNum; int nIndex2 = rand() % nVertexNum; int nTmp = g.GetVertex(nIndex1); g.SetVertex(nIndex1,g.GetVertex(nIndex2)); g.SetVertex(nIndex2, nTmp); } for (int i = 0;i < 100;i++) { for (int j = 0;j < 100;j++) { g.m_AdjMatrix[i][j] = 1; } } }
bool GameLogic::SearchPath2(CGraph &graph, int nV0, int nV1) { //得到顶点数 int nVexnum = graph.GetVexnum(); //遍历图中nV0行,从0列到nVexnum列,值为true的点 for (int nVi = 0; nVi < nVexnum; nVi++) { if (graph.GetArc(nV0, nVi) && !IsExist(nVi)) { //压入当前顶点。假设为路径的一个有效顶点 PushVertex(nVi); if (m_nCorner > 2) { PopVertex(); continue; } if (nVi != nV1) { //当中间顶点为空时,表示该条路径不通 if (graph.GetVertex(nVi) != BLANK) { PopVertex(); continue; } //如果nVi是一个已消除的点,则判断(nVi,nV1)是否连通 if (SearchPath2(graph, nVi, nV1)) { return true; } } else { return true; } PopVertex(); } } return false; }
bool GameLogic::SearchValidPath(CGraph& graph) { //得到顶点数 int nVexnum = graph.GetVexnum(); for (int i = 0; i < nVexnum; i++) { //得到第一个非空顶点 //遍历得到第二个同色顶点 for (int j = 0; j < nVexnum; j++) { if (i != j) { //如果i和j同色 int nInfo1 = graph.GetVertex(i); int nInfo2 = graph.GetVertex(j); if (nInfo1 == nInfo2 && nInfo1 != BLANK && nInfo2 != BLANK) { //压入第一个顶点 PushVertex(i); //搜寻两个点之间的连通路径 if (SearchPath2(graph, i, j)) { return true; } PopVertex(); } } } } return false; }
bool GameLogic::IsBlank(CGraph &graph) { for (int i = 0; i < graph.GetVexnum(); i++) { if (graph.GetVertex(i) != BLANK) { return false; } } return true; }
void GameLogic::UpdateArc(CGraph &graph, int nRow, int nCol) { int nV1Index = nRow * MAX_PIC_NUM + nCol; if (nCol > 0) { int nV2Index = nV1Index - 1; int nInfo1 = graph.GetVertex(nV1Index); int nInfo2 = graph.GetVertex(nV2Index); //TODO:判断与左边相邻的是否有关系 if (nInfo1 == nInfo2 || nInfo1 == BLANK || nInfo2 == BLANK) { graph.AddArc(nV1Index, nV2Index); } } if (nCol < MAX_COL - 1) { int nV2Index = nV1Index + 1; //TODO:判断与右边相邻的是否有关系 int nInfo1 = graph.GetVertex(nV1Index); int nInfo2 = graph.GetVertex(nV2Index); if (nInfo1 == nInfo2 || nInfo1 == BLANK || nInfo2 == BLANK) { graph.AddArc(nV1Index, nV2Index); } } if (nRow > 0) { int nV2Index = nV1Index - MAX_PIC_NUM; //TODO:判断与正上方是否有关系 int nInfo1 = graph.GetVertex(nV1Index); int nInfo2 = graph.GetVertex(nV2Index); if (nInfo1 == nInfo2 || nInfo1 == BLANK || nInfo2 == BLANK) { graph.AddArc(nV1Index, nV2Index); } } if (nRow < MAX_ROW - 1) { int nV2Index = nV1Index + MAX_PIC_NUM; //TODO:判断与正下方是否有关系 int nInfo1 = graph.GetVertex(nV1Index); int nInfo2 = graph.GetVertex(nV2Index); if (nInfo1 == nInfo2 || nInfo1 == BLANK || nInfo2 == BLANK) { graph.AddArc(nV1Index, nV2Index); } } }