用C语言实现扫雷

完成了扫雷代码之后,我才发现原来一个那么小的游戏实现起来也是十分的不容易,加上一些优化,和等等之类的,都不知道要多少行代码了,对于刚学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的时候游戏就胜利了。

至此扫雷游戏就简单的实现了。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值