IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 好用的递归200行代码实现终端扫雷(C语言实现) -> 正文阅读

[C++知识库]好用的递归200行代码实现终端扫雷(C语言实现)

阵图思路

  • 准备两个二维数组
  • 一个用来存放雷的位置, 下面我称之为雷阵图
  • 一个记录玩家扫雷的坐标(扫雷图)

定义的变量:

#define ROW 9
#define COL 9

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

重点: 使用递归函数实现扫雷中散花效果

雷阵图

假如我要创建一个9*9的 坐标图盘, 那么就要创建一个11*11的二维数组, 原因就是要实现任一点周围都要有8个坐标, 这样方便我们计算这个点周围的有多少个雷.

char mine[11][11] = { 0 };

然后把这个数组进行初始化, 就是把这个数组里的每一个值都赋值为字符0,

InitBoard(mine, 11, 11, '0');
//初始化数组-----初始化雷盘:这个数组为雷的存放位置
void InitBoard(char board[11][11], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

这个时候数组内每一个值都为字符0, 然后把数组按照每一行进行打印得到
在这里插入图片描述
这时进行随机布置雷, 把雷放置在如下图
在这里插入图片描述
代码实现:

	//布置雷
	SetMine(mine, ROW, COL);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASY_COUNT;
	while (count)
	{
		x = rand() % ROW + 1;  //模9余 (0 1 2 3 4 5 6 7 8) 然后加上 1
		y = rand() % COL + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

扫雷图

思路与雷阵图一样, 也是要创建一个9*9的 坐标图盘, 那么就要创建一个11*11的二维数组, 唯一不同的地方在于, 初始化这个数组的时候是吧字符数组初始化为如下

在这里插入图片描述
实现代码

	//扫雷图二维数组(玩家探索图)
	char show[ROWS][COLS] = { 0 };
	//初始化扫雷图二维数组
	InitDisplayBoard(show, ROWS, COLS, '*');
//这个是扫雷图: 玩家看到的阵图.记录玩家的查询痕迹
void InitDisplayBoard(char board[ROWS][COLS], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
			if ((i == 0) || (i == (row - 1)) || (j == (col-1)) || (j == 0))
			{                // 此处判断的是第一行与最后一行还有其它行的首位
				board[i][j] = ' ';
			}
		}
	}
}

核心代码-递归函数实现(散花效果)

  • 确定一个不是雷的坐标后,(是雷就直接让结束游戏啦)
  • 先判断这个坐标在扫雷图上面为字符*,代表这个坐标是在内部9*9格子中并且是第一次进行判断,则继续向下走,否则直接return 0(避免栈溢出,以及不判断扫雷图外围一圈的坐标)
  • 再判断它周围8个坐标中有多少个为雷. 如果没有雷, 则把这个坐标赋值为 空格, 并进行递归, 如果有雷则把该坐标赋值为字符x(x代表雷的数量)

代码:

//查找这个坐标周围的雷的个数
int find_mine_count(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] + 
		mine[x - 1][y] + 
		mine[x - 1][y + 1] + 
		mine[x][y - 1] + 
		mine[x][y + 1] + 
		mine[x + 1][y - 1] + 
		mine[x + 1][y] + 
		mine[x + 1][y + 1] - 8 *'0';
}
#define 说明: 字符1减去字符0得到的结果就是数字 1

//散花效果---递归函数
int find_show_count(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	int m_count = 0;
	m_count = find_mine_count(mine, show, x, y);
	if (show[x][y] == '*')
	{
		if (m_count == 0)
		{
			show[x][y] = ' ';
			return 1 + find_show_count(mine, show, x - 1, y - 1) +
				find_show_count(mine, show, x - 1, y) +
				find_show_count(mine, show, x - 1, y + 1) +
				find_show_count(mine, show, x, y - 1) +
				find_show_count(mine, show, x, y + 1) +
				find_show_count(mine, show, x + 1, y - 1) +
				find_show_count(mine, show, x + 1, y) +
				find_show_count(mine, show, x + 1, y + 1);
		}
		else
		{
			show[x][y] = '0' + m_count;
			return 1;
		}
	}
	else
	{
		return 0;
	}
} 

在这里插入图片描述

完整代码

GITEE: 完整代码

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 17:19:59  更:2021-08-03 17:20:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 21:53:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码