連続視対駒判断アルゴリズム
暇にして用事がなくて、以前书いた连连を见て助手をひっくり返して再び改正して、中间はこの驹の判断に関わって、出してみんなと分かち合って交流します
連続して見るルールは以下の通りで、2つの同じ駒には通路が必要で、しかも曲がり角が2つを超えなければ消去できない.この原理によれば、以下の3つの場合の駒は消去できる.
1つ目:直線上の
2つの駒の間に他の駒がないことをよく判断し、コードは以下の通りである:(m,nは2つの駒の点座標である)
最後に2つの駒がこの3つに合致するか否かを順次判断する.
連続して見るルールは以下の通りで、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;
}