扫雷游戏的实现(上)

简介: 扫雷游戏的实现

1.前言:扫雷游戏作为一款历史悠久的游戏,是我们很多人第一次接触电脑是玩的第一款游戏,作为一款简单,益智,逻辑性强的游戏,我们如何利用C语言去自己制作一款扫雷游戏呢?

2.大致思路:1.任何游戏,都需要包含几个方面:1.菜单栏目 2.游戏内容的构建 3.游戏进一步优化 ,我们一个一个来。

A.菜单栏:游戏菜单栏的实现,让我们思考一下我们玩游戏时的菜单栏是长什么样的,大致是以下的样子,我们可以看到。主要包含play开始和结束游戏以及更多的功能,但作为初学者,我们构建一个可以开始和结束的菜单栏即可

如图,我们首先构建三个文件,分别包括:test.c源文件(用来进行游戏整体的进程),hanshu.c源文件(用来构建一些游戏逻辑的函数),shengming.h头文件(用来进行函数和各种定义的声明方便两个源文件使用以及联系)

创建好后,我们就在我们的主文件test.c文件进行菜单的构建,注意,test.c文件就是整个游戏实现的主文件,起到指挥的作用,我们大致的思路就是把各种函数加入到主文件当中。

首先常规的构建C语言基本框架,由于我们要实现一个与菜单的交互,所以我这里采用了输入数字的形式,即为,我输入1开始游戏,输入0结束游戏,由分支循环的switch语句的特点,输入常量即可进入相对应的分支语句,完美契合了我们的要求,所以我们采用switch语句,同时,为了满足游戏可以不限次进行,我们也要在switch语句之外去嵌套一个循环语句,考虑到for,while循环的特点,我们的要求是无条件开始游戏,所以我们采用do while循环的方式去进行书写,这样的话第一次直接执行循环语句更加方便,如上图所示(注意,每一条分支结束后都要加break,这是switch的特点,否则会一直进行。同时,为什么要用0来结束游戏呢?这里也是利用了循环遇到0判定为假自动结束的特点,你若想用别的数字,只需要特殊赋值一下即可,同时,我这里是采用了一个枚举体来书写,初学的同学只要用1 0这些数字写即可。

下一步我们来构建一个菜单,菜单需要窗口,我这里用*来构建,首先我们在do while循环外侧调

用我们的菜单函数,由于不需要输入参数即为空括号,返回值为void,然后如上上图所示,构建菜单函数即可,菜单函数书写完毕后我们进一步执行,让我们对应输入一个数字1或0从而选择进入游戏或者退出游戏,利用scanf函数即可完成输入,完成后我们的效果如图

这一步完成后,我们的菜单就宣告构建完成了!下一步就是最关键的游戏部分的构建了!

2.游戏内容的构建:

首先先思考我们的菜单的构建,我们的思路就是输入1就开始游戏,输入0就结束游戏,假如我们进行游戏并胜利或者失败都会循环重新选择开始游戏还是结束游戏,所以,我们在case PALY这个分

支下进行游戏的书写,如上图,然后我们开始书写我们的game函数内容

如上图所示,我们可以清楚的看到,正如我前面所说,我们游戏的具体内容的实现是依靠一个又一个函数的按次序排列来实现的,这么多函数的使用,如果放在主程序test.c里就非常混乱,倘若我们以后想要优化或者修改的话效率很低,所以这个时候我们就要使用另外两个文件,hanshu.c源文件和shengming.h头文件,在hanshu源文件里,我们主要是书写游戏实现的一些函数内容,而在头文件里,我们则需要书写各种声明和定义,这里,我们首先说明一下我们的头文件。

如上图,这是我为扫雷游戏构建的头文件的整体内容,我们可以很清楚的看到,这里面都是定义内容和函数声明,到这里,我想头文件的作用就显而易见了,它相当于一个记录表,对应着各种函数和定义的门牌号,想要使用函数就需要这个记录表,所以,在我们的两个源文件里就要声明这个“记录表”,这样,就像头文件一样,我们的源文件就可以使用头文件里的全部内容,不报错,如图

我在两个源文件都引用了头文件,对于我们自己创建的头文件,在引用的时候不会像C语言提供的库函数声明一样,我们是本地创建的头文件,所以使用双引号" "来引用头文件名称,声明好后,我们不但可以使用头文件里面的#define定义的量,也可以直接调用我们在hanshu文件里的各种函数到我们主程序test.c中,就如同我最开始的图那样。好了,现在让我们正式进入游戏部分的构建吧

再次看这张图,注释部分已经为我们书写了这个游戏我们需要进行哪些方面的构建

1.棋盘的创建

在扫雷游戏中,我们首先需要一个限定范围的棋盘,我们这里就以最简单的9*9棋盘为例子,怎样创建棋盘呢?首先思考,棋盘的本质用我们学到的知识可以理解为什么呢?我认为利用二维数组再好不过,二维数组可以清楚的锁定9*9范围内的任意一个格子,所以,我们首先就是创建二维数组来保证掌控所有坐标。如上图1.注释即可,构建二维数组我们也要同时输入行列的数量,但输入行和列的时候我们又要思考一个问题:假如我点开一个位置可以扫描到周围8个格子,也就是3*3的范围,那么假如我输入边界只能扫描到6个格子怎么办?我当时的思考是,那就加一个if语句就好啊,但是如果加if语句的话,要另外书写一套程序,包括判定程序和显示周围有几个雷,这样太麻烦了,所以我们不妨在9*9的格子外在额外提供一圈,这一圈全设为空位没雷,这样的话,即使是我输入边界的坐标,它也能以3*3的范围扫描,直接节省了很多书写步骤,因此,我们构建一个11*11的二维数组,那输入行为11,列为11就好了?

你先等一等,那如果我要改为100*100呢?或者我要改为行列不相等的呢?你可能会说那就到时候再改不就可以了么?但那样的话操作起来很麻烦,扫雷游戏还好,倘若是更大的项目,你岂不是要一个数值一个数值去改?所以这里我们就要使用头文件来定义变量了,如图,打开头文件

由于我们的数组构建是11*11,但我们后续的布雷和排查用的是9*9,所以不妨利用#define首先定义行列都为9,这样我们以后使用ROW或者COL的地方即代表着数字9,同时,我们再定义ROWS COLS为ROW COL分别加2即为11,在后续的修改中,我们只要对头文件的定义进行修改,即可完成数值的修改,十分利于后续的维护。

如图这样,我们就完成了二维数组,这里你可能疑问为何要构建两个数组呢?由于我们是简易版本的扫雷,倘若都放在一张图里的话,棋盘会很乱,所以我们分开成两张棋盘,在第一张我们负责记录你要输入的位置以及周围有几颗雷,在第二张我们负责查看雷的布置,如下两张图所示:

我们的第二张棋盘是不会显示给你的,我们在游戏时只利用第一张棋盘去进行游戏的内容,只有在我们踩雷或游戏结束时才显示第二张棋盘。

目录
相关文章
|
7月前
|
C语言
扫雷游戏
扫雷游戏
53 0
|
5月前
|
存储
|
7月前
|
C语言 C++
C语言项目(1)----扫雷小游戏的实现
C语言项目(1)----扫雷小游戏的实现
59 0
|
7月前
扫雷游戏(优化版)
扫雷游戏(优化版)
62 0
扫雷游戏(优化版)
|
7月前
leetcode-529:扫雷游戏
leetcode-529:扫雷游戏
56 0
扫雷游戏的实现(详解)
扫雷游戏的实现(详解)
109 0
|
C语言
扫雷游戏的实现(下)
扫雷游戏的实现(下)
60 0
|
存储
扫雷小游戏
扫雷小游戏
85 0

相关实验场景

更多