007 【编程之路扫雷游戏】(C语言实现)

目录
引言
菜单的打印
初始化棋盘
棋盘的打印
布置雷区
确定周围雷数量值
标记雷
取消标记
递归展开空白安全区
统计被正确标记的雷数
扫雷的具体过程
源码
引言
扫雷这个游戏想必大家都不陌生 。如果你知道扫雷游戏的规则,那么你可以跳过这一段,直接到main函数的整体逻辑这里开始 。如果你还不知道扫雷怎么玩,我也给你复制好了游戏规则 。
胜利条件:
在一个9*9方块矩阵中随机布置一定量的地雷10个 。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标 。如果玩家翻开的方块有地雷,则游戏结束 。
游戏主区域由很多个方格组成 。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷 。
在判断出不是雷的方块上按下左键(我们的是输入坐标),可以打开该方块 。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数,一般为8个格子,对于边块为5个格子,对于角块为3个格子 。所以扫雷中最大的数字为8;如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束 。
main函数的整体逻辑
int main(){srand((unsigned int)time(NULL));//暂时不管int choice = 0;do{printf("游戏介绍:\n");printf("输入 1 为开始游戏,输入 0 为退出游戏\n");printf("游戏最终的胜利即为把全部的雷标记出来\n");menu();printf("请选择\n");scanf("%d", &choice);switch (choice){case 1:{game();break;}case 0:{printf("游戏退出\n");break;}default:{printf("选择错误,重新选择\n");break;}}} while (choice);return 0;}

007  【编程之路扫雷游戏】(C语言实现)

文章插图
这里的逻辑与上一篇三子棋【编程之路(006)三子棋游戏】(C语言实现)的博客-CSDN博客一样,也很简单,如果不太明白,可以点击链接进去看看 。接下来我们便实现游戏各个函数的功能 。
菜单的打印
void menu(){printf("************************\n");printf("*****1.play*****\n");printf("*****0.exit*****\n");printf("************************\n");}
初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch){int i = 0, j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = ch;}}}
这里要注意的是我们扫雷游戏其实是有两个棋盘(二维数组实现)的 。一个是玩家玩的棋盘界面;另一个是我们布置雷区的棋盘 。有了整体的把控,我们对于游戏的实现便有了大致的方向 。
由于扫雷要探索周围一圈的区域,也就是八个格子,对于中间的格子还好,我们可以很好的表示,但是对于边缘和四角的的格子,我们探索周围就会出现越界的情况(如下图) 。解决方法是直接定义比棋盘规模多两行的行列 。如9*9的规模我们便定义成(9+2)*(9+2)的规模 。先说明ROWS和COLS是9+2的规模,ROW和COL是9的规模 。那么为什么还要多次一举定义出ROW和COL呢,那是因为虽然我们的规模大,但还是有很多操作是需要用到9*9的 。接下来其他功能的实现便可以很直观的看到 。
棋盘的打印
void Display(char board[ROWS][COLS], int row, int col){printf("-------------------\n");int i = 0, j = 0;for (j = 0; j <= col; j++)//这个for循环是打印棋盘的列坐标{printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//这一行语句是打印棋盘的行坐标for (j = 1; j