文章目录
前言
如何使用C语言完成扫雷游戏(基础版)可以看我的上一篇文章:http://t.csdn.cn/vSZKz
在上一篇文中,利用C语言实现了扫雷的基本功能,包括扫雷游戏界面初始化,布置雷,排查雷,显示界面。在这篇文章中,将介绍实现扫雷游戏进阶版,与基础版相比,进阶版添加了两个功能,1.展开的功能、2.标记雷的功能。
一、展开
在扫雷游戏中,选中的坐标周围如果有雷,则显示坐标周围雷的数目;如果坐标周围没有雷,则会一次性展开多个坐标,直至雷的坐标附近。可以使用递归来实现这一功能。
要注意的一点是递归的过程中需要传递参数count(用来计数,终止循环),在展开函数open()中的形参count和在排查雷函数findmine()中的实参count计数要相互统一,所以在传参时传递的是count的地址,这一部分内容以后会专门介绍。
void open(char mine[ROWS][COLS], char show[ROWS][COLS],
int x, int y, int row,int col,int* count)
{
int ret = get_ret(mine, x, y);
if (ret == 0)
{
show[x][y] = ' ';
(*count)--;
int i = 0;
int j = 0;
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
if ((x+i) >= 1 && (x+i) <= row && (y+j) >= 1 && (y+j) <= col&&show[x+i][y+j]=='*')
{
open(mine, show, x + i, y + j, row, col,count);
}
}
}
}
else
{
show[x][y] = ret + '0';
(*count)--;
}
}
二、标记雷
如果认定某一坐标上存放的是雷,可以用‘+’进行标记,对于被标记的坐标,该坐标不可被直接选中,必须取消标记后才能重新被选中。标记雷的部分在代码中已经标注出来了,按1进入标记雷的模式,按2进入取消标记的模式。
以下代码是在扫雷(基础版)的排查雷函数findmine()上加以修改的:
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col)
{
int x = 0;
int y = 0;
int count = row*col-mine_count;
while (count)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if ((x >= 1 && x <= row)&&(y >= 1 && y <= col)&&show[x][y]=='*')
{
if (mine[x][y] == '0')
{
open(mine, show, x , y , ROW, COL,&count);
display(show, ROW, COL);
//标记雷
int intput = 0;
printf("请输入是否需要标记\n");
scanf("%d", &intput);//1标记;2取消标记
if (intput==1)
{
int x = 0;
int y = 0;
printf("请输入要标记雷的坐标:");
scanf("%d%d", &x, &y);
if (show[x][y] == '*')
{
show[x][y] = '+';
display(show, ROW, COL);
}
else
{
printf("非法坐标\n");
}
}
if (intput == 2)
{
int x = 0;
int y = 0;
printf("请输入要取消标记雷的坐标:");
scanf("%d%d", &x, &y);
if (show[x][y] == '+')
{
show[x][y] = '0';
display(show, ROW, COL);
}
else
{
printf("非法坐标\n");
}
}
//标记雷
}
else
{
printf("地雷炸了\n");
display(mine, ROW, COL);
break;
}
}
else
{
printf("非法输入,请重新输入\n");
}
}
if (count == 0)
{
printf("恭喜你,游戏胜利\n");
display(mine, ROW, COL);
}
3. 头文件
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 5
void initboard(char board[ROWS][COLS], int rows, int cols, char set);//初始化
void display(char board[ROWS][COLS], int row, int col);//显示函数
void setmine(char board[ROWS][COLS], int row, int col);//布置雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷
总结
本篇文章介绍的是进阶础的扫雷游戏,在基础版的扫雷游戏中加入了两个功能。1.如果选中的坐标周围没有雷,周围的格子会连续展开;2.标记地雷。
那么今天的学习就到这里了。同学们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位同学们的支持。代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻,有问题可以随时私信我。
最后推荐大家学习C语言!!!
c语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。