最开始想到采用递归,对点的那一块周围八块进行递归操作 8个递归 实际过程中 会产生栈溢出 无法使用。
void saolei(int leipan[X11][Y11], char youxipan[X11][Y11],int x,int y,int x1, int y1)
{
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1))
{
int m = leipan[x - 1][y - 1] + leipan[x - 1][y] + leipan[x - 1][y + 1] + leipan[x][y - 1] + leipan[x][y + 1] + leipan[x + 1][y - 1] + leipan[x + 1][y] + leipan[x + 1][y + 1];
if (m == 0)
{
youxipan[x][y] = ' ';
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1)) //递归不动 栈溢出
{
saolei(leipan, youxipan, x - 1, y , x1, y1);
saolei(leipan, youxipan, x - 1, y - 1, x1, y1);
saolei(leipan, youxipan, x - 1, y + 1, x1, y1);
saolei(leipan, youxipan, x, y - 1, x1, y1);
saolei(leipan, youxipan, x, y + 1, x1, y1);
saolei(leipan, youxipan, x + 1, y - 1, x1, y1);
saolei(leipan, youxipan, x + 1, y, x1, y1);
saolei(leipan, youxipan, x + 1, y + 1, x1, y1);
}
}
else
youxipan[x][y] = m + '0';//字符1 2 3 用的ASC||码
}
}
可以看到上面那个盘为实际游戏显示的 下面那个盘是实际游戏过程中,不会显示的这里为了演示消0区 故拿出来
可以看到这里 没有雷 实际的效果希望可以直接消一些方块
一个函数里面又调用八次 8的指数倍增长 会造成栈溢出 故这里想达到这个效果递归不在可用
这里采用 首写判断程序 代替递归 实际就是这个函数复制 稍微修改一下即可
复制了四个 实现了需要的效果 而且不会溢出
代码:
void saolei(int leipan[X11][Y11], char youxipan[X11][Y11],int x,int y,int x1, int y1)
{
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1))
{
int m = leipan[x - 1][y - 1] + leipan[x - 1][y] + leipan[x - 1][y + 1] + leipan[x][y - 1] + leipan[x][y + 1] + leipan[x + 1][y - 1] + leipan[x + 1][y] + leipan[x + 1][y + 1];
if (m == 0)
{
youxipan[x][y] = ' ';
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1)) //递归不动 栈溢出
{
digui1(leipan, youxipan, x - 1, y, x1, y1);//用函数代替递归四次
digui1(leipan, youxipan, x - 1, y - 1, x1, y1);
digui1(leipan, youxipan, x - 1, y + 1, x1, y1);
digui1(leipan, youxipan, x, y - 1, x1, y1);
digui1(leipan, youxipan, x, y + 1, x1, y1);
digui1(leipan, youxipan, x + 1, y - 1, x1, y1);
digui1(leipan, youxipan, x + 1, y, x1, y1);
digui1(leipan, youxipan, x + 1, y + 1, x1, y1);
/* saolei(leipan, youxipan, x - 1, y , x1, y1);
saolei(leipan, youxipan, x - 1, y - 1, x1, y1);
saolei(leipan, youxipan, x - 1, y + 1, x1, y1);
saolei(leipan, youxipan, x, y - 1, x1, y1);
saolei(leipan, youxipan, x, y + 1, x1, y1);
saolei(leipan, youxipan, x + 1, y - 1, x1, y1);
saolei(leipan, youxipan, x + 1, y, x1, y1);
saolei(leipan, youxipan, x + 1, y + 1, x1, y1);
}*/
}
else
youxipan[x][y] = m + '0';//字符1 2 3 用的ASC||码
}
}
void digui1(int leipan[X11][Y11], char youxipan[X11][Y11], int x, int y, int x1, int y1)
{
int m = 0;
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1))
{
m= leipan[x - 1][y - 1] + leipan[x - 1][y] + leipan[x - 1][y + 1] + leipan[x][y - 1] + leipan[x][y + 1] + leipan[x + 1][y - 1] + leipan[x + 1][y] + leipan[x + 1][y + 1];
if (m == 0)
{
youxipan[x][y] = ' ';
digui2(leipan, youxipan, x - 1, y, x1, y1);
digui2(leipan, youxipan, x - 1, y - 1, x1, y1);
digui2(leipan, youxipan, x - 1, y + 1, x1, y1);
digui2(leipan, youxipan, x, y - 1, x1, y1);
digui2(leipan, youxipan, x, y + 1, x1, y1);
digui2(leipan, youxipan, x + 1, y - 1, x1, y1);
digui2(leipan, youxipan, x + 1, y, x1, y1);
digui2(leipan, youxipan, x + 1, y + 1, x1, y1);
}
else
youxipan[x][y] = m + '0';//字符1 2 3 用的ASC||码
}
}
void digui2(int leipan[X11][Y11], char youxipan[X11][Y11], int x, int y, int x1, int y1)
{
int m = 0;
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1))
{
m = leipan[x - 1][y - 1] + leipan[x - 1][y] + leipan[x - 1][y + 1] + leipan[x][y - 1] + leipan[x][y + 1] + leipan[x + 1][y - 1] + leipan[x + 1][y] + leipan[x + 1][y + 1];
if (m == 0)
{
youxipan[x][y] = ' ';
digui3(leipan, youxipan, x - 1, y, x1, y1);
digui3(leipan, youxipan, x - 1, y - 1, x1, y1);
digui3(leipan, youxipan, x - 1, y + 1, x1, y1);
digui3(leipan, youxipan, x, y - 1, x1, y1);
digui3(leipan, youxipan, x, y + 1, x1, y1);
digui3(leipan, youxipan, x + 1, y - 1, x1, y1);
digui3(leipan, youxipan, x + 1, y, x1, y1);
digui3(leipan, youxipan, x + 1, y + 1, x1, y1);
}
else
youxipan[x][y] = m + '0';//字符1 2 3 用的ASC||码
}
}
void digui3(int leipan[X11][Y11], char youxipan[X11][Y11], int x, int y, int x1, int y1)
{
int m = 0;
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1))
{
m = leipan[x - 1][y - 1] + leipan[x - 1][y] + leipan[x - 1][y + 1] + leipan[x][y - 1] + leipan[x][y + 1] + leipan[x + 1][y - 1] + leipan[x + 1][y] + leipan[x + 1][y + 1];
if (m == 0)
{
youxipan[x][y] = ' ';
digui4(leipan, youxipan, x - 1, y, x1, y1);
digui4(leipan, youxipan, x - 1, y - 1, x1, y1);
digui4(leipan, youxipan, x - 1, y + 1, x1, y1);
digui4(leipan, youxipan, x, y - 1, x1, y1);
digui4(leipan, youxipan, x, y + 1, x1, y1);
digui4(leipan, youxipan, x + 1, y - 1, x1, y1);
digui4(leipan, youxipan, x + 1, y, x1, y1);
digui4(leipan, youxipan, x + 1, y + 1, x1, y1);
}
else
youxipan[x][y] = m + '0';//字符1 2 3 用的ASC||码
}
}
void digui4(int leipan[X11][Y11], char youxipan[X11][Y11], int x, int y, int x1, int y1)
{
int m = 0;
if ((x > 0) && (x <= x1) && (y > 0) && (y <= y1))
{
m = leipan[x - 1][y - 1] + leipan[x - 1][y] + leipan[x - 1][y + 1] + leipan[x][y - 1] + leipan[x][y + 1] + leipan[x + 1][y - 1] + leipan[x + 1][y] + leipan[x + 1][y + 1];
if (m == 0)
{
youxipan[x][y] = ' ';
}
else
youxipan[x][y] = m + '0';//字符1 2 3 用的ASC||码
}
}
效果展示
即可实现 扫雷中 点一块 消很多块的效果