对于扫雷 点一块消周围一片没有雷的区域

最开始想到采用递归,对点的那一块周围八块进行递归操作  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||码

		}
	}

效果展示

即可实现 扫雷中 点一块 消很多块的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值