接上一篇博客,我们还可以优化一下我们的扫雷小游戏
实现展开一片
首先让我们考虑于一下,什么时候我们要展开一片。
- 排查的位置没有被排查过
- 排查的位置不是雷
- 排查的位置周围8个位置都没有雷的时候
因此,我们此次升级就是在SeekMine函数中修改
当满足以上条件的时候,我们将排查的并且周围没有雷的位置的show数组元素置为空格,这时该位置周围的8个位置也会被我们排查一次,所以可以使用递归调用来实现,对于展开函数的实现,最重要的就是递归条件,否则容易出现死递归,造成堆栈溢出。
只要处理好条件,用递归的方式很轻松就可以写出展开函数,
void UnfoldBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { int i = 0; int j = 0; int count = 0; if (x > 0 && x <= ROW && y > 0 && y <= COL)//判断坐标是否合法 { for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { count = get_mine_count(mine, x + i, y + j); if (count == 0)//判断该位置周围有没有雷 { if (show[x + i][y + j] == '*' || show[x + i][y + j] == '#') { show[x + i][y + j] = ' '; UnfoldBoard(mine, show, x + i, y + j); } } } } } }
最后,老规矩,上代码:
https://gitee.com/gascsd/litter-game/tree/master/%E6%89%AB%E9%9B%B7%E5%8D%87%E7%BA%A7plus%E7%89%88