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

🚀Get to know🚀
🛸大家好,我是适才,希望你看完文章后能对你有所帮助。🛸
🌍文章有不足的地方还望指正❗❗❗🔍适才的个人主页🔍随时欢迎您的到来。⛳
>🎁欢迎各位➡👍点赞➡💌留言➕关注💖
📚学习是终身的事业📚

前言

关于扫雷这篇文章,包含了关于数组、循环语句等方面的知识。它可以很好地锻炼我们的思维能力。本篇文章会从由浅到深的阶段来详解。

游戏介绍

扫雷游戏是1992年发布一款大众休闲益智的小游戏。游戏在一个方形区域内布置了若干个地雷,玩家需要根据数字提示来猜出每个格子周围的地雷数量,正确标记出所有地雷的位置才能胜利。如果玩家猜错了地雷的位置,就会触发一个爆炸,导致游戏失败。

模块化编程

⭐模块化编程⭐
1. 什么是模块化
模块化编程就是把我们的一整个项目,分成多个模块。一个程序项目包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h文件则是声明模块

2. 模块化的好处
会使整个项目分工明确,条理清晰,易于阅读,便于移植等优点。

扫雷游戏

在这之前,需创建三个文件(可以自定义)
1. test.c
2. game.c
3. game.h

Ⅰ游戏的思路

🔸创建游戏菜单函数
🔸创建游戏实现函数
🔸游戏实现函数内部创建两个二维数组
🔸创建函数给两个数组初始字符
🔸创建函数打印9x9的方形棋盘
🔸创建函数实现布置雷的功能
🔸创建函数进行排雷
🔸创建函数使用递归展开

Ⅱ 游戏的实现

前面已经知道了游戏的整体思路,接下来就跟着思路一步一步地实现扫雷游戏吧!

1. 游戏菜单

菜单就是让用户来选择游戏状态的菜单。

//菜单
void meun()
{
	printf("=============扫雷游戏==========\n");
	printf("*******    0.退出游戏   *******\n");
	printf("*******    1.开始游戏   *******\n");
	printf("=============扫雷游戏==========\n");
}

2. 游戏实现函数

游戏实现函数的内部会包含多个函数。
游戏实现函数内部创建两个二维数组

二维数组的行和列,需要game.h中进行宏定义

#define ROWS ROW+2
#define COLS COL+2
#define ROW 9
#define COL 9

🔴给数组的行和列宏定义是11的原因🔴
考虑到用户会输入(9,9)的坐标,若此时数组是9x9的大小,而需要对该坐标周围的坐标进行统计,这时会造成溢出。所以给数组11x11的大小就不会溢出。

void game()
{
	char show[ROWS][COLS] = { 0 };
	char mine[ROWS][COLS] = { 0 };
}

3.给数组的初始化字符

自定义两个字符,分别给数组初始化
1. show——‘ * ’
2. mine——‘ 0 ’

函数实现之前需在头文件game.h中进行声明

//初始化字符数组
void Init_broad(char broad[ROWS][COLS], int rows, int cols, char set);

初始化字符数组的定义在test.c

//初始化数组
Init_broad(mine,ROWS,COLS, '0');

Init_broad(show,ROWS,COLS, '*');

初始化字符在game.c中进行实现

//初始化数组
void Init_broad(char broad[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++)
		{
			broad[i][j] = set;
		}
	}
}

4. 打印棋盘

打印棋盘只需要打印show数组的就行

打印函数实现代码

/打印函数
void Pintf_broad(char broad[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 ", broad[i][j]);

		}
		printf("\n");
	}
	printf("======扫雷游戏======\n");
	printf("\n");
}

效果图如下
在这里插入图片描述

5.布置雷

本篇文章所实现扫雷的游戏的等级为基础,所以只需要布置10个雷就行。

宏定义雷的个数

//雷的个数
#define RAY 10

布置雷需要用到rand函数,还不知道怎么使用rand函数的老铁,可以看我的这篇文章🔍三子棋小游戏🔍,该文章也详细的讲到三子棋游戏的实现。

布置雷函数的实现

/布置雷
void Set_show(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int i =RAY;
	while (i)
	{
		x = rand() % row+1;
		y = rand() % col+1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			i--;
		}
	}
}

效果图
在这里插入图片描述

6.排雷

🔻排雷需要用户输入坐标🔻
1. 要判断坐标的合法性
2. 要判断坐标是否已经排查
3. 要判断是是不是雷(是雷炸死,则继续)

排雷函数的实现


//排雷
void Mine_clearance(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-RAY)
	{
		printf("开始排雷,请输入你的坐标:>");
		printf("\n");

		scanf("%d%d", &x, &y);

		if (show[x][y] != '*')
		{
			printf("该坐标已排查,请重新输入\n");
			continue;
		}
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
		
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				Pintf_broad(mine, ROW, COL);
				break;
			}
			else
			{
				//展开雷
				Deve_mine( mine,show ,x, y);
				Pintf_broad(show, ROW, COL);
				win++;
	
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}

		if (win == (row * col - RAY))
		{
			printf("恭喜你,排雷成功\n");
			Pintf_broad(mine, ROW, COL);

		}
	}

}

7. 展开函数

该函数是用到递归的功能,输入坐标周围没用会展开一片空间。

展开函数是实现之前,需要完成一个函数就是可以统计该坐标周围雷的个数返回来。


//返回坐标函数
int Return_Coor(char mine[ROWS][COLS],int x,int y)
{
	return mine[x][y + 1] + mine[x][y - 1] + 
		mine[x - 1][y] + mine[x + 1][y]+ 
		mine[x + 1][y + 1] + mine[x - 1][y - 1] + 
		mine[x + 1][y - 1] + mine[x - 1][y + 1] - 8 * '0';
}

接下来,就可以完成展开函数了

//展开雷
void Deve_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))
	{
		int ret = Return_Coor(mine, x,y);
		if (ret != 0)
		{
			show[x][y] = ret + '0';//因为返回值是一个整数,而我们需要的是字符
		}
		else if (show[x][y] != ' ')
		{
			show[x][y] = ' ';
			int i = 0;
			int j = 0;
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					Deve_mine( mine, show, i, j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

总体效果图在这里插入图片描述

总结

本文章到这里就结束了,不知道你学会了没有。扫雷这个游戏非常适合新手锻炼,会提高我们的思维能力,以及对代码的理解,对语法更加深刻。

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值