完成了扫雷代码之后,我才发现原来一个那么小的游戏实现起来也是十分的不容易,加上一些优化,和等等之类的,都不知道要多少行代码了,对于刚学C语言不久的我来说,这个代码的实现花费掉我不少的时间,为了理解和完成它,我大概花了两个半小时左右。完成这个代码用到了一个.h和两个.c文件,一直以来我都是只用一个文件写代码,现在第一次上手多文件实现觉得并不算难,还挺好上手的,多文件确实有很多便利之处。以下是我的扫雷代码:
扫雷代码乍一看上去有点复杂,但是拆分成一个个模块去实现就相对变得简单很多了。
大体分为四个部分:
1.初始化数组
2.打印棋盘
3.布置雷
4.排查雷
根据每个部分的具体要求进行具体的实现。
当然我们要先设置玩一个游戏最基本的东西。那我们就用test()来实现吧,游戏要用目录吧,设立一个menu函数来实现它,分为1.开始游戏和0.结束游戏两个部分,然后就用switch()函数来对你选择的选择地选项进行对应的输出,如果你选择了1,那么就开始游戏,用game()来实现游戏。
对于扫雷来说,判段有雷还是没有雷,我们可以用字符'1'或者'0'来进行判断,'1'则表示有雷,'0'则表示没有雷,如果排查到没有雷,那么就判断周围一圈有多少个雷,有多少个雷就输出多少个数字,已知我们是要用用数组来给空间存放,一个数组同时进行三个条件的实现未免有些繁杂,实现起来也会相对困难,那我们就用两个数组分别实现各个功能,mine数组用来存放雷的信息,而show数组就用来存放排查出雷的信息,但是两个数组都必须是字符数组,mine是字符型而show是整型的话,两个数组的关联就会变得很复杂,为了统一,省去不必要的麻烦,那么就设立两个字符数组吧。
第一部分:
(InitBoard)初始化两个数组,mine就用'0'来初始化,表示全部都没有雷,show就用'*'来初始化,相当于整个棋盘都可能是雷,赋予它危险的神秘感。对于数组的行和列,我们就分别用ROWS和COLS来表示,在game.h用difine来定义两个个常量,到时候如果你想加深游戏难度,那你可以随时修改,我就用9*9来实现。但是对于判断周围一圈有多少个雷的时候,只有只定义9*9的空间的话,就会越界,我们不妨给我们的数组扩大一圈,这样问题就解决了那么ROWS和COLS就设为11,再定义ROW和COL为ROW+2和COL+2,之后我们就可以随时调用数据了。初始化的函数实现很简单,因为两个个数组的行和列都是一样的,所以就设立一个字符变量来存放初始化的值。
第二部分:
(DisplayBoard)打印棋盘的函数实现当然也很简单,用双重for循环来解决就行了,但是这样打印出来的棋盘,我们不清楚它的行和列,我们可以完善一下,这样调用坐标就很方便了,列的话在双重for循环的第一层每次循环打印一个i就行了,而打印列的话因为前面多了一列,那么就从0开始,用单层for循环实现。但是这样还不完美,这时连个数组是贴在一起的,就就在后面打印一个==============来隔开,哪里不美观就在哪里进行优化就行了。
第三部分:
(SetMine)设置雷的话要随机值,那我们就要用到rand()函数了,运用这个之前还需在test()上加上srand((unsigned int)time(NULL)。不妨设置两个变量x和y分别作行坐标和列坐标因为是11*11中的9*9,所以x和y的开始都是1~9,那就要限定它的范围,rand()%row是0~8,那么rand()%row+1就是1~9了,之后便用count来接受要放入雷的个数,用 define NUM来定义一个值,就设为10吧。用while循环,count作参数,因为不能重复放,所以当不等于'1'的时候就就存放一个雷,放一个就count--,知道count为0时为假,退出循环。
第四部分:
最后一个部分的思路可以分为四个小部分~
1.输入一个坐标
2.判断是否超出范围
3.如果是雷则炸死,退出程序
如果不是,排查周围雷的个数
4.排查完全部,游戏结束
这次的函数要实现两个数组的联立,所以参数也要写上两个数组,行坐标和列坐标要在限定的范围才能生效,范围为1~9,在这个成立的基础上,就要判断是否是雷了,是雷就凉凉,不是雷就排查周围雷的个数,这时设立GetMineCount()函数来实现这个操作,假设这个坐标是x,y,那么它左边的就是x,y-1,右边的就是x,y+1,一次类推,就可以得出周围的坐标了,然后把他们相加减去8个'0',就得出它的个数,'1'减去'0'=33-32等于1,加上后就可以直接return这个个数,还有一种方法,因为行坐标的范围在x-1到x+1,列坐标的范围在y-1到y+1,所以可以这样实现:
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int count = 0;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
count = mine[x + i][y + j] - '0';
}
}
}
因为数组空间格式是row*col,那么没有雷的个数就是row*col-NUM,用win来存放,当row*col-NUN!=1的时候那就游戏还没结束,当row*col-NUN==1的时候游戏就胜利了。
至此扫雷游戏就简单的实现了。