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++知识库 -> C语言--扫雷小游戏(含递归展开) -> 正文阅读

[C++知识库]C语言--扫雷小游戏(含递归展开)

1. 游戏设计

? ? ?game.h-----函数的声明

? ? ?game.c-----函数的定义

? ? ?test.c--------函数的测试

2. 游戏设计思路

? ? ?创建数组

? ? ?数组初始化

? ? ?打印棋盘

? ? ?布置雷

? ? ?排查雷

? ? ?运行结果

3. 完整代码


扫雷具体解析在代码的注释中,如有错误,请大家指正,谢谢~

创建数组

#define ROW 9         //行   用define定义扫雷的行 方便以后可以修改
#define COL 9         //列   用define定义扫雷的列 方便以后可以修改

#define ROWS ROW+2      //行   +2是为了用于排查雷,方便排查处在周围一圈的坐标
#define COLS COL+2      //列   +2是为了用于排查雷,方便排查处在周围一圈的坐标
char mine[ROWS][COLS] = { 0 };         //mine数组为布置雷的数组(这个数组我们不能让玩家看见,除非玩家已经输了)
char show[ROWS][COLS] = { 0 };         //show数组为布置雷的数组(这个数组是给玩家看的,需要玩家一个一个去排查)

数组初始化

InitBoard(mine, ROWS, COLS, '0');       //初始化 布置雷的棋盘    游戏设置雷为'1',非雷为'0',初始化先将mine数组初始为全'0'。
InitBoard(show, ROWS, COLS, '*');       //初始化 排查雷的棋盘    设置未排查的坐标为'*',初始化先将show数组初始化为全'*'。
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ret)   //初始化棋盘
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}

打印棋盘

/*DisplayBoard(mine, ROW, COL); */      //打印 布置雷的棋盘   (我们无需打印mine数组,这里只是为了检查棋盘初始化是否正确)
DisplayBoard(show, ROW, COL);          //打印  排查雷的棋盘    (游戏开始,需打印show数组,这个数组是让玩家去排查的数组)

void DisplayBoard(char board[ROWS][COLS], int row, int col)   //打印棋盘
{
	int i = 0;
	int j = 0; 
	for (i = 0; i<=col; 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");
	}
}

?

布置雷

#define EASY_COUNT 3     //设置雷数 用define定义方便以后可以修改
SetMine(mine, ROW, COL);               //在mine里面布置雷  
void SetMine(char mine[ROWS][COLS], int row, int col)    //布置雷
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % row + 1;    //产生1--9 坐标
		y = rand() % col + 1;    //产生1--9坐标
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
//DisplayBoard(mine, ROW, COL);         //(我们不用打印mine数组,这个数组是用来存放雷的,这里打印只是为了检查布置雷是否正确)

排查雷

FindMine(mine,show, ROW, COL);          // 排雷     
static int get_mine_count(char mine[ROWS][COLS], int x, int y)    //计算所输入坐标周围8个坐标的雷数
{                                                                  //用static修饰使它只能在本文件中使用(也可不用)
	return mine[x + 1][y - 1] +                                   //为后面的FindMine函数做准备
		mine[x][y - 1] + 
		mine[x - 1][y - 1] +
		mine[x - 1][y] + 
		mine[x + 1][y] +
		mine[x - 1][y + 1] + 
		mine[x][y + 1]+ mine[x + 1][y + 1] - 8 * '0';
}
static int Check(char show[ROWS][COLS], int row, int col)      //遍历整个棋盘 
{                                                              //若未排的位置个数与雷数相等,则排雷成功
	int i = 0;
	int j = 0;
	int win = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			if (show[i][j] == '*')
			{
				win++;                                       //计算未排的位置并返回,与雷数作比较(为下面的FineMine函数做准备)
			}
		}
	}
	return win;                                            
}
void board(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)   //拓展周围是不是雷区
{
	int count = 0;
	if (x == 0 || y == 0 || x == ROWS - 1 || y == COLS - 1)  //判断该坐标是否越界
	{
		return;
	}
	if (show[x][y] != '*')                                  //判断该坐标是否已经排查
	{
		return;
	}
	count = get_mine_count(mine, x, y);                
	if (count > 0)        
	{                        
		show[x][y] = count + '0';              //若该坐标未排除,且周围8个坐标有雷,则通过get_mine_count函数计算返回计算值
		return;
	}
	else if (count == 0)                   //若该坐标周围8个坐标都没有雷,则标志该坐标为'0',且沿着这8个坐标的方向进行递归,遇到雷就停下来。
	{
		show[x][y] = '0';
		board(mine, show, x - 1, y);
		board(mine, show, x - 1, y - 1);
		board(mine, show, x, y - 1);
		board(mine, show, x + 1, y - 1);
		board(mine, show, x + 1, y);
		board(mine, show, x + 1, y + 1);
		board(mine, show, x, y + 1);
		board(mine, show, x - 1, y + 1);
	}
}
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)      //循环条件不能写为1,否则将会漏掉玩家全部排查成功的可能。
	{
		printf("请输入坐标>:");
		scanf("%d%d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("猜到雷,游戏结束\n");
				DisplayBoard(mine, row, col);          //玩家输了,展示布置雷的数组,让玩家输的明白
				break;
			}
			else
			{
				board(mine,show,x,y);                    //调用board函数
				DisplayBoard(show, row, col);           //玩家排完一次雷,要打印排查雷的结果(show数组)
				
			}
			win = Check(show, row, col);              //调用Check函数
			if (win == EASY_COUNT)
			{
				break;
			}
		}
		else
		{
			printf("输入的坐标非法,请重新输入\n");
		}
	}
	if (win == EASY_COUNT)                                 //若未排的位置个数与雷数相等,则排雷成功
	{
		printf("恭喜你排雷成功\n");
		DisplayBoard(mine, row, col);
	}
}

运行结果

完整代码

扫雷(含递归展开)完整代码

? ?? ??

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:12:41  更:2021-11-20 18:13:38 
 
开发: 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年11日历 -2024/11/24 6:34:07-

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