411 字
1 分钟
用C语言实现扫雷的扩散逻辑
用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; } } }}最后能实现的效果就是这样的(翻开前和翻开后)


部分信息可能已经过时









