关于扫雷的自动补空实现C语言

news/2025/1/24 4:41:26/

关于扫雷的自动补空实现C语言

相信很多朋友在用C语言实现扫雷功能时,都想实现扫雷里面的的自动补足功能,但总是难以实现,在这里我将分享一种方法——递归思想

先看代码!

位置在game.c

//判断附近雷区并过滤空白区(实现递归)
void FilterBlankAreas(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y) {int MineCount = GetMineCount(mine, x, y);if (MineCount != 0) {show[x][y] = MineCount + '0';}else if(show[x][y] != ' ' && MineCount == 0 && x >= 1 && x <= row && y >= 1 && y <= col){show[x][y] = ' ';FilterBlankAreas(mine, show, row, col, x - 1, y - 1);FilterBlankAreas(mine, show, row, col, x - 1, y);FilterBlankAreas(mine, show, row, col, x - 1, y + 1);FilterBlankAreas(mine, show, row, col, x, y - 1);FilterBlankAreas(mine, show, row, col, x, y + 1);FilterBlankAreas(mine, show, row, col, x + 1, y - 1);FilterBlankAreas(mine, show, row, col, x + 1, y);FilterBlankAreas(mine, show, row, col, x + 1, y + 1);}}//排查雷+过滤空白区
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {int x = 0;int y = 0;while (1) {printf("请输入坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col) {if (mine[x][y] == '1') {printf("很遗憾,你被炸死了!\n");break;}else if (show[x][y] != '*') {DisplayBoard(show, ROW, COL);printf("这个坐标你已经排查过了,请重输\n");}else{FilterBlankAreas(mine, show, row, col, x, y);DisplayBoard(show, ROW, COL);}}else {printf("输入错误,请重输!\n");}}
}

过滤空白区解析

void FilterBlankAreas(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y) {int MineCount = GetMineCount(mine, x, y);if (MineCount != 0) {show[x][y] = MineCount + '0';}else if(show[x][y] != ' ' && MineCount == 0 && x >= 1 && x <= row && y >= 1 && y <= col){show[x][y] = ' ';FilterBlankAreas(mine, show, row, col, x - 1, y - 1);FilterBlankAreas(mine, show, row, col, x - 1, y);FilterBlankAreas(mine, show, row, col, x - 1, y + 1);FilterBlankAreas(mine, show, row, col, x, y - 1);FilterBlankAreas(mine, show, row, col, x, y + 1);FilterBlankAreas(mine, show, row, col, x + 1, y - 1);FilterBlankAreas(mine, show, row, col, x + 1, y);FilterBlankAreas(mine, show, row, col, x + 1, y + 1);}
}

这个FilterBlankAreas()函数主要先判断输入坐标附近八个空间地雷的数量,若地雷的数量不为0,那么直接将show棋盘的该坐标设置为地雷数,并没有进入递归。

反之要是地雷数量为0,那么就进入递归开始排查除了原本x和y的另外8个坐标,注意: 在进入判断递归条件时一定要加入 show[x][y] != ’ ',不然该函数会在内部没有地雷的空间进行无限递归从而导致崩溃。同时还要注意递归的范围是否数组越界,否则会导致严重的问题。

小tip:其实递归函数理论上可以不用八个

FilterBlankAreas(mine, show, row, col, x - 1, y - 1);
FilterBlankAreas(mine, show, row, col, x - 1, y);
FilterBlankAreas(mine, show, row, col, x - 1, y + 1);
FilterBlankAreas(mine, show, row, col, x, y - 1);
FilterBlankAreas(mine, show, row, col, x, y + 1);
FilterBlankAreas(mine, show, row, col, x + 1, y - 1);
FilterBlankAreas(mine, show, row, col, x + 1, y);
FilterBlankAreas(mine, show, row, col, x + 1, y + 1);

用上下左右的坐标再进行递归就可以了,减少了运算量。

FilterBlankAreas(mine, show, row, col, x - 1, y);
FilterBlankAreas(mine, show, row, col, x, y - 1);
FilterBlankAreas(mine, show, row, col, x, y + 1);
FilterBlankAreas(mine, show, row, col, x + 1, y);

http://www.ppmy.cn/news/1565681.html

相关文章

第6章:Python TDD实例变量私有化探索

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

TCP协议与TCP SYN Flood攻击

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c; TCP握手二&#xf…

Harmonyos之多目标构建产物实践

Harmonyos之多目标构建产物实践 概述基本概念实现原理多目标产物定制项定制HAP多目标产物定义产物的HAP包名定义产物的deviceType定义产物的资源定义产物的icon、label、launchType 配置APP多目标构建产物定义产物的APP包名和供应商名称定义product的bundleType定义Product的签…

Navicat 导出表结构后运行查询失败ERROR 1064 (42000): You have an error in your SQL syntax;

本文主要介绍了在使用 Navicat 导出 MySQL 表后新建查询时出现报错的问题及解决方案。 一、问题描述 Navicat导出MySql中的表&#xff0c;在新建数据库新建查询时通常会报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server …

C++通过输入3D相机像素点集{u、v、z}和机械手世界坐标点集{X、Y、Z}求得变换矩阵RT(眼在手外)

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! C++通过输入3D相机像素点集{u、v、z}和机械手世界坐标点集{X、Y、Z}求得变换矩阵RT(眼在手外) 引言原理简介点集数据(含像素坐标、世界坐标及求解后的变换矩阵)配…

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

effective-Objective-C 第二章阅读笔记

对象&#xff0c;消息&#xff0c;运行期 文章目录 对象&#xff0c;消息&#xff0c;运行期前言理解“属性”这一概念属性修饰符原子性nonatimicatomic 读/写权限内存管理语义方法名 自定义初始化方法小结 在对象内部尽量直接访问实例变量小结 对象等同性特定类的isEqual执行深…

Qt——引用第三方SDK lib库的使用方法

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…