//连连看消除算法:(以具有7行8列的连连看为例)
//根据传入的两个点和BOOL型的二维数组mbGrid[9][10] (TRUE代表有图片,FALSE代表无图片)
//如果两点可以消去函数返回TRUE,否则返回FALSE
BOOL CGameLogic::RemoveAble(
int
x1,
int
y1,
int
x2,
int
y2)
... {
int i,j,k=0;
if ( (x1==x2 && (y1==y2-1 || y1==y2+1)) || (y1==y2 && (x1==x2-1 || x1==x2+1)) ) //相邻
...{
return TRUE;
}
else
...{
//------------------------遍历与第1个点在同一行上的所有点------------------------
for (i=0; i<10; i++)
...{
if ( !m_bGrid[x1][i] ) //如果点为空(即图片不显示)
...{
if (y2 > i) //如果第2点在空点右面(或斜右)
...{
for (j=y2-1; j>=i; j--) //遍历第2点到空点所在列对应点间的所有点
...{
if ( m_bGrid[x2][j] ) //如果有一个非空则跳出
...{
k = 0;
break;
}
k = 1; //k=1表示通过第一步验证
}
if (k == 1)
...{
if (y1 > i) //第1点在空点右面或斜右
...{
for (j=y1-1; j>=i; j--) //遍历第1点到空点间的所有点
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2; //k=2表示通过第2步验证
}
}
else if (y1 < i) //空点在第1点下面
...{
for (j=y1+1; j<=i; j++)
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (y2 < i)
...{
for (j=y2+1; j<=i; j++)
...{
if ( m_bGrid[x2][j] )
...{
k = 0;
break;
}
k = 1;
}
if (k == 1)
...{
if (y1 > i) //第1点在空点右面或斜右
...{
for (j=y1-1; j>=i; j--) //遍历第1点到空点间的所有点
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2; //k=2表示通过第2步验证
}
}
else if (y1 < i) //空点在第1点下面
...{
for (j=y1+1; j<=i; j++)
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (y2 == i)
...{
if (y1 > i) //第1点在空点右面或斜右
...{
for (j=y1-1; j>=i; j--) //遍历第1点到空点间的所有点
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2; //k=2表示通过第2步验证
}
}
else if (y1 < i) //空点在第1点下面
...{
for (j=y1+1; j<=i; j++)
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
if (k == 2)
...{
if (x1 > x2) //第1点在第2点下面或斜下
...{
for (j=x1; j>=x2+1; j--)
...{
if ( m_bGrid[j][i] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (x1 < x2)
...{
for (j=x1; j<=x2-1; j++)
...{
if ( m_bGrid[j][i] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (x1 == x2)
...{
return TRUE;
}
}
if (k == 3)
return TRUE;
}
//-----------------遍历与第一个点在同一列上的所有点---------------------
for (i=0; i<9; i++)
...{
if ( !m_bGrid[i][y1] )
...{
if (x2 > i)
...{
for (j=x2-1; j>=i; j--)
...{
if ( m_bGrid[j][y2] )
...{
k = 0;
break;
}
k = 1;
}
if (k == 1)
...{
if (x1 > i)
...{
for (j=x1-1; j>=i; j--)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
else if (x1 < i)
...{
for (j=x1+1; j<=i; j++)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (x2 < i)
...{
for (j=x2+1; j<=i; j++)
...{
if ( m_bGrid[j][y2] )
...{
k = 0;
break;
}
k = 1;
}
if (k == 1)
...{
if (x1 > i)
...{
for (j=x1-1; j>=i; j--)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
else if (x1 < i)
...{
for (j=x1+1; j<=i; j++)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (x2 == i)
...{
if (x1 > i)
...{
for (j=x1-1; j>=i; j--)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
else if (x1 < i)
...{
for (j=x1+1; j<=i; j++)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
if (k == 2)
...{
if (y1 > y2)
...{
for (j=y1; j>=y2+1; j--)
...{
if ( m_bGrid[i][j] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (y1 < y2)
...{
for (j=y1; j<=y2-1; j++)
...{
if ( m_bGrid[i][j] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (y1 == y2)
...{
return TRUE;
}
}
if (k == 3)
return TRUE;
}
}
return FALSE;
}
... {
int i,j,k=0;
if ( (x1==x2 && (y1==y2-1 || y1==y2+1)) || (y1==y2 && (x1==x2-1 || x1==x2+1)) ) //相邻
...{
return TRUE;
}
else
...{
//------------------------遍历与第1个点在同一行上的所有点------------------------
for (i=0; i<10; i++)
...{
if ( !m_bGrid[x1][i] ) //如果点为空(即图片不显示)
...{
if (y2 > i) //如果第2点在空点右面(或斜右)
...{
for (j=y2-1; j>=i; j--) //遍历第2点到空点所在列对应点间的所有点
...{
if ( m_bGrid[x2][j] ) //如果有一个非空则跳出
...{
k = 0;
break;
}
k = 1; //k=1表示通过第一步验证
}
if (k == 1)
...{
if (y1 > i) //第1点在空点右面或斜右
...{
for (j=y1-1; j>=i; j--) //遍历第1点到空点间的所有点
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2; //k=2表示通过第2步验证
}
}
else if (y1 < i) //空点在第1点下面
...{
for (j=y1+1; j<=i; j++)
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (y2 < i)
...{
for (j=y2+1; j<=i; j++)
...{
if ( m_bGrid[x2][j] )
...{
k = 0;
break;
}
k = 1;
}
if (k == 1)
...{
if (y1 > i) //第1点在空点右面或斜右
...{
for (j=y1-1; j>=i; j--) //遍历第1点到空点间的所有点
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2; //k=2表示通过第2步验证
}
}
else if (y1 < i) //空点在第1点下面
...{
for (j=y1+1; j<=i; j++)
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (y2 == i)
...{
if (y1 > i) //第1点在空点右面或斜右
...{
for (j=y1-1; j>=i; j--) //遍历第1点到空点间的所有点
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2; //k=2表示通过第2步验证
}
}
else if (y1 < i) //空点在第1点下面
...{
for (j=y1+1; j<=i; j++)
...{
if ( m_bGrid[x1][j] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
if (k == 2)
...{
if (x1 > x2) //第1点在第2点下面或斜下
...{
for (j=x1; j>=x2+1; j--)
...{
if ( m_bGrid[j][i] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (x1 < x2)
...{
for (j=x1; j<=x2-1; j++)
...{
if ( m_bGrid[j][i] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (x1 == x2)
...{
return TRUE;
}
}
if (k == 3)
return TRUE;
}
//-----------------遍历与第一个点在同一列上的所有点---------------------
for (i=0; i<9; i++)
...{
if ( !m_bGrid[i][y1] )
...{
if (x2 > i)
...{
for (j=x2-1; j>=i; j--)
...{
if ( m_bGrid[j][y2] )
...{
k = 0;
break;
}
k = 1;
}
if (k == 1)
...{
if (x1 > i)
...{
for (j=x1-1; j>=i; j--)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
else if (x1 < i)
...{
for (j=x1+1; j<=i; j++)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (x2 < i)
...{
for (j=x2+1; j<=i; j++)
...{
if ( m_bGrid[j][y2] )
...{
k = 0;
break;
}
k = 1;
}
if (k == 1)
...{
if (x1 > i)
...{
for (j=x1-1; j>=i; j--)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
else if (x1 < i)
...{
for (j=x1+1; j<=i; j++)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
else if (x2 == i)
...{
if (x1 > i)
...{
for (j=x1-1; j>=i; j--)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
else if (x1 < i)
...{
for (j=x1+1; j<=i; j++)
...{
if ( m_bGrid[j][y1] )
...{
k = 0;
break;
}
k = 2;
}
}
}
}
if (k == 2)
...{
if (y1 > y2)
...{
for (j=y1; j>=y2+1; j--)
...{
if ( m_bGrid[i][j] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (y1 < y2)
...{
for (j=y1; j<=y2-1; j++)
...{
if ( m_bGrid[i][j] )
...{
k = 0;
break;
}
k = 3;
}
}
else if (y1 == y2)
...{
return TRUE;
}
}
if (k == 3)
return TRUE;
}
}
return FALSE;
}