扫雷游戏的实现

1.游戏说明

    1.使用控制台实现经典的扫雷游戏。2.游戏可以通过菜单实现继续玩或者退出游戏。3.扫雷的棋盘是9*9的格子。4.默认随机布置10个雷。5.玩家可以排查雷(如果是雷游戏结束,不是雷就显示排查的周围一圈有几个雷,直到把所有雷排查完成游戏结束。)

2.游戏分析

    在做扫雷游戏时,我们需要把雷和非雷的信息存储起来,因为我们想要在9*9的棋盘上完成这样的存储,因此我们想到使用二维数组来存放这些信息。现在就有一个9*9的二维数组。

让这个棋盘是雷的位置存放1,不是雷的位置存放0。

比如现在我们排查(8,2)这个坐标,它周围一圈有一个雷,当统计周围一圈有多少个雷时,会造成越界访问。

为了防止越界访问,可以让数组扩大一圈,创造成11*11的数组,在扩大的一圈上不放置雷,我们布置雷时还是在9*9的数组上布置即可。

比如现在我们再访问(2,4)这个坐标,这个位置不是雷,那我们现在就要统计周围一圈有几个雷,统计出来周围有一个雷,此时需要将1个雷的信息存储起来并且打印出来提示给玩家。可是这一个雷的信息放在那里呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。有时候可能会有这样的想法:能不能把雷和非雷的信息用数字,统计出的雷的信息用字符表示呢?这样就会让一个棋盘中存储了太多信息,既不方便展示,还比较混杂不方便。因此这里采用令一种方案,专门给⼀个棋盘存放布置好的雷的信息,再给另外⼀个棋盘存放排查出的雷的信息(展示给玩家的棋盘),这样就互不干扰了而且比较清晰。为了给玩家一种神秘感,我们可以给玩家的棋盘在初始化时初始化为字符'*',同时布置雷的棋盘也用字符‘0’和‘1’表示没有雷或者有雷,这样方便同时处理。

3.文件说明

    我们创建这样三个文件:test.c(游戏的测试逻辑)   game.c(函数定义)  game.h(函数声明)。

4.游戏实现

    玩家可以通过菜单实现继续玩或者退出游戏,因此这里要用到循环。为了使主函数看起来不凌乱,我们调用一个test函数进行测试,在test.c文件中完成。

    下面就进行游戏玩法的实现,我们创建2个数组,一个是mine数组用来存放布置好的雷的信息,一个是show数组,用来存放排查出的雷的信息。

但这里直接写成11就会把这个代码写死了,比如我们后期想实现20*20等这样的棋盘遇到11的地方就都要修改不太方便,因此我们可以在game.h这个文件中写这样的代码,定义一个行和列。

为什么这样麻烦呢,因为我们操作还是操作的9行9列的数组,但要对11行11列的数组进行初始化。下面就对数组初始化。先对mine数组进行初始化,先全部初始化为’0‘表示没有雷,我们设计InitBoard这个函数初始化棋盘,将数组,多少行,多少列作为参数传过去。并在game.h中声明,game.c中定义。

此时发现test.c和game.c中的ROWS和COLS下面有报错,这是因为它们不认识这两个符号,我们仅需要在文件前面包含我们自己的头文件就可以了。

下面继续初始化show数组,将show数组的内容初始化为’*‘,可前面已经有初始化棋盘函数了,能不能用同一个函数就可以初始化两个棋盘,当然可以,我们仅需多加一个参数就能解决这样的问题。

那到底有没有初始化成功呢?写一个打印函数来打印数组中的类容进行观察。

此时初始化成功,但有一条这样的提示:

这是因为并没有在game.c包含头文件,为了方便起见,直接将头文件写在game.h中即可。但是这里比较紧密,也不方便让玩家定位要排查的坐标,因此做一些小改进。

现在开始在9*9的棋盘上随机布置10个雷,这里创建SetMine函数来进行布置雷,我们在头文件中定义一个EASY_COUNT来表示雷的个数,这里也是为了方便后期改进时不麻烦,调用rand函数实现随机表示(rand函数的使用可以在我的猜数字博客中找到)。并把需要的头文件写到game.h中。布置好雷的信息后通过打印进行检查。

现在雷就成功布置好了,可以实现排查雷的函数了,这里命名为FindMine。我们在mine数组中排查出的雷的信息,将信息放在show数组中,这里需要将mine数组和show数组都传过去。这里要不断的进行排查,因此会用到循环。在排查过程中,排查的位置如果不是雷的话我们需要统计周围雷的个数,因此设计GetMineCount函数,此函数在本文件内部设计即可,因为在数组中存放的是字符,所有统计字符个数时我们将周围一圈相加再减去8*’0‘即可,将数据存放在show数组中时不要忘记再次加’0‘。排查过程中,如果该位置是雷,我们提示玩家游戏结束,并将布置雷的信息展示给玩家。

此时就基本完成了,但是还是有一些小问题,游戏没有设置胜利条件,而且玩家如果再排查相同的坐标没有提示信息或者玩家如果输入非范围的坐标也没有提示,在做如下优化:

现在游戏就成功完成了。

5.完整代码

game.h

game.c

tets.c

    

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值