扫雷游戏【可展开一片,超详细,保姆级别,此一篇足够】

C/C++图形化扫雷开发:从EasyX入门到事件驱动编程实践 图形用户界面(GUI)是现代桌面应用开发的核心技术之一,它通过可视化元素和事件响应机制,将用户交互从命令行提升到直观的图形操作层面。其基本原理是基于消息循环的事件驱动模型,程序通过持续监听系统消息(如鼠标点击、键盘输入)并调用相应处理函数来响应用户操作。这种技术价值在于极大提升了软件的易用性和交互效率,是开发游戏、工具软件和嵌入式图形界面的基础。在C/C++开发中,借助EasyX等轻量级图形库,开发者可以快速实现窗口创建、资源加载和图形绘制,将核心算法与可视化界面结合。本文以经典扫雷游戏为例,详细解析了如何 阅读详情

一、C语言代码实现的扫雷游戏的运行

C语言实现扫雷

二、扫雷游戏的分析与设计

1.扫雷游戏的界面设计

在玩家玩扫雷的时候,它会给你一个二维的棋盘(下面的讲解都以9x9规格为例子),然后点击你想排查的坐标,若不是雷的,则显示周围雷的个数。

针对这个现象,我们很容易的会想到利用二维数组,根据我们想要的格式去打印一个棋盘出来。

2.扫雷游戏的布雷

布置的雷,要满足以下的的特征:产生的雷的坐标是随机的,产生的雷的坐标不能重复,产生的雷不能超过我们布置的棋盘规格。

针对这个问题,我们只要知道如何产生真正的随机数,以及分支与循环语句的的熟练,是很容易解决的。

3.扫雷游戏的结构分析 

我们如果把雷,和排查过的坐标信息,都保存在一个棋盘中,是不是不容易区分,又或者会产生歧义?

所以我们的设计是:用两个二维数组实现两个9x9的棋盘,一个棋盘用来布置雷,或非雷;另一个棋盘用来保存返回排查的坐标周围雷的个数。 为了下面的讲解通顺,我们将布置雷的棋盘记作:BoardMine;用来保存返回排查的坐标周围雷的个数的棋盘记作:BoardShow。

 4.扫雷游戏的规则制定

i.在扫雷游戏开始的时候,就已经对存储雷信息的棋盘进行好初始化,以及雷的布置;

ii.玩家输入要排查的坐标(x,y),判断x,y是否合法,不合法提示玩家,并让其重新输入

iii.判断BoardMine(x,y)是否有雷,若有雷,返回false,本次游戏结束。若无雷,计算周围的坐标雷的个数,并赋给BoardShow(x,y)

iiii.展开一片的规则,模块三详细介绍。

5.扫雷游戏的棋盘规模规划

在介绍扫雷游戏的规则制定的时候,提到过:计算周围的坐标雷的个数,可是若我们想要9x9的棋盘规格,就只定义9x9的二维数组。若对边界坐标的计算,就棘手了很多,那该怎么办呢?

6.文件结构的设计

Swpthund.h 用于放置库函数调用所需的头文件、预处理指令、扫雷游戏各种接口的声明

Swpthund.c 完成扫雷游戏各种接口的定义

test.c     完成扫雷游戏的菜单功能,玩家可通过菜单开始游戏,继续游戏,退出游戏。
7.结言

有了这些思维准备,那下面的功能函数代码的展示与讲解部分,则会一目了然。

三、扫雷游戏的功能函数的代码展示与讲解

1.棋盘的创建
在头文件中的定义,方便后续对棋盘规模的统一管理
//定义 行:ROW 列:COL ...
#define ROW 9
#define COL 9
#define ROWS COL+2
#define COLS ROW+2
#define THUNDER 10  //定义的雷的个数

2.打印棋盘+棋区的规划 
void BoardPrint(char(*zmh)[COLS], int x, int y)
{
	printf("----------------扫雷 游戏----------------\n\n");
	int i = 0;
	//打印横坐标的上界;
	for (i = 0; i <= y; i++)
	{
		printf("|---");
	}
	printf("|\n");
	//打印1~9的坐标;
	for (i = 0; i <= y; i++)
	{
		printf("|%-3d", i);
	}
	printf("|\n");
	//打印横坐标的下界;
	for (i = 0; i <= y; i++)
	{
		printf("|---");
	}
	printf("|\n");
	//打印雷区;
	for (i = 1; i <= x; i++)
	{
		int j = 0;	
		//打印纵坐标;
		printf("|%-3d", i);
		//打印每一行的雷区;
		for (j = 1; j <= y; j++)
		{
			printf("| %c ", zmh[i][j]);
		}
		printf("|\n");
		//打印雷区的下界;
		for (j = 0; j <= y; j++)
		{
			printf("|---");
		}
		printf("|\n");
	}
	printf("\n");
}

打印的效果如下:

是不是很好看,很有成就感?我也这样想的。 

3.棋盘的初始化

通过memset函数,将二维数组的内存,按照char类型,全部设置为Element字符。参数sz是二维数组的内存大小;x,y是二维数组的行 列 ;Element是二维数组要初始化的字符。

我的设计是,将雷区全部初始化为字符 '0' ,将玩家操作的棋盘全部初始化为字符 '*'。

为什么要这样设计呢?

1.如果我们雷区全部初始化为字符 ‘0’,而布置雷的时候,把雷的信息用 ‘1’ 表示。这样我们在后续计算的时候,可以利用ASCII码值,很容易求到雷的个数;

比如:

        '1' - '0' = 1        '2'-'0' = 2        2+'0' = '2'

2.把玩家操作的棋盘全部初始化为字符‘*’,表示为排查的坐标。

4.随机产生雷,并布置在BoardMine中

 

要传ROW,与COL的原因很简单,在开始,我们就说了我们只是为了方便处理棋盘边界坐标返回雷区的个数而行 列都+2,实际上真正要操作的还是未加之前的9x9的棋盘规模。

5.扫雷游戏的过程,以及判断游戏是否结束
_Bool BoardProcess(char(*zmh)[COLS], char(*lyy)[COLS], int x, int y)
{
	int m, n;//待玩家输入排查雷区的坐标
	int count = 0;//存储已排查坐标的个数
	while (count + THUNDER != x * y)
	{
		BoardPrint(lyy, ROW, COL);
		printf("请输入你要排查的位置:>");
		scanf("%d%d", &m, &n);
		//判断玩家输入坐标的合法性,以及是否重复输入:
		if (BoardJudge(lyy,x,y,m,n) == false)
		{
			printf("输入坐标非法,请重新输入\n");
		}
		else
		{
			if (zmh[m][n] == '1')
				return false;
			else
			{
				//因为如果靠函数返回值的话,这是个递归函数,逻辑上有点麻烦,所以沃传一个参数
				//用来接受已经排查到的坐标
				BoardUnfold(zmh, lyy, x, y, m, n, &count);
				printf("已经排查过的坐标:%d\n", count);
			}
		}
	}
	return true;
}

 这是判断玩家输入的坐标合法性的函数。

 通过Boardprocess的返回值来判断,游戏是输了,还是赢了。(这里用到了布尔类型,true表真,false表假)

6.返回排查坐标周围雷的个数

7.展开一片,并完成已排查坐标个数的统计
void BoardUnfold(char(*zmh)[COLS], char(*lyy)[COLS], int x, int y, int m, int n, int* pcin)
{
	//统计(m,n)周围雷个数,
	char count = BoardCheck(zmh,m,n);
	if (count != '0')
	{
		if (lyy[m][n] == '*')
		{
			lyy[m][n] = count;
			*pcin += 1;
		}
	}
	else if (lyy[m][n] != ' ')
	{
		lyy[m][n] = ' '; 
		*pcin += 1;
		for (int i = m - 1; i <= m + 1; i++)
		{
			for (int j = n - 1; j <= n + 1; j++)
			{
				if ((1 <= i && i <= x) && (1 <= j && j <= y))
					BoardUnfold(zmh, lyy, x, y, i, j, pcin);
			}
		}
	}
	else
		return;
}

四、完成扫雷游戏的菜单

 

void game()
{
	//创建雷区,玩家操作的棋区
	char BoardShow[ROWS][COLS] = { 0 };
	char BoardMine[ROWS][COLS] = { 0 };
	//初始化
	BoardInit(BoardMine, sizeof(BoardMine), ROWS, COLS, '0');
	BoardInit(BoardShow, sizeof(BoardShow), ROWS, COLS, '*');
	//布置雷
	BoardRand(BoardMine, ROW, COL);

	//打印棋盘:用于核验扫雷功能是否正常;
	//BoardPrint(BoardMine, ROW, COL);
	//BoardPrint(BoardShow, ROW, COL);
	
	//游戏过程;
	int ret = BoardProcess(BoardMine, BoardShow, ROW, COL);
	if (ret)
	{
		printf("恭喜你,扫雷游戏通过\n");
	}	
	else
	{
		printf("很遗憾,你被雷炸死了\n");
		BoardPrint(BoardMine, ROW, COL);
	}
}
int main()
{
	int input = 0;
	//设立rand的种子;一次程序,只需要调用一次srand就行
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请输入下一步的指令>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			system("color 0B");
			game();
			break;
		case 0:
			system("cls");
			printf("你已经退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);
	return 0;
}

五、扫雷游戏的源码

扫雷游戏/扫雷游戏 · 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)

别再为MKL配置头疼了!VS2019+oneAPI下Fortran调用MKL库的保姆级避坑指南 本文提供了一份详细的VS2019与oneAPI环境下Fortran调用MKL库的配置指南,涵盖环境准备、项目配置、参数调优、验证调试及高级配置等关键步骤。通过避免常见陷阱和优化性能参数,帮助开发者高效完成MKL库的集成与调试,特别适合需要高性能数学计算的Fortran开发者。 阅读详情

相关推荐

扫雷java,全屏玄的扫雷游戏

这是一个全屏的Java扫雷游戏,源代码公布,JDK版本最好在1.6.0以上,如果低于1.6,把其中的一行代码注释了,只是屏幕不伪透明了。

扫雷超详解(可展开一片空白)

我们都知道扫雷分给不同等级一下操作均以最基础的9*9棋盘,10个雷的难度演示//游戏菜单:选择是否开始玩儿游戏,1:玩儿,0:退出游戏;}虽然我们要打印99的棋盘,但为了后续能更好的统计最外围雷的个数我们需要在最外围各自在加上一行,相当于以左右上下各加一行,相当于1111的棋盘后续在其9*9的棋盘上进行操作即可所以在头文件game.h中,定义后续操作需要用的ROW,COL,ROWS,COLS99+2+2然后在text.c文件中我们创出两个11*11的二维数组0 };0 };

m0_73686428的博客 5466

扫雷全屏秒杀外挂制作教程+源码

扫雷全屏秒杀外挂制作教程+源码,扫雷全屏秒杀外挂制作教程+源码,

扫雷游戏棋盘的打印,判断输赢,深度分析

少年们,大家好,我是博主那一脸阳光,我来分享扫雷的打印和判断输赢,代码如何编写,如何使用,深度理解扫雷的游戏。

2301_79840227的博客 1995

完整版扫雷游戏

MFC开发的一款扫雷小游戏,可配置界面背景的颜色,播放声音,实时查看当前界面雷的位置等

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4331

扫雷C语言(可展开一片空白)

1.玩家可以通过选择1进入游戏,0退出游戏。2.选错的话提醒玩家,重新选择。3.告诉玩家游戏规则1.包含需要的头文件2.包含需要的宏定义3.包含需要的函数接口恭喜你,看完了这~么长的文章,熟能生巧,看完记得练习哦,ps:本章部分图片来源《比特就业课课件》。

2301_79551553的博客 1171

基于 VS Code + CMake + Make + GNU工具链 + OpenOCD 的通用MCU开发环境搭建教程

以CH32V307(RISCV)和STM32F103(Cortex-M3)为例的Vscode+gnu单片机环境搭建。

余十三_的博客 2177

扫雷游戏

扫雷游戏 扫雷游戏是一款经典的游戏。考验玩家的逻辑能力和运气。扫雷游戏的规则如下:给玩家一张未展开的棋盘。 玩家点击棋盘格子展开格子,展开后的格子如果是雷,那么玩家游戏失败。如果不是雷怎该格子显示周围8个格子中的雷数。玩家展开所有非雷格子则扫雷成功! 用c语言编程实现扫雷游戏。主要用到二维数组。我们将编程思路整理如下: //1.用二维数组展开地图 两张地图: //1)玩家看到的地图;那些位置已翻开...

zyj497863419的博客 408

从零开始构建AURIX TC397开发环境:硬件选型与IDE配置全攻略

本文详细介绍了如何从零开始构建AURIX TC397开发环境,涵盖硬件选型、IDE配置及外设驱动开发等关键步骤。针对TriCore架构的高性能特性,提供了开发板选型建议、AURIX Development Studio(ADS)安装配置指南,以及GPIO和CAN FD驱动的实战代码示例,帮助开发者快速上手TC397系列微控制器的开发工作。

7up55的博客 205

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2886

c语言必做——扫雷游戏(含展开一片雷区)

在完成代码之前,我们要先了解一下我们想实现功能1.使用控制台来实现简单扫雷游戏2.游戏通过菜单实现游戏的开始与结束3.扫雷棋盘为9*94.默认随机步至10个雷(当然我们的代码也可以根据要求更改雷的个数5.排查雷如果是雷,提醒玩家被炸死,并提供雷的分布如果不是雷,计算周围一圈雷的数量,并告知玩家,直到所有雷都被排查出来,排雷成功。6.拓展:当不是雷时,能够展开一片提示:以下是本篇文章正文内容,下面案例可供参考。

2301_80151382的博客 1521

基础入门篇 | YOLOv8 项目【训练】【验证】【推理】最简单教程 | YOLOv8必看 | 最新更新,直接打印 FPS,mAP50,75,95

三个文件搞定YOLOv8【训练】【验证】【推理】🚀🚀🚀

Coding... 2万+

保姆级别的扫雷游戏

使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷如果位置不是雷,就显示周围有几个雷如果位置是雷,就炸死,游戏结束把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束。

wait___wait的博客 998

通过 MATLAB/Simulink + Simscape Battery,构建了锂电池老化模型与容量衰减仿真系统

本文基于MATLAB/Simulink平台,构建锂电池老化模型与容量衰减仿真系统,研究储能电池健康管理技术。通过搭建电化学-老化耦合模型,模拟循环和日历老化机制,分析温度、充放电倍率、DOD等因素对电池寿命的影响。系统实现了SOH在线估计和RUL预测功能,仿真了标准日历老化、高倍率循环和峰谷套利等典型工况下的电池衰减行为。结果表明:高温和深充放会显著加速电池老化,而精准的SOH管理可提升储能系统经济性30%以上。文章还探讨了数字孪生、机器学习等高级优化方向,为储能系统长周期运营提供技术支撑。

xiaoheshang_123的博客 398

《MySQL 入门教程》第 03 篇 管理数据库

本篇主要介绍 MySQL 数据库的创建、查看、选择和删除操作,包括使用 mysql 命令行和 MySQL Workbench 图形工具两种方式。

Tony.Dong的专栏 3525

C语言扫雷游戏的简单实现!保姆级简单教程!看完就会!

• 使用控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格子 • 默认随机布置10个雷 • 可以排查雷 ◦ 如果位置不是雷,就显示周围有几个雷 ◦ 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束

2301_79184587的博客 2884

制作3D地形图的方法-使用GlobalMapper和3ds Max软件

打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。

JqlScala的博客 1535

如何用C语言实现扫雷游戏代码(保姆级别讲解,与你共勉)

然后对数组mine和display进行初始化//'0'//'*'初始化数组之后,那我们应该怎么样才能将字符’0‘和’*‘存储到棋盘中这个时候,我们就想到我们需要定义一个函数来将mine数组和display数组进行初始化,给每一个行列上代表的坐标存储一个数值,如下图是使用函数进行存储的字符。要存储两种字符,我们只需要用一个函数就可以实现因此,我们是怎么只使用一个函数来进行初始化实现呢?int i = 0;for (i = 0;i < rows;

qq_41823495的博客 462

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

⚡【扫雷】⚡【保姆级别教程(可展开)】

🔔扫雷游戏【保姆级别】🔔

2303_76654613的博客 267

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

小游戏---猜数字+扫雷 保姆级别实现(含源码)

1.代码可以多文件书写,方便整理2.在传参过程中,虽然只需要 9*9 的矩阵来存储信息,但是传参仍然传 11*11,可以使用时函数参数是 row* col ,数组传参千万不能省略防止数组越界的两行。3. 使用 rand 函数时,除了要注意使用 srand 函数产生 "种子",还要记得取模运算时产生的范围例如:(rand % m)产生的是 0 - m-1的数据,不符合题意要进行微调4.合理使用 #define ,方便代码重复利用5.在使用数组时,一定要谨记此处的数组是字符数组,不要用整型去计算。

octopus_c的博客 513

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言之初级(保姆级别------三子棋游戏)

前言 三子棋,我相信是一个相对普及的游戏,每个同学在无聊时候都会和同桌比划比划,所以针对这个小游戏,综合利用C语言中的循环语句,条件语句,数组对它进行一个编写,(同上一期的扫雷游戏,两游戏的知识点基本一致)并且在每条代码后面都配备了注释,希望大家可以理解,有疑问的地方下方留言。 文章目录 前言 一、创建文件 二、编写 三、测试运行 总结 前言 前言(所需的知识点) 针对C语言中的循环语句,条件语句,数组的综合应用,写出一个扫雷游戏 1.利用while for do wh

baiyang2001的博客 876

【链表】双向链表的介绍和基本操作(C语言实现)【保姆级别详细教学】

【数据结构】双向链表的介绍和基本操作(C语言实现)【保姆级别详细教学】 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️ 干货满满~ 强烈建议本篇收藏后再食用~ 看完本篇,相信你会对双向链表有一个比较深入的了解,而且会深深地体会到这一种链表相比于之前的单链表结构上的优越性、使用更为方便的特点。 文章目录双向链表的基本介绍一些链表的分类带头双向循环链表的基本结构双向链表的实现结点的定义、头指针的创建开辟结点接口初始

系统编程、网络编程 4001

【预定义】C语言预定义代码(宏、条件编译等)内容介绍【最全的保姆级别教程】

浅谈预定义中的预定义符号,#define,以及符号#,##的相关运用 求个赞求个赞求个赞求个赞 谢谢???? 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️ 本章节对于初学者来说,是比较简单的,而且我个人认为也非常的有趣,我相信大部分的小伙伴都可以理解 文章目录预定义符号的介绍#define定义符号#define定义宏#符号的使用##符号的使用尾声 预定义符号的介绍 一下这些符号是不需要#define来进行定义的,

系统编程、网络编程 2734

C语言之扫雷游戏

c语言实现扫雷游戏功能,函数之间的调用实现

weixin_44584853的博客 1578

【C语言】函数递归实现——扫雷小游戏(详细步骤)

一看就懂的c语言 有手就行——三子棋小游戏 —————————————————————————————————————————— 相信大家都是玩过三子棋的,今天就来讲一下如何用非常基础的c语言写一个简单的三子棋代码 —————————————————————————————————————————— 思路概览一看就懂的c语言 有手就行——三子棋小游戏1.初始化棋盘1.1打印棋盘2.玩家下棋3.电脑下棋4.判断游戏输赢 1.初始化棋盘 1.1打印棋盘 2.玩家下棋 3.电脑下棋 4.判断游戏输赢 ..

DerrickWestbrook的博客 2305
上一篇: C 语言每日一题——旋转数组的最小数字
下一篇: 函数栈帧的创建与销毁【此一篇,足以让卿彻底扫盲】
无感ෆ
博客等级 码龄3年 664粉丝 47原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值