扫雷游戏的初步实现

风靡全球的扫雷游戏曾给许多电脑玩家带来快乐,现在我们来说说扫雷游戏的基本实现。初次学习的小伙伴可能觉得有点困难,建议反复观看,坚持就是胜利。

扫雷游戏的框架包括了数组的建立,棋盘的打印,布置雷,排查雷。

说到底扫雷游戏的实现就是在一个棋盘里随机摆放雷,黑子就是雷,白子为非雷。因此就要先生成棋盘,也就是一个二维数组。

开始前我们要先定义一个头文件game.h,再定义两个源文件game.c和test.c。game.c为函数的实现,test.c为程序的运行测试,在源文件game.h中放置声明定义的函数名。

 

在game.h中定义row为行,col为列。先从简单难度开始9*9方格。

在这里我们用mine表示初始排查盘,show表示排雷后的棋盘。即将在mine中排查到雷的信息传递到show数组中。

  

本来是9*9的方格为什么要用11*11的数组呢?这里我们要讲一个特殊情况:

 因此我们为了以后修改方便,定义rows=row+2,cols=col+2;

我们把数组定义为char类型,这是因为我们要在mine数组中用字符‘0’表示非雷,字符‘1’表示雷,show数组初始化为字符‘  *  ’,原因我们后文再讲。每次排查完雷后就会有提示周围区域内雷的个数,翻译过来就是在mine数组中排除出雷的信息后传递到show数组中。接下来就是数组的初始化了。

 

 这里我们用到了自定义函数Initboard(char board[rows][cols],int ROW,int COL,int set),在show数组中我们用‘ * ’初始化。为了达到一个函数多用的效果,我们引入set变量,用来接收字符  ‘ 0 ’    ‘ * ’ 

 

这样mine数组则对应‘0’,show数组则对应‘*’。

初始化完棋d盘后就要打印了。这里我们定义一个打印函数Display(show, row, col)

接下来就是布置雷:这里我们要用到随机数的生成(上一篇文章已讲,就不再多说)。

定义Setmine(char board[rows][cols], int ROW, int COL)函数

 

 因为我们只需在9*9也就是row*col范围内布置雷,所以用x,y表示雷的横纵坐标。用 rand() % ROW /COL + 1 限制坐标范围为(1 ~ ROW/COL)。使用while循环,count表示雷的个数,每次布置一个雷就count个数就减1,直到为0跳出循环。需要注意的是雷需要在原来没有雷的位置上布置,因此用if语句甄别。

                     

 最后一步:排雷

 由上图可知,每次排查一个坐标后就会出现该位置旁的雷的个数,那么我们应该如何实现雷个数的统计呢?我们还是以该图为例。

 当排查的坐标位置不是雷时(如图中红圈位置),用坐标周围八个坐标(黄色方框)对应字符减去字符‘ 0 ’的总和即可得到周围雷的个数。这里我们要引入一个知识点,字符‘ 0 ’在Ascii码表中对应数字为48,而字符0~9在表中的数值是连续的,也就是说字符0和字符1相差1。

如此,我们定义一个Getmine函数,将八个坐标对应字符减去‘0’后的和返回。

再用 Findmine函数进行实现。用while循环实现不断排雷,将每次排雷后Getmine函数返回值加上字符0再赋值给show数组中排查的坐标,最后用Display函数输出。因为我们在9*9的范围内排雷,所以要注意输入坐标的合适性,用if语句进行甄别,横纵坐标范围均为1 ~ 9。考虑完这些后我们还要考虑游戏的结束。引入win变量表示非雷个数,每排完一次就win++,直到win大于或等于ROW*COL-Easy_count,跳出循环 。ROW和COL表示排查雷的有效范围。当你跳出循环后还要用if语句判断是否win等于ROW*COL-Easy_count.

 如果你能做到这里,说明你已经成功完成了扫雷游戏的基本游戏设计,你可以根据游戏难度改变源文件game.h中row,col (横纵数目)以及Easy_count(雷的数量)的大小。美中不足的是这里还缺乏函数的递归,无法实现点一次即可出现如图所示边界,需要一个个排查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值