Hello大家好!今天接着上一篇文章来讲~~~我们上一篇着重讲的是前半部分,但是扫雷小游戏个人认为虽然全部都是重点,但是最重点的是放雷和排雷的代码的编写!这里我们以基础9*9为标准,放10个雷。这样,在game.h中我们可以先进行如下操作:(代码不是连续的,只供理解,具体代码参考萌新版1)
#define EASY_COUNT 10 //定义了代表10的字符
void SetMine(char board[ROWS][COLS],int row,int col) //布置雷
布置10个雷,我们使用while循环,即进一次循环随机布置一个雷。注意随机哦~随机用rand生成的。rand()%9+1就可以表示1~9的行、列的具体位置了。我们需要每控制一次就count--,而不是在while循环里面count--;之后在game.h里面添加相应的头文件。如果在此时我们进行测试,雷的位置会直接显示在大屏幕上。接下来,我们就需要编写排查雷FindMine的代码了。
while(1)设置循环的条件。在每次进行排查雷的时候,我们可以都进行一个提示标语,提示我们输入正确的坐标。在这里我们可以设置坐标(x,y)的条件,即
if(x>=1&&x<=9&&y>1&&y<=9)//输入合法坐标
{
if(mine[x][y])=='1')
printf("很遗憾,你被炸死了\n");
}
else printf("输入坐标非法,请重新输入\n");
上面显示的是被炸死的情况和输入非法坐标的情况。当输入没有被炸死的情况的时候,我们第一是要求显示x,y坐标周围的八个坐标中有几个雷。这里我们可以设置一个新函数GetMineCount,在选的周围的八个位置中的坐标所含有的炸弹次数加起来;我们知道字符0所对应的ASKII码值是48,以此类推我们可以算出坐标周围炸弹的数量(因为我们所设置的炸弹的字符为1)。最关键的点在于,这种类似于九宫格的坐标我们需要会算。就是以中间的为初始的坐标,向周围来拓展。
//下面是八个坐标加起来的值
int GetMineCount(char mine[ROWS][COLS],int x, int y)
{
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1]-8*'0';
}
这样,代码还存在一个漏洞:我们只有在炸到雷的地方才能break,排查完雷没有地方可以点的时候(只剩雷)这样是没办法停止游戏。这里我们可以再FindMine里面int win,我们排查一次雷就可以win++,直到全部的雷排查完,可以显示出排雷成功~还存在的一个漏洞是由于刚开头,我们的随机数随机生成的,可能当开始就会点到雷哦qwq
然后这样之后,我们要屏蔽到之前的DisplayBoard,这样就屏蔽掉最开始显示的有雷的界面了,就可以直接开始游戏了~