扫雷(超详解+全部码源)
C语言经典游戏扫雷
- 前言
- 一.游戏规则
- 二.所需文件
- 三.创建菜单
- 四.游戏核心内容实现
- 1.创建棋盘
- 2.打印棋盘
- 3.布置雷
- 4.排查雷
- 5.game()函数具体实现
- 五.游戏运行实操
- 六.全部码源
前言
😀C语言实现扫雷是对基础代码能力的考察。通过本篇文章你将学会如何制作出扫雷,坚持一段时间的复习相信你肯定能够掌握扫雷 (文末附三子棋全部代码).
👉扫雷游戏网页版 - Minesweeper
一.游戏规则
🚦设计游戏前先了解三子棋基本规则,以围绕规则用C语言实现
一个扫雷盘面由许多方格(cell)组成,方格中随机分布着一定数量的雷(mine),一个格子中至多只有1雷。胜利条件是打开所有安全格(非雷格,safe cell),失败条件是打开了一个雷格(踩雷)。
二.所需文件
🧐扫雷并不是一项容易的代码,需要我们进行分文件编写。
🤔什么是分文件编写?
就是把我们的程序代码划分成多个文件,这样就不会把所有的代码都放在main.c里面,采用分模块的编程思想,进行功能划分,把每个功能不一样的单独放在一个c文件里,然后写头文件把它封装成可调用的一个函数,在主函数调用这个封装好的函数,编译的时候一起编译即可
✌好处:
a.功能责任划分
b.方便调试
c.主程序简洁
👀来让给我们看看具体操作如下:
头文件中创建game.h ----用来声明函数
源文件中创建game.c—函数具体实现 / test.c—主题流程
三.创建菜单
先创建一个菜单以展示进入退出游戏功能:
void menu()
{printf("**********************\n");printf("****** 1.play ******\n");printf("****** 0.exit ******\n");printf("**********************\n");
}
用do…while循环实现菜单使用,switch语句进行菜单选择
int main()
{int input = 0;do{menu();printf("请输入选项>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏>\n");break;default:printf("选择错误,重新选择>\n");break;}} while (input);return 0;
}
四.游戏核心内容实现
😇这里我们简化游戏,设置一个9*9的棋盘,安置10个雷。
排查过程如下:
1.如果这个位置是雷,那么游戏结束。
2.如果把不是雷的位置都找出来了,那么游戏结束。
3.如果这个位置不是雷,就计算这个位置的周围的8个格子有几个雷,并显示出雷的个数。
game()函数中实现整个游戏,先数组棋盘
1.创建棋盘
先创建数组(两个数组,为区别设置雷为1和统计雷个数为1做区分)
![]()
图一:”1“为雷(mine)
图二:”1“为雷的个数(show)
char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };
注:由于行,列频繁使用在game.h中宏定义
#define ROW 9
#define COL 9#define ROWS ROW + 2
#define COLS COL + 2

在game.h文件中声明创建棋盘函数:
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
在game.c文件中实现初始化棋盘函数
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
在test.c文件中实现调用
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
2.打印棋盘
在game.h中声明打印棋盘函数
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
在game.c中实现打印棋盘函数
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("------------扫雷------------\n");for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("------------扫雷------------\n");
}
3.布置雷
在game.h中声明布置雷函数
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
在game.c文件中实现布置雷函数,设置随机雷数EASY_COUNT,进入while循环每设置一个雷,EASY_COUNT减一,直到雷设置完毕跳出循环。为保证雷的随机性需生成随机坐标,判断设置雷是否重复,未重复设置雷”1“。
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;//x坐标为1-9int y = rand() % col + 1;//y坐标为1-9if (board[x][y] == '0'){board[x][y] = '1';}count--;}
}
随机数在game.h中进行宏定义
#define EASY_COUNT 10
调用rand()需要srand()
srand((unsigned int)time(NULL));
注:包含头文件
#include<stdlib.h>—>srand
#include<time.h>----->time
4.排查雷
在game.h文件中声明排查雷函数
//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
在game.c中实现排查雷函数,输入坐标↔️确保坐标在棋盘范围内否则重新输入,判断棋盘范围内坐标是否重复输入,未重复输入判断是否踩雷,.若踩雷”很遗憾炸死“,若没有统计周围雷个数(用GetMineCount函数)。放入while循环,若雷没有排查完持续循环,若被炸死跳出循环。若所有雷被排查出则排雷成功
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row*col - EASY_COUNT){printf("请输入排查坐标>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("输入坐标重复,请重新输入\n");}else if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{//不是雷,就统计x,y坐标周围有几个雷int c = GetMineCount(mine, x, y);show[x][y] = c + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("输入坐标错误,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("排雷成功\n");DisplayBoard(mine, ROW, COL);}
}
在game.c文件中实现统计雷个数函数,因为在排查雷函数内部,不需在game.h文件中声明。因为坐标内输入的是字符‘0’,所以统计出个坐标数‘1’之和减去‘0’及为周围雷数
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x + 1][y] + mine[x - 1][y] +mine[x][y + 1] + mine[x][y - 1] +mine[x + 1][y + 1] + mine[x - 1][y + 1] +mine[x - 1][y - 1] + mine[x + 1][y - 1] - 8 * '0';
}
5.game()函数具体实现
1实现棋盘初始化,2打印棋盘,3设置棋盘雷数,4排查雷
void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');DisplayBoard(show, ROW, COL);SetMine(mine, ROW, COL);FindMine(mine, show, ROW, COL);
}
五.游戏运行实操
出现菜单进行选择
选1进入游戏
输入坐标开始游戏
坐标重复,重新输入
越界重新输入
踩雷炸死
选择0退出游戏
六.全部码源
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{printf("*************************\n");printf("******* 1. play ******\n");printf("******* 0. exit ******\n");printf("*************************\n");
}
void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');DisplayBoard(show, ROW, COL);SetMine(mine, ROW, COL);FindMine(mine, show, ROW, COL);
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请输入选项>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入错误,请重新输入");break;}} while (input);return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("------------扫雷------------\n");for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("------------扫雷------------\n");
}void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';}count--;}
}int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x + 1][y] + mine[x - 1][y] +mine[x][y + 1] + mine[x][y - 1] +mine[x + 1][y + 1] + mine[x - 1][y + 1] +mine[x - 1][y - 1] + mine[x + 1][y - 1] - 8 * '0';
}void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row*col - EASY_COUNT){printf("请输入排查坐标>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("输入坐标重复,请重新输入\n");}else if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{//不是雷,就统计x,y坐标周围有几个雷int c = GetMineCount(mine, x, y);show[x][y] = c + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("输入坐标错误,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("排雷成功\n");DisplayBoard(mine, ROW, COL);}
}
game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 9
#define COL 9#define ROWS ROW + 2
#define COLS COL + 2#define EASY_COUNT 10//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
💘本次扫雷学习告一段落,扫雷详解+完整代码,反复阅读,坚持打码,相信你在不久的将来就会拿下扫雷,以扩展更高级代码。期待下次作品与大家见面!!!
相关文章:
扫雷(超详解+全部码源)
C语言经典游戏扫雷 前言一.游戏规则二.所需文件三.创建菜单四.游戏核心内容实现1.创建棋盘2.打印棋盘3.布置雷4.排查雷5.game()函数具体实现 五.游戏运行实操六.全部码源 前言 😀C语言实现扫雷是对基础代码能力的考察。通过本篇文章你将学会如何制作出扫雷ÿ…...
python生成exe脚本全过程
python生成exe脚本全过程 1、定义设计的GUI界面2、几个GUI界面常用函数2.1 tk.Label2.2 tk.StringVar2.3 tk.Entry2.4 tk.Button2.5 tk.Text2.6 tk.Scrollbar 3、实例3.1 需求3.2实现 4、如何使用pycharm生成可执行exe文件4.1安装pyinstaller4.2 生成exe文件 5、生成exe过程中遇…...
【机器学习1】什么是机器学习机器学习的重要性
什么是机器学习? 简而言之,机器学习就是训练机器去学习。 机器学习作为人工智能(Artificial Intelligence,AI)的一个分支,以其最基本的形式来使用算法通过从数据中获取知识来进行预测。 不同于人类通过分析大量数据手动推导规则和模型,机…...
立即开始使用 3D 图像
一、说明 这个故事介绍了使用这种类型的数据来训练机器学习3D模型。特别是,我们讨论了Kaggle中可用的MNIST数据集的3D版本,以及如何使用Keras训练模型识别3D数字。 3D 数据无处不在。由于我们希望构建AI来与我们的物理世界进行交互,因此使用3…...
鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统em
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目…...
《向量数据库》——怎么安装向量检索库Faiss?
装 Faiss 以下教程将展示如何在 Linux 系统上安装 Faiss: 1. 安装 Conda。 在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。 2. 从官网…...
学习pytorch 2 导入查看dataset
学习pytorch 2 2. dataset实战代码数据集 2. dataset实战 B站小土堆视频 代码 from torch.utils.data import Dataset from PIL import Image #import cv2 import osclass MyData(Dataset):def __init__(self, root_dir, label_dir):self.root_dir root_dirself.label_dir …...
三、kubeadm部署单Master节点kubernetes集群
kubeadm部署单Master节点kubernetes集群 一、kubernetes 1.21发布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGgnZuno-1691633861803)(kubeadm部署单Master节点kubernetes集群 1.21.0.assets/image-20220119160108054.png)] 1.1 介绍 2021年…...
js-6:typeof和instanceof的区别
1、typeof typeof操作符返回一个字符串,表示未经计算的操作数的类型。 operand表示对象或原始值的表达式,其类型将被返回。 从上面的例子可以看出,前6个都是基础数据类型,虽然typeof null为object,但这只是javascrip…...
SQL SERVER 异地备份到远程共享文件夹异常处理
SQL SERVER 异地备份到远程共享文件夹异常处理 SQL Server 异地备份到远程共享文件夹异常处理 - 灰信网(软件开发博客聚合) -- 允许配置高级选项 EXEC sp_configure show advanced options, 1 GO -- 重新配置 RECONFIGURE GO -- 启用xp_cmdshell EXEC sp…...
服务器数据恢复-RAID5上层Hyper-V虚拟机数据恢复案例
服务器数据恢复环境: 一台Windows Server服务器,部署Hyper-V虚拟化环境,虚拟机的硬盘文件和配置文件存放在一台DELL存储中。该存储中有一组由4块硬盘组建的RAID5阵列,用来存放虚拟机的数据文件,另外还有一块大容量硬盘…...
Easy Rules规则引擎(1-基础篇)
目录 一、序言二、Easy Rules介绍三、定义规则(Rules)1、规则介绍2、编程式规则定义3、声明式规则定义 四、定义事实(Facts)五、定义规则引擎(Rules Engine)1、规则引擎介绍2、InferenceRulesEngine规则引擎示例(1) 定义触发条件(2) 定义规则触发后的执行行为(3) 测试用例 一、…...
Linux 上安装部署Nacos
标题:在Linux上安装和部署Nacos Nacos是一个开源的分布式服务发现和配置管理平台,它可以帮助开发人员实现微服务架构中的服务注册、发现和动态配置管理。 步骤1:准备工作 在开始安装Nacos之前,确保您已经具备以下条件࿱…...
电动机的启动
1电动机启动分类 电动机启动方式包括:全压直接启动、自耦减压启动、Y-Δ 启动、软启动器、变频器。其中软启动器和变频器启动为潮流。当然也不是一定要使用软启动器和变频器启动,在运用的时候根据实际情况,从经济和适用性自行考虑选择。 2电…...
python性能分析,logging性能,print性能,文件写入性能对比
先说结论,没想到的是print性能比logging性能好,输出到控制台会极大降低程序性能,以下是我的性能对比结果: 运行情况是python后台运行并输出到日志,命令是 python3 test.py > /opt/testtime.log 2>&1 &...
[GIN-debug] [ERROR] listen tcp: address 8080: missing port in address
学习Golang_gin框架的第一天 遇到一下报错 : [GIN-debug] [ERROR] listen tcp: address 8080: missing port in address 错误代码 : package mainimport "github.com/gin-gonic/gin"func main() {router : gin.Default()router.GET("/index", func…...
PHP codeigniter4 搭配Nginx
> 主要是为了用Nginx运行PHP环境 1. Nginx 官方文档的配置 default.conf This configuration enables URLs without “index.php” in them and using CodeIgniter’s “404 - File Not Found” for URLs ending with “.php”. server {listen 80;listen [::]:80;se…...
AWS——04篇(AWS之Amazon S3(云中可扩展存储)-02——EC2访问S3存储桶)
AWS——04篇(AWS之Amazon S3(云中可扩展存储)-02——EC2访问S3存储桶) 1. 前言2. 创建EC2实例 S3存储桶3. 创建IAM角色4. 修改EC2的IAM 角色5. 连接EC2查看效果5.1 连接EC25.2 简单测试5.2.1 查看桶内存储情况5.2.2 复制本地文件…...
.netcore下grpc概述
一、什么是grpc 是一种与语言无关的高性能远程过程调用 (RPC) 框架。基于http/2标准设计,提供了头部压缩、tcp连接上的多路复用、流量控制、流式处理(客户端流/服务端流/双向流)。提供统一使用的.proto文件,它定义 grpc 服务和消…...
Address already in use
netstat -tunllp netstat -tunllp 命令是用来查看系统上所有的网络连接和监听端口,包括 TCP 和 UDP 连接。这个命令的选项含义如下: -t: 显示 TCP 连接-u: 显示 UDP 连接-n: 不进行主机名和服务名的解析,直接显示数字形式的 IP 地址和端口号…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...









