C语言趣味小游戏——扫雷(详解版)

前言



全篇无任何废话,本文的解释大多数都在代码段中,所以一定要看代码,边看边学边理解。

这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容

可以先学习一下比扫雷还简单的猜数字和三子棋
C语言趣味小游戏——猜数字

C语言趣味小游戏——三子棋

游戏实现的条件(简单版)

1:创建三个文件
1:(test.c):用于游戏的逻辑测试,游戏菜单的打印,游戏设计的展示

2:(game.c):用于游戏功能的具体实现,游戏的核心代码

3:(game.h):用于头文件的包含,符号以及函数的声明

2:先布置10个雷

3:扫雷

(1):输入坐标,是雷游戏结束

(2):输入坐标,不是雷,以坐标为中心,遍历周围的8个位置中有多少雷,就显示对应的数字

3:直到把所有非雷的位置找出来,游戏结束,扫雷成功

打印简易的菜单

1:先打印一个简单的菜单,过程不过多赘述,这个链接有详解
三子棋——打印一个简易的菜单


void menu()
{
   
	printf("**********************\n");
	printf("******  1.play  ******\n");
	printf("******  0.over  ******\n");
	printf("**********************\n");
}

//	

void test()
{
   
	int input = 0;

	do {
   

		menu();

		printf("选择 1 进入游戏,选择 0 退出游戏\n");

		scanf("%d", &input);

		switch (input)
		{
   
		case 1:
            //    game();    假设这是游戏
			printf("扫雷游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新输入\n");
		}

	} while (input);
}

//

int main()
{
   

	test();

	return 0;
}

雷盘的初始化

1:创建一个9*9的二维数组并且创建数组存放10个雷

2:把雷赋值为 1 放进数组里,如果不是雷(非雷)就为 0

3:开始扫雷 ↓ 例如下图,以为坐标(4,1)为中心,它周围有两个雷,就显示2

在下图中坐标为(3,1)的位置,它的周围只有一个雷,所以显示的是1

在这里插入图片描述
但是在第2步,我们将雷赋值为了1放进数组中

这样就会产生bug,这是绝对不允许的

而且还有一个问题,如果坐标在雷盘的边缘,就不可能遍历周围的8个坐标,如果用代码实现会太麻烦

出现的问题

至此已近出现两个问题

1:我们赋值雷为1,但是在遍历坐标周围8个位置的时候,只有1个雷,这个 ‘ 1 ’ 究竟是周围8个坐标中有1个雷,还是我们赋值的雷

2:在雷盘边缘,我们遍历不了8个位置,但是用代码实现又会太麻烦

解决方案


1(1):再创建一个数组,也就是雷盘2,我们将雷盘1和雷盘2的数据都一致,将雷盘1中显示雷个数的数字放到雷盘2,其他数据放在雷盘1,这样只会显示雷盘2,不会分不清 ‘ 1 ’ 究竟是什么

在这里插入图片描述

1(2):将雷盘1的 非雷(0),在雷盘2中以 ‘ * ’ 打印出来

在这里插入图片描述

2(1):在坐标(3,3)中,可以遍历周围8个位置,但是在坐标(9,1)中,只能遍历3个位置

如果修改代码,那将会是一个极其复杂的过程
在这里插入图片描述

2(2):所以我们将雷盘再扩大一圈,雷盘还是9×9,但是大小是11×11,多余的是防止越界遍历
在这里插入图片描述
至此,问题已经解决,下面开始代码的实现过程

游戏的实现

在文件中使用宏来定义雷盘的大小,以及防数组越界雷盘的大小

//		所在的文件	→	game.h

//		↓	雷盘

#define ROW 9

#define COL 9

//		↓	防雷盘越界

#define ROWS ROW+2

#define COLS COL+2

定义两个雷盘

//		所在的文件	→	test.c

void game()
{
   
	//	游戏的实现

	char mine[ROWS][COLS] = {
    0 };	//	雷盘 1

	char show[ROWS][COLS] = {
    0 };	//	雷盘 2

}

初始化雷盘

//		所在的文件	→	test.c

void game()
{
   
	//	游戏的实现

	char mine[ROWS][COLS] = {
    0 };	//	雷盘 1

	char show[ROWS][COLS] = {
    0 };	//	雷盘 2

	//	初始化雷盘

	Init_board(mine, ROWS, COLS,'0');

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

}

声明雷盘的信息


//		所在的文件	→	game.h

void Init_board(char arr[ROWS][COLS], int rows, int cols,char set);

//						雷盘		,行	  ,列		,内容

定义雷盘的信息

//		所在的文件	→	game.c

void Init_board(char arr[ROWS][COLS], int rows, int cols,char set)
{
   
	int i = 0;
	int j = 0;
	for (i = 0; i < rows<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值