コード例 #1
0
ファイル: GameLogic_G.cpp プロジェクト: AprilCal/LLKCppPro
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;
		}
	}

}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
bool GameLogic::IsBlank(CGraph &graph) {
	for (int i = 0; i < graph.GetVexnum(); i++) {
		if (graph.GetVertex(i) != BLANK) {
			
			return false;
		}
	}
	return true;
}
コード例 #5
0
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);
		}
	}
}