C语言——扫雷游戏实现(超详解)

02-27 1425阅读

目录

一、扫雷游戏规则与实现思路

1、游戏概述

2、游戏规则描述:

3、游戏实现思路

二、模块化代码实现

1、创建主函数main()

2、创建菜单函数

 3、创建游戏函数game()

①棋盘的设置

②棋盘的初始化

③打印棋盘

④雷的布置

⑤雷的排查

三、全部源码

四、总结


一、扫雷游戏规则与实现思路

1、游戏概述

扫雷游戏想必大家应该都玩过吧,这个游戏的目标呢就是在一个 9x9 的棋盘上找出所有没有地雷的格子,而不踩到地雷。当然这个9×9只是一个初级玩法,棋盘大小和雷的数量是可以随便设置的,有那种电脑满屏的模式,但是我没去尝试过,一般玩的都是初级9×9的模式,而本篇文章也主要说的是9×9扫雷游戏的实现。

扫雷游戏网页版 - Minesweeper

C语言——扫雷游戏实现(超详解)

2、游戏规则描述:

  1. 棋盘上的某些格子里有地雷,其他格子是空白的。
  2. 游戏开始时,棋盘上会有一些数字,这些数字表示周围 8 个格子中地雷的数量。
  3. 通过点击格子,如果格子是空白的,则会打开该格子;如果格子中有地雷,则游戏结束。
  4. 如果打开的格子周围的地雷数量与数字相符,则该格子周围的其他格子也会被打开。
  5. 游戏的目标是在不踩到地雷的情况下,找出所有没有地雷的格子。

C语言——扫雷游戏实现(超详解)

扫雷游戏需要玩家运用逻辑推理和数学计算来推断哪些格子可能有地雷,哪些格子是安全的。通过不断尝试和推理,最终完成游戏。总的来说扫雷游戏是一款能够锻炼玩家多种能力的益智游戏,对提高玩家的逻辑推理、数学计算、观察、耐心和毅力、空间想象力等能力都有帮助。平时没事的时候可以玩一玩的,我个人感觉还是很interesting!

3、游戏实现思路

第一步,首先是需要我们去创建一个菜单界面函数,用于选择退出游戏或者是进入游戏。

第二步,创建用于放置雷的棋盘,并进行棋盘初始化。

第三步,放入雷,并打印出雷的初始化棋盘

第四步,输入排查雷的坐标

第五步,反馈输入坐标的结果,之后循环,直到成功排查或被炸死

在扫雷的过程中,创建棋盘布置雷和排查雷都需要储存信息,所以我们需要一定的数据结构来存储这些信息,在布置雷时,如果是雷就放1,不是雷就放0;

同时为了让游戏具有一定的可玩性,便于修改游戏难度,那么们便在头文件中define行、列和雷的数量

#define number 10//雷的个数
#define ROW 9//棋盘显示的长宽
#define COL 9
#define ROWS ROW+2//设置的存储的棋盘的长宽
#define COLS COL+2

二、模块化代码实现

在实现代码之前,我们使用多文件的形式对函数的声明与定义,这可以极大的简化我们的代码

C语言——扫雷游戏实现(超详解)

test.c //⽂件中写游戏的测试逻辑 
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等

1、创建主函数main()

在主函数中我们创建一个put值,用于输入判断我们菜单的选择,用do  while判断我们输入的选择是否结束,在这里我们需要创建菜单函数,每一次循环我们都调用菜单函数,接着使用switch语句中,来执行输入的结果,如果输入1则提示玩家开始游戏并调用游戏函数game(),输入0则退出游戏,输入其他数值则提示错误,并循环执行switch语句,直至玩家主动退出。

int main()
{
	int put = 0;//选项选择
    srand((unsigned int)time(NULL));//生成一个随机数,time函数无参返回,返回类型强制转换为unsigned
	do {
		menu();//调用菜单函数
		printf("请输入你的选择:");
		scanf(" %d", &put);
		switch (put)//switch语句,判断执行内容
		{
		case 1:
			printf("\n请开始扫雷\n");
			game();
			break;
		case 0:
			printf("\n已退出游戏!\n");
			break;
		default:
			printf("\n选择错误,请重新输入!\n");
			break;
		}
	} while (put);
	return 0;
}

2、创建菜单函数

因为不需要返回值所以使用void,菜单函数会在mian()函数中被调用

void menu()//不需要返回值,void
{
	printf("***********************\n");
	printf("***********************\n");
	printf("******  1.play  *******\n");
	printf("******  0.exit  *******\n");
	printf("***********************\n");
	printf("***********************\n");
}

 3、创建游戏函数game()

①棋盘的设置

扫雷游戏我们首先要创建一个棋盘用于放置雷,而棋盘我们用二维数组char[x][y]来设置,x,y表示棋盘的行列,那么在设置棋盘之前,我们先来说一下游戏的排雷,当我们任意选择棋盘中的一个坐标,如果这个坐标放置的不是雷,那么它就会显示以当前坐标为中心的周围 8 个格子中地雷的数量,如图所示

C语言——扫雷游戏实现(超详解)

但是如果我们选择的坐标是这个棋盘的最边上,那么它所搜查的范围就会超出所设置的二维数组9×9的棋盘,如下图所示的灰色框,中心位置显示周围有两个雷,但是它搜查的范围是以它为中心的一个九宫格,所以最下面的那一行就已经不在一开始布置的9×9棋盘里了,出了棋盘的范围,导致了越界问题

C语言——扫雷游戏实现(超详解)

所以我们在设置棋盘的时候可以选择将棋盘的范围设置的大一些,在9×9棋盘的基础上,将二维数组扩大一圈设置成11×11的棋盘,如下图所示,中间蓝色范围是用来布置雷的棋盘,而周边多出来的一圈绿色便是用来防止越界问题的,那么在这个棋盘上我们输入坐标排查的的范围都是在棋盘的范围之内,就不存在越界问题了,所以在设置棋盘的时候我们将存放数据的数组可以设置成char[11][11]

C语言——扫雷游戏实现(超详解)

假设我们现在已经布置好了雷(雷用1表示,不是雷用0表示),当我们搜查一个坐标的时候,如果这个坐标周围有一个雷,那么我们需要将这个雷的数量信息记录并存储下来,同时打印给玩家,但是我们存放雷的数组里面已经有数据了,如果再存放在里面就会可能产生混淆从而导致棋盘混乱打印困难,所以我们可以设置两个棋盘,一个是雷的棋盘mine,一个是用于放置雷的信息的棋盘show,我们后面会把雷布置到到mine数组里面,再mine数组排查雷之后,将雷的信息存放到show数组里面,然后打印show数组的信息给用户参考排查,这样就不会存在数据混淆了。

char mine[ROWS][COLS];//设置成可变量方便于修改游戏难度
char show[ROWS][COLS];//此处ROWS与COLS值为11

②棋盘的初始化

棋盘设置好之后呢,我们就该对棋盘进行初始化,让用于雷的棋盘数组mine中先全是无雷信息,全部初始化为字符‘0’;显示给用户看的棋盘数组show初始化字符全部为‘*’,这样可以让用户不知道*下面的信息,从而保持游戏的可玩性。同时,为了报纸两个数组类型的一致,我们使用同一套函数对这两个数组进行初始化处理,如下图所示

C语言——扫雷游戏实现(超详解)C语言——扫雷游戏实现(超详解)

//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)//接收数组,行,列,所要初始的内容
{
	int i = 0; //控制行
	for (i = 0; i  
 

③打印棋盘

在初始化棋盘中之后,我们输入选项 ‘1’ 之后进入游戏时为了不让界面过于单调,我们需要打印一个隐藏信息的棋盘给用户看,从而方便用户进行游戏,如下图所示

C语言——扫雷游戏实现(超详解)

那么我们该如何打印呢,首先要传给函数的参数是mine数组、行和列,在进入函数之后我们为了让在棋盘的周围显示行与列,首先从零开始循环打印小于等于列号的数,打印完之后开始打印棋盘,在打印每一行开始之前呢,还是先打印行号再接着打印mine数组的每一行,那么最终代码的实现就如下所示

//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col)//打印显示的棋盘
{
	int i = 0; //控制行
	for (i = 0; i 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]