从零开始:C语言编写扫雷游戏的逻辑详解

(一)扫雷游戏介绍

这是经典的扫雷界面,我相信对于大多数小伙伴们小时候都或多或少玩过,听过这款游戏吧,在实现这个游戏之前,我们先来简单玩两把哦。www.minesweeper.cn/

(二)游戏主框架的构建

在文件test.c中:

c 复制代码
void menu()
{
	printf("************************\n");
	printf("******  1 . play    ****\n");
	printf("******  0 . exit    ****\n");
	printf("************************\n");
}

void game()
{

    //这里具体实现游戏的内部逻辑

}

void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入你的选择:");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

}


int main()
{
	test();
	return 0;
}

这是c语言中常用的游戏主框架,具体逻辑我已经在之前的文章《c语言实现-猜数字-游戏》中讲过,感兴趣的小伙伴可以去看看哦。blog.csdn.net/

(三)函数game内部的实现逻辑

1,分块,多文件

c 复制代码
void game()
{
	//创建棋盘

	//初始化棋盘

	//布置雷

	//排查雷

	//显示棋盘


}

可以看到,在game里面需要实现的功能还不少,如果每一个功能都在game函数内部具体实现,那么必然会导致game函数变得很"臃肿",所以我们将每一个功能都封装成函数。 这时我们新建game.c 和game.h 文件,再将这些函数声明和定义分别放入game.c和game.h文件中,这样就实现了分块,使得工程的逻辑更清晰。

2,扫雷游戏逻辑分析

a创建棋盘

问题1:如何实现棋盘的创建

回答:用二维数组

问题2:棋盘大小怎么确定

回答:利用宏定义,方便修改

问题3:棋盘的数据类型怎么确定

回答:用char类型,为什么用char类型而不是int或者其他类型呢?别急,下面马上就解释。

问题4:创建几个棋盘

回答:需要创建两个棋盘,一个用来储存雷和非雷的信息(不显示给用户),一个用来储存界面信息(显示给用户)。 好,确定了棋盘类型,大小,那么接下来我们就可以创建棋盘了:

c 复制代码
void game()
{
	//创建棋盘
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘

	//布置雷

	//排查雷

	//显示棋盘


}

为了使得棋盘大小可以方便修改,我们在定义二维数组大小时,可以采用宏的方式来实现,宏的定义我们放入game.h头文件中统一管理,如图:

需要注意的是,为了能在test.c文件中使用game.h中的宏,我们还需要在test.c中包含game.h头文件,如图:

b初始化棋盘

我们可以创建函数名为Initboard()作为初始化棋盘函数,将函数声明放入game.h,将函数定义在game.c完成

c 复制代码
void game()
{
	//创建棋盘
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	Initboard(mine,ROWS,COLS,'0');
	Initboard(show,ROWS,COLS,'*');
	//布置雷

	//排查雷

	//显示棋盘


}

函数声明: 函数定义:

同理,之后的显示棋盘,布置雷,排查雷都按照类似的方式去完成。

c显示棋盘

c 复制代码
void game()
{
	//创建棋盘
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	Initboard(mine,ROWS,COLS,'0');
	Initboard(show, ROWS, COLS, '*');
	//布置雷

	//排查雷

	//显示棋盘
	Showboard(show,ROW,COL);

}

函数定义内部实现几乎与初始化一模一样。画蓝色横线的部分有细微差别,请读者细细品味。

运行后看看效果:

d布置雷

c 复制代码
void game()
{
	//创建棋盘
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	Initboard(mine,ROWS,COLS,'0');
	Initboard(show, ROWS, COLS, '*');
	//布置雷
	Setmine(mine, ROW, COL);
	//排查雷

	//显示棋盘
	Showboard(show,ROW,COL);
	Showboard(mine, ROW, COL);
}

此处用到了rand()函数来制造随机数,实现在随机位置进行布雷,当然,在此之前,我们应该需要设置随机数种子,具体如何设置,可以参看我的上一篇文章blog.csdn.net/lucky_____b...

e排查雷

c 复制代码
void game()
{
	//创建棋盘
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	Initboard(mine,ROWS,COLS,'0');
	Initboard(show, ROWS, COLS, '*');
	//布置雷
	Setmine(mine, ROW, COL);
	//排查雷
	Findmine(mine,show, ROW, COL);
	//显示棋盘
	Showboard(show,ROW,COL);
	Showboard(mine, ROW, COL);
}

运行后看看效果:

(四)后记

好了,到此,一个简易的扫雷游戏就算是实现了,扫雷游戏中设计了不少c语言的知识点,可以有效巩固对c语法的掌握和深入理解。当然,这个扫雷程序还有很多功能可以扩展,比如,我们在排雷时,坐标的输入不是很容易确定,那么能否添加列数和行数呢?另外,许多小伙伴对黑框框的界面感到厌烦,能不能做出一个好看的界面呢?预知后续如何,请听下回分解。嘿嘿,感兴趣的小伙伴可以点个关注呀~

相关推荐
zopple5 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy0001117 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本8 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34168 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan8 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer10 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor35610 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor35610 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer11 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP11 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪