C语言实现扫雷小游戏(代码含注解、包含递归遍历及标记)

目录

一、扫雷游戏介绍及其主要功能点

(1)扫雷游戏介绍

(2)扫雷游戏需要实现的功能点(主要)

二、游戏功能模块的实现

(1)雷盘大小及地雷数量的定义

(2)雷盘的初始化及打印(显示)

 ①雷盘的初始化函数

 ②雷盘的打印(显示)函数

(3)布置地雷的函数

(4)排查格子的函数

①统计格子周围地雷数量的函数

②递归排查信息为‘0’的格子周围格子信息的函数

(5)标记地雷的函数

(6)删除标记的函数

三、游戏运行的截图(主要)

(1)第一次排查坐标

(2)执行一次操作后,用户继续选择

(3)过程中可标记(P)或取消标记地雷

(4)游戏失败,打印mine数组显示地雷位置

(5)游戏成功,打印mine数组显示地雷位置

四、游戏实现代码

(1)头文件game.h

(2)源文件game.c

(3)源文件test.c


一、扫雷游戏介绍及其主要功能点

(1)扫雷游戏介绍

  扫雷游戏游戏大家并不陌生,通常由一个方形区域组成,被分成若干个小方格。(如下图)

                               

  每个方格里都可能有雷,玩家需要不断排查,根据方格提供的数字信息(表示该方格周围8个方格地雷的数量),排查完所有安全的格子,获得游戏胜利。若排查到地雷,则游戏失败。

(2)扫雷游戏需要实现的功能点(主要)

  ①为了游戏体验,第一次排查格子时一定不是雷

  ②玩家排查一个格子时,若其无雷,则自动排查其周围格子的信息,依次循环

  ③玩家确定某格子有雷后,可以标记该格子

  ④玩家可以取消之前做的标记


二、游戏功能模块的实现

(1)雷盘大小及地雷数量的定义

  雷盘的实现主要采用二维数组的方法

#define ROW 9  //二维数组行数
#define COL 9   //二维数组列数
#define MINE 10 //地雷数量 

#define ROWS ROW+2      //选择格子后是检测格子周围八个格子地雷的数量,当检测边缘的格子时,
#define COLS COL+2      //附近会没有其他格子,因此拓宽二维数组的大小,方便后续检测格子周围地雷数量

(2)雷盘的初始化及打印(显示)

 ①雷盘的初始化函数

  设置两个雷盘,一个mine数组保存地雷位置信息,一个show数组用于展示游戏过程信息给玩家

void InitBoard(char board[COLS][ROWS], int cols, int rows, char c) {
	for (int i = 0; i < cols; i++) {
		for (int j = 0; j < rows; j++) {
			board[i][j] = c;
		}
	}
}

 ②雷盘的打印(显示)函数

  游戏过程中不断打印show数组展示给玩家游戏信息

void PrintBoard(char board[COLS][ROWS], int col, int row) {
	printf("---------------------------------\n\n");
	printf("    ");                                                //行坐标格式对齐
	for (int i = 1; i < col + 1; i++) {                            //最上方一行打印列坐标0-9
		printf("%d   ", i);
	}
	printf("\n\n");
	for (int i = 1; i <= col; i++) {
		printf("%d   ", i);                                      //每行打印元素前打印行坐标
		for (int j = 1; j <= row; j++) {
			printf("%c   ", board[i][j]);
		}
		printf("\n\n");
	}
	printf("---------------------------------\n\n\n");


}

(3)布置地雷的函数

  采取随机值的办法布置地雷,在函数中加入一次排查操作,使得设置的随机值不为排查的坐标,以排除该地方是雷的可能性

void SetMine(char board[COLS][ROWS], char show[COLS][ROWS], int col, int row) {
	int count = MINE;      //计数器,用于放置设定的地雷数量
	printf("请输入要排查的坐标(依次输入)\n\n");
	while (1)               //死循环防止输入坐标不合法
	{
		int x, y;
		scanf("%d%d", &x, &y);  //输入第一次要排查的坐标,需要将其设置为没有地雷
		int m, n;                //用于存放随机的行列坐标以放置地雷
		if (x > 0 && x < row + 1 && y>0 && y < col + 1)      //坐标合法
		{
			while (count)
			{
				m = rand() % row + 1;  //行坐标范围1-9
				n = rand() % col + 1;  //列坐标范围1-9

				if (board[m][n] == '0' && (m != x || n != y)) {  //没有放过地雷的地方才能放雷,同时第一个选择的格子不能有雷
					board[m][n] = '1';                       //放置地雷
					count--;                                 //计数器减少
				}
			}
			show[x][y] = get_mine_count(board, x, y) + '0';//show数组中传入第一次排查格子周围雷的数量,因为数组是char类型,所以需要加上'0'转为字符型的量(ASCII码)
			ExpendMine(board, show, x, y);
			PrintBoard(show, col, row);                     //打印show数组
			break;                                           //跳出while(1)死循环
		}
		else
		{
			printf("ERROR:请输入正确的坐标\n\n");               //执行死循环重新输入坐标
		}
	}
}

(4)排查格子的函数

  输入坐标排查该格子的信息,利用get_mine_count()函数统计该格子周围雷的信息,利用ExpendMine()函数递归遍历信息为‘0’的格子周围格子的信息

int FindMine(char mine[COLS][ROWS], char show[COLS][ROWS], int col, int row) {
	PrintBoard(show, col, row);               //打印show数组

	while (1)
	{
		//1.输入排查的坐标
		int m, n;
		printf("请输入要排查的坐标(依次输入)\n\n");
		scanf("%d%d", &m, &n);
		if (m > 0 && m < row + 1 && n>0 && n < col + 1)
		{
			if (show[m][n] != '*' && show[m][n] != 'P') {             //检查是否输入了重复坐标
				PrintBoard(show, col, row);                          //打印show数组
				printf("ERROR:这个地方排查过了,请重新输入\n\n");
			}
			else
			{
				//2.检查坐标处是否是雷
				if (mine[m][n] == '1')                        //有雷
				{
					printf("\n");
					PrintBoard(mine, col, row);               //打印给玩家具体的地雷位置
					printf("你踩到地雷了,真菜啊!\n\n");
					printf("上方为地雷分布情况,1是地雷,0是安全格子\n\n");
					return 0;                                    //游戏结束,直接返回0
				}
				else
				{
					ExpendMine(mine, sh
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值