mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
411 字
1 分钟
用C语言实现扫雷的扩散逻辑
2026-05-03
统计加载中...

用C语言实现扫雷的扩散逻辑#

刚学习完C语言数组部分的内容,跟着b站老师用C语言写了个扫雷游戏,但是老师并没有教我们写扫雷扩散逻辑,所以我就自己设计了一个扫雷的扩散逻辑

什么是扫雷的扩散逻辑#

如图所示,当我们翻开一个位置(图中红色圆圈),如果这个位置为空白区,意味着它的相邻区域(图中红框标记范围)是没有雷的,相邻区域大概可以分为两种情况,一种是数字,一种是空白区。如果是数字,则会直接显示出来;如果是空,除了会显示出来,还会继续检查周围区域,从而继续扩散,直到周围没有空区域为止

扫雷图例

扩散函数的设计#

因为之前有py的基础,看到这种问题第一反应就是用递归的思想去解决。递归调用的条件是周围存在空白区域,递归停止的条件则是周围不存在空白区域,一下是我自己设计的函数

//扩散逻辑
//char mine[][COLS] 存放雷的字符数组,1为雷,0为安全
//char show[][COLS] 存放游玩界面的字符数组,*表示未翻开,#表示雷,0表示四周八个方向没有雷,其他数字表示雷的个数
// int row col 扫雷区域的行数和列数
// int x y 玩家选择的坐标
// *p 存放int win的地址,当检查到一个区域不是雷,win++,win到达一定值判定游戏胜利
void AutoFind(char mine[][COLS], char show[][COLS], int row, int col, int x, int y, int* p){
//周围区域相对坐标
int dx[] = {-1,-1,1,1,-1,0,0,1};
int dy[] = {-1,1,-1,1,0,-1,1,0};
for(int k = 0; k < 8; k++){
//搜寻具体坐标
int i = x + dx[k];
int j = y + dy[k];
//确认检查的坐标在扫雷区域内部,并且这个位置不是雷,且未显示
if(1 <= i && i <= row && 1 <= j && j <= col && mine[i][j] != '1' && show[i][j] == '*'){
int jud = CotMine(mine, i, j);//计算雷的数量
switch (jud) {
case 0:
show[i][j] = '0';//如果雷数量为0,则显示
*p += 1;
AutoFind(mine, show, row, col, i, j, p);//雷数量为0,进行递归扩散
break;
default:
*p += 1;
show[i][j] = '0' + jud;//如果数量不为零,则直接显示
break;
}
}
}
}

最后能实现的效果就是这样的(翻开前和翻开后)

翻开前的效果
翻开后的效果
最后,我会把我扫雷的源代码分享给大家,供大家学习使用,第一次写这么多代码并没有很好的划分各种功能,导致标记功能的制作难以下手,还请谅解

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

用C语言实现扫雷的扩散逻辑
https://fairycrane.website/posts/mysweeper/
作者
仙鹤
发布于
2026-05-03
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00