近来自己学习MFC,于是编写了一个扫雷程序,以下对程序中的几点做一下描述:
1、本程序利用SDI(单文档),创建主体框架。
2、利用绘图与BitBlt创建3D效果和雷区。
3、利用三个数组表示雷区。一个是BOOL型的,表示是否已经打开;一个是int的,表示要显示的数,-1表示雷,正数表示周围雷数,一个是int的,表是显示的方式(如:有无标记)。
4、判断周围雷数的算法,采用遍历方法。
如下:countx表示列数,county表示行数,
int m,n;
int temp[8][2]={-1,-1,
-1, 0,
-1, 1,
0,-1,
0, 1,
1,-1,
1, 0,
1, 1};
for(i=0;i<countx;i++)
for(j=0;j<county;j++)
{
if(-1!=m_BombText[i][j])
{
for(int k=0;k<8;k++)
{ m=i+temp[k][0];
n=j+temp[k][1];
if(m>=0 && m<countx && n>=0 && n<county)
{
if(-1==m_BombText[m][n])
count++;
}
}
m_BombText[i][j]=count;
count=0;
}
}
5、当点到空的格时,应用递归的方法将周围格子显示出来。代码如下:
void empty(int i,int j,int xcount,int ycount,int (*status)[31],int (*text)[31],int (*map)[31])
{
int m,n;
int temp[8][2]={-1,-1,
-1, 0,
-1, 1,
0,-1,
0, 1,
1,-1,
1, 0,
1, 1};
for(int k=0;k<8;k++)
{ m=i+temp[k][0];
n=j+temp[k][1];
if(0==m_BombMap[m][n])
{
if(m>=0 && m<xcount && n>=0 && n<ycount)
{
*(*(status+m)+n)=TRUE;
*(*(map+m)+n)=2;
*(*(text+i)+j)=-10;
if(0==*(*(text+m)+n))
empty(m,n,xcount,ycount,status,text,map);
*(*(text+i)+j)=0;
}
}
}
源程序见http://smallmuou.download.csdn.net/