实现过程
对于用C语言实现扫雷游戏得实现,可将游戏过程分为两个板块。
- 实现游戏关键功能得函数
- 搭建合理得游戏过程
实现游戏关键功能
为了将游戏功能方便管理和键入,首先我们创建一个头文件,
mine.h
对游戏功能进行声明。
然后创建对应的源文件mine.c
对这些函数进行定义。
对于游戏功能,我们首先想到的是构建一个目标规格的雷盘,也就是二维数组。
为了使游戏更具可玩性,所以雷盘的规格应可以自定义。所以在mine.h
头文件中,应先用define定义ROW(行)和列(列)的标识符便于自定义。
#define ROW 15 //先将他们的规格定义为15*15
#define COL 15
#define ROWS ROW+2
#define COLS COL+2
为什么要定义后面两个宏?
对于雷盘的的核心功能实现,必然是能够当玩家选择坐标以后(若该位置不是雷)能够精确的统计以该坐标为核心周围九宫格雷的个数,那么处于边界的地方该如何精准的判断呢?
所以将真正的雷盘数组规格定义ROW+2,COL+2大小,在ROW,COL规格的雷盘中随机置雷,使得游戏结果准确。
定义雷盘和显示盘的初始化
定义两同规格的二维数组,前者是真正的雷区,用‘1’和‘0’来表示雷和无雷,后者是显示区,用于玩家操作和结果显示。
void init(char arr[ROWS][COLS], int rows, int cols, char type) //memset批量操作时传入的是指针,即数组开始地址
{
memset(arr, type, rows*cols * sizeof(mine[0][0]));
}
- 在显示区随机放置雷
void setmine(char mine[ROWS][COLS], int count)
{
srand((unsigned)time(NULL));
int i = 0;
int j = 0;
while (count)
{
i = (rand() % ROW) + 1; //让随机值0-9变成1-10 实现操作区随机放雷
j = (rand() % COL) + 1;
if (mine[i][j] == '0')
{
mine[i][j] = '1';
count--;
}
}
}
- 打印界面
void display(char board[ROWS][COLS])
{
//从第一行一列开始打因元素
int i = 0;
int j = 0;
printf("\n |");
for (i = 1; i <= COL; i++)//打印操作区的列号
{
printf("%4d", i); //打印序号
}
printf("\n");
printf("------|------------------------------------------\n");
for (i = 1; i <= ROW; i++)
{
printf("%4d |", i);//打印序号
for (j = 1; j <= COL; j++)
{
printf("%4c", board[i][j]);
}
printf("\n \n");
}
}
- 统计目标点周围雷的个数
int cal_mine(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y - 1] + mine[x - 1][y]
+ mine[x - 1][y + 1] + mine[x][y - 1]
+ mine[x][y + 1] + mine[x + 1][y - 1]
+ mine[x + 1][y] + mine[x + 1][y + 1] - (7 * '0'));//这里减7而不是8。因为这样直接可以表示出数字字符
//此处的目的是统计周围雷的个数,又因为是ASCII码,'1'和'0'只相差1,然后进去’0'的ASCII值得到1的个数
}
- 如果目标点周围无雷向外扩展
在扫雷游戏过程中必然会出来一点一大片凹陷的强烈快感,但自己实现的过程中这是如何做到的呢?
原则是如果该点周围无雷,那么将用