連続視対駒判断アルゴリズム


暇にして用事がなくて、以前书いた连连を见て助手をひっくり返して再び改正して、中间はこの驹の判断に関わって、出してみんなと分かち合って交流します
連続して見るルールは以下の通りで、2つの同じ駒には通路が必要で、しかも曲がり角が2つを超えなければ消去できない.この原理によれば、以下の3つの場合の駒は消去できる.
1つ目:直線上の
2つの駒の間に他の駒がないことをよく判断し、コードは以下の通りである:(m,nは2つの駒の点座標である)
                      
BOOL Cllk_assistV20Dlg::IsLine(CPoint m,CPoint n)
{  
	int min_num,max_num;
	if (m.x==n.x)   
	{  
		min_num=m.y>n.y?n.y:m.y;
		max_num=m.y>n.y?m.y:n.y;
		for (int i=min_num+1;i<max_num;i++)
		{
			if (chessdata_int[i][m.x]!=0)
			{
				return FALSE;
			}
		}
		return TRUE;
	}
	else if (m.y==n.y)
	{
		min_num=m.x>n.x?n.x:m.x;
		max_num=m.x>n.x?m.x:n.x;
		for (int i=min_num+1;i<max_num;i++)
		{
			if (chessdata_int[m.y][i]!=0)
			{
				return FALSE;
			}
		}
		return TRUE;
	}
	else
		return FALSE;
}
第2種:1つの角が2つの駒に対応する矩形の他の2つの頂点t,sを先に見つけることができて、それからtとsでそれぞれ2つの駒と直線的に接続して判断して、tとsの中で1つの点が2つの駒と直線的に連通している限り、説明して、2つの駒は1つの角が連通して、アルゴリズムは以下の通りです:
BOOL Cllk_assistV20Dlg::IsOneCorner(CPoint m,CPoint n)
{   

	// m,n        
	if (m.x==n.x||m.y==n.y)
	{
		return FALSE;
	}


	CPoint temp;
	temp.x=m.x;
	temp.y=n.y;	
	if (IsLine(m,temp)&&IsLine(n,temp)&&PointIsEmpty(temp))
	{
		return TRUE;
	}
	else 
	{
		temp.x=n.x;
		temp.y=m.y;
		if (IsLine(m,temp)&&IsLine(n,temp)&&PointIsEmpty(temp))
		{
			return TRUE;
		}
	}
	return FALSE;
第3種:2つのコーナーが上と同様につながっており、そのうちの1つの駒の垂直方向のすべての到達可能な座標点を遍歴し、各座標点と他の駒を1つのコーナー連通判断させ、水平または垂直方向にこのような座標点が存在する場合、2つの駒の2つのコーナー連通
BOOL Cllk_assistV20Dlg::IsTwoCorner(CPoint m,CPoint n)
{
	for (int i=0;i<11;i++)     //   
	{  
		if (i==m.y)
		{
			continue;
		}
		CPoint temp;
		temp.x=m.x;
		temp.y=i;
		if (IsLine(m,temp)&&IsOneCorner(temp,n)&&PointIsEmpty(temp))
		{
			return TRUE;
		}
	}
	for (int i=0;i<19;i++)
	{
		if (i==m.x)
		{
			continue;
		}

		CPoint temp;
		temp.y=m.y;
		temp.x=i;
		if (IsLine(m,temp)&&IsOneCorner(temp,n)&&PointIsEmpty(temp))
		{
			return TRUE;
		}
	}
	return FALSE;
}

最後に2つの駒がこの3つに合致するか否かを順次判断する.
BOOL Cllk_assistV20Dlg::IsConnect(CPoint m,CPoint n)
{   

	if (IsLine(m,n))
	{
		return TRUE;
	}
	else if (IsOneCorner(m,n))
	{
		return TRUE;
	}
	else if (IsTwoCorner(m,n))
	{
		return TRUE;
	}
	else 
		return FALSE;	
}