【C语言】简易版扫雷+进阶版扫雷

目录

前言

一、分模块化

二、准备雷盘

2.1 游戏菜单

2.2 创建雷盘思路

2.3 构建雷盘

2.4 雷盘展示

2.4.1 初始化雷盘

2.4.2 打印雷盘

三、排雷

3.1 布置雷

3.2 排查雷

四、进阶版扫雷

总结


前言

C语言实现扫雷小游戏,帮我们更进一步的掌握数组、模块化思想等知识。


一、分模块化

对于扫雷小游戏,相信老铁们应该不陌生,根据信息进行排雷,大家可以参考网页版的扫雷游戏:扫雷小游戏

对于扫雷小游戏,虽然是一个小项目,代码量不多,但对于初学者来说,重要的是学习如何分模块开发项目。

本文将该游戏分成三个文件:

  • test.c游戏测试文件
  • game.c游戏执行逻辑(函数实现)
  • game.h游戏声明(函数声明,头文件)

二、准备雷盘

扫雷游戏,首先需要一个雷盘,本文讲解的雷盘为9×9规格。

2.1 游戏菜单

一个游戏,最先呈现给用户看的是游戏菜单,对于游戏菜单,可以用do...while循环 + switch选择语句完成,因为无论用户是否开始还是退出游戏,程序都会运行一次。

test.c文件
#include "game.h"
void menu()
{
	printf("********************\n");
	printf("***** 1、play ******\n");
	printf("***** 0、exit ******\n");
	printf("********************\n");
}
int main()
{
	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);
	return 0;
}

game.h文件
#pragma once
#include <stdio.h>

2.2 创建雷盘思路

对于雷盘,使用二维数组存储数据是最合适的,符合行列。那一个雷盘就可以了吗?

我们规定:雷用字符1表示,非雷用字符0表示。

因此冲突点就出现了,如果对某个位置进行排雷,统计雷数时,正好也为1,那究竟是雷还是雷数呢?

为此,这里用了一个很巧妙的方法,我们定义两个大小一致的二维数组,也就是两个雷盘,一个雷盘用于布置雷,一个雷盘用于存放统计后雷的个数。

因此,我们有以下规定:

  • 布置雷的二维数组叫mine。
  • 存放雷数的二维数组叫show。因为要展示给用户看选择的位置周围的雷数,因此叫show。
  • mine雷盘中字符0为非雷,字符1为雷。
  • show雷盘中字符*表示未排查,字符数字表示该位置已被排查。

前面说过,我们的雷盘是一个9×9的规格,那相对于的两个数组的大小也是9×9吗?

其实不是,应该为11×11,因为当我们对最上、最下、最左、最右中的位置进行排雷时,统计周围有几颗雷时,会造成数组越界的情况,因此我们定义多2行2列的数据,这部分位置不存放雷,将雷存放在9×9的雷盘中,多定义的2行2列只是为了防止数组越界。


2.3 构建雷盘

对于数组的大小,我们不能写死,应该用#define标识符常量来表示,方便以后想扩大雷盘。并且我们需要分别定义9×9和11×11的标识符,因为在布置雷、打印雷盘、排雷的功能中只需要用到9×9的区域,而在初始化雷盘时,需要用到11×11区域。

test.c文件
#include "game.h"
void menu()
{
	printf("********************\n");
	printf("***** 1、play ******\n");
	printf("***** 0、exit ******\n");
	printf("********************\n");
}
void game()
{
	//定义两个大小相同的二维数组
	//这里的数组大小最好用#define标识符表示,后续想改变就该#define就好了
	//用于布置雷,用字符数组的原因是规定字符0为非雷,字符1为雷
	char mine[ROWS][COLS] = { 0 };
	//用于存放排查雷的信息(主要给用户看的页面
	//用字符数组的原因是规定雷数用字符数字表示,其它位置用字符*表示
	char show[ROWS][COLS] = { 0 };

}
int main()
{
	int input = 0;
	do
	{
		//游戏菜单
		menu();
		printf("请选择:>");
		scanf("%d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值