扫雷代码的实现及出现的bug

 1.扫雷代码的实现与三子棋极为相似,本质上都是对数组的应用,首先我们要写出整个工程的大致思路,比如由do while()函数引出游戏标题,再通过switch语句去选择调用游戏的某一项功能,比如由1开始游戏,由0结束游戏。如图:

扫雷代码的实现及出现的bug_第1张图片

游戏的实现需要初始化两个棋盘,一个棋盘用来放置雷,另一个棋盘打印给玩家去看,至于为什么不用一个数组去解决这个问题,是因为玩家输入坐标进行扫雷后需要显示周围雷的个数,而一个棋盘做到这些功能显然比较困难,由于在计算周围有多少个雷的时候会在坐标显示雷的个数,这样就导致显示雷数和本来就存在的雷可能会被改变,而且如果用两个棋盘后期计算个数的时候只需要返回放置雷的那个棋盘的坐标的周围8个数之和,所以在这样推荐使用两个数组。 2.首先,初始化两个数组,第一个数组为放置雷的数组,将这个数组初始化为0,第二个数组为要进行扫雷的数组也就是给玩家展示的数组,将这个数组初始化为‘*’。在初始化数组的时候我们需要考虑一个问题,如果打印9*9的棋盘,那么在计算周围雷数的时候如果坐标在拐角或者边上,打印9*9数组就会造成坐标缺失,最好的办法就是上下各多一行,左右各多一列,在打印的时候只需要打印9*9的就可以。如图:

 

扫雷代码的实现及出现的bug_第2张图片扫雷代码的实现及出现的bug_第3张图片 

第二步打印两个数组,在打印数组的时候为了让玩家输入的坐标是从0开始,建议大家在打印行数的时候多打印一行,在打印列数的时候多打印一列作为数组的坐标,这样不仅能解决输入的坐标从1开始,还能让玩家更直观的去看坐标的所在位置。在初始化数组和打印数组的时候一定要满足数组相同,否则在后期输入坐标或者计算雷数的时候极容易出现输入的坐标不在那个坐标的位置,计算的雷数也不正确。如图:

扫雷代码的实现及出现的bug_第4张图片 

打印完棋盘后就该考虑放置雷数了,放置雷数为了让每次放置的位置都不相同一定要用随机数,随机数咱们在三子棋中就已经实现过,只需要在主函数中调用srand函数,srand中加入时间戳,srand((unsigned int)time(NULL)),为什么要将time强制转化为unsigned int,大家可以查一下time函数的使用。放置雷数的时候可以创建一个int变量来计算放置的雷数,要一直放置雷数所以这需要一个循环,每放置一个雷数变量就进行减减,当变量为0时循环停止。 如图:

扫雷代码的实现及出现的bug_第5张图片

放置完雷后就该进行扫雷了,扫雷函数中先创建两个变量让玩家输入坐标的位置,输完位置就需要判断输入的坐标是否合法,如果合法就进入下一步,不合法则提醒玩家重新输入,坐标合法后需要判断此坐标位置是否已经排过雷,如果排过则提醒玩家重新输入,否则就开始判断此坐标是否有雷,如果有雷则直接炸死,反之则进入计算此坐标周围雷数的步骤,我们为计算周围雷数创建一个函数,将放置雷的输入放入,再放入x和y坐标,最后用一个整形变量接收函数返回的值,这个返回值就是雷的个数,在这里需要说明一下,在初始化数组的时候数组放入的是字符,如何让字符变为整数传给变量呢?举个例子,首先ascll表中1的ascll值为49,减去字符0的ascll值48后为数字1,也就是说字符减去0字符后得到对应的整形数字,这样就将雷数返回给变量,下一步就是将变量赋给显示数组的坐标,显示数组初始化的时候也是字符,所以需要将数组转换为字符,那么凭借刚刚的例子,只要将数字加上字符0的ascll值就能得到对应的字符,这样就将显示雷的个数解决了。排雷的过程是一个循环,循环条件是什么呢?很简单只要将不是雷的位置都排过了不就排雷成功了吗,所以创建一个变量,循环条件是这个变量小于行数乘列数再减去雷数,当变量等于行数乘列数再减去雷数时玩家排雷成功,否则就一直排雷。 如图:

扫雷代码的实现及出现的bug_第6张图片

下面展示完整代码:

 扫雷代码的实现及出现的bug_第7张图片

扫雷代码的实现及出现的bug_第8张图片 

扫雷代码的实现及出现的bug_第9张图片 

 

 

你可能感兴趣的:(bug)