前一段突然发生了一些事情,因此耽搁到现在,为此感到深感抱歉,我也会接着之前的进度来自己鼓励自己去学习。
今天接着上次三子棋游戏的实现的热度,写一个简单的扫雷游戏,基本上可以说是跟三子棋差不多,主要运用的也是多维数组等一系列知识,下面开始我们的正文介绍:
最开始创建的也是菜单部分,毕竟菜单是一个功能的直观表现,跟上次三子棋一样,运用系统自带的menu函数和do while,switch语句循环完成构建,紧接着就来到了我们核心部分,游戏实现部分。
首先就是扫雷棋盘的创建,通过for循环语句建立最基本的初始棋盘,代码如下:
void InitBoard(char board[Hang1][Lie1], int hang1, int lie1, char ret)
{
int i = 0;
int j = 0;
for (i = 1; i < hang1; i++)
{
for (j = 1; j < lie1; j++)
{
board[i][j] = ret;
}
}
}
上面传的ret的值是根据后面而定,因为棋盘需要做出两个一个是上帝视角,一个属于游戏视角,创建一个变量能很好的看见后期设置雷的位置。
为了更好的让玩家操作,接下来也就是打印这个所建立的棋盘,如下所示:
void DisplayBoard(char board[Hang1][Lie1], int hang, int lie)
{
int i = 0;
int j = 0;
printf("----扫雷游戏----\n");
for (i = 0; i <= hang; i++) //打印行号
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= hang; i++)
{
printf("%d ", i); //打印列号
for (j = 1; j <= lie; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("----扫雷游戏----\n");
}
通过简单的for循环语句给棋盘上的位置加了编号能进行更好的操作。
接下来就是一些核心的书写了,如何设置雷,根据之前的学习我们知道要想让系统产生随机数就需要用到rand函数,这里我们不需要雷进行时刻变化,所以就不需要设置跟他配套的srand函数,直接让系统生成雷就好了,代码如下图所示:
void SetLie(char mine[Hang1][Lie1], int hang, int lie)
{
int count = Lie;
while (count)
{
int x = rand() % hang + 1;
int y = rand() % lie + 1;
if (mine [x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
这里面我用1代表雷,为了接下来的计算,扫雷我们都知道,如果点开一个地方,周围有多少雷上面就会显示多少数字,这时候用1来表现雷就恰当好处,因为只要系统把点开位置的周围算一下有几个雷一相加就会自动出现数字,这也是用数字1代表雷的一个妙用,当然要记得用的是字符1,代码如下:
int zhouwei(char mine[Hang1][Lie1], int x, int y)
{
return mine[x - 1][y] + //因为设置雷为'1'
mine[x - 1][y - 1] + //所以计算周围8个里有几个'1'
mine[x][y - 1] + //相加8个位置的字符再减去'0'
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'; //得到对应数字
}
字符我们都知道,他都会有对应的ASCII码,显示的都是ASCII码的数值,所以都需要减去0,以此得到最终想要的数字。
接下来就是游戏的操作了,首先游戏你需要知道自己什么时候赢,什么时候输,输就是你所选的位置和雷一样,系统就会提示输了,那么赢呢?其实也不难我们只需要设置一个函数,用它来计算我们所点开的位置次数,当次数和棋盘行列数-雷数相等的时候,我们就知道我们赢了,详细代码如下:
void FindLie(char mine[Hang1][Lie1], char show[Hang1][Lie1] , int hang, int lie)
{
int x = 0;
int y = 0;
int ret = 0;
int win = 0;
while (win<hang*lie-Lie)
{
printf("请输入排查坐标:");
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= hang && y >= 1 && y <= lie)
{
if (mine[x][y] == '1')
{
printf("你输了,雷如图所示\n");
DisplayBoard(mine, Hang, Lie);
break;
}
else
{
ret=zhouwei(mine,x,y);
show[x][y] = ret+'0'; //原位置存的为字符0,ASCLL为48,1+'0'='1'
DisplayBoard(show, Hang, Lie);
win++;
}
}
else
{
printf("输入有误,请重新输入\n");
}
if(win== hang * lie - Lie)
{
printf("你赢了\n");
DisplayBoard(mine, Hang, Lie);
}
}
}
上述代码有一件比较麻烦的就是显示棋盘的转变,需要我们进行在点开棋盘到时候显示出来如上述所示就ok了,有了三子棋的基础做一个简单的扫雷其实也是很简单的。