扫雷的扩展—展开一片(包含递归,指针)

建议

如果没看过上一篇文章,可以先看上一篇“扫雷的实现”文章,并尝试完成扫雷程序

如果已经完成扫雷程序,可以先尝试实现扩展发现的函数,再来看

void Expand_Find(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int *count)
{
    if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
    {
        if (Get_Mine_Count(mine, x, y) == 0 && show[x][y] == '#') // 判断show是#,不然会死循环
        {
            show[x][y] = '0';
            (*count)++;
            for (int i = -1; i < 2; i++)
            {
                for (int j = -1; j < 2; j++)
                {
                    if (i != 0 || j != 0) // i和j不能同时为0,i不等于0或j不等于0,不能是&&
                        Expand_Find(mine, show, x + i, y + j, count);
                }
            }
        }
        else
        {
            if (show[x][y] == '#') // 判断show是#,再改不然会重复该多次,导致count加多
            {
                show[x][y] = Get_Mine_Count(mine, x, y) + '0';
                (*count)++;
            }
        }
    }
}

思路

1.当坐标周围没有雷时,直接将‘0’传给show[x][y],*(count)++

2.通过双重for循环,使周围八个位置调用扩展发现函数,实现递归

3.当周围有雷时,传给show[x][y]雷的个数的字符,*(count)++

提醒

1.判断坐标是否合法(递归后坐标可能非法,与之前Find_Mine函数的判断并不重复)

2.判断show[x][y] 是否等于‘#’(第一个),再继续(否则死递归)

3.i和j必须有一个不为零,但由于“提醒2”的存在可以省略

4.判断show[x][y]是否等于‘#’(第二个),是因为会重复给已经更改完的show[x][y]重新更改,导致count加多

5.(*count)++,而不能是*count++,注意运算符优先级

提醒均为作者所一步步调试,而逐步完善的,希望大家也可以通过调试来找到bug(上篇文章有提到)

扩展函数为作者独立完成,如有错误还望各位大佬指正,如有更好的方法也请各位大佬分享,谢谢大家的阅读

修改的Find_Mine函数

void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x, y, count = 0;
    while (1)
    {
        printf("请输入坐标:");
        scanf("%d %d", &x, &y);;
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (mine[x][y] == '0')
            {
                Expand_Find(mine, show, x, y, &count);//原来两行,改为一行
                Display_Board(show, ROW, COL);
            }
            else
            {
                printf("砰,你被炸死了!\n");
                Display_Board(mine, ROW, COL);
                break;
            }
            if (count == ROW * COL - Easy_Count)
            {
                printf("你赢了!\n");
                break;
            }
        }
        else
            printf("坐标非法,重新输入!\n");
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值