扫雷规则简介
实现扫雷前,我们先来看看扫雷的玩法:在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家逐个翻开方块,以找出所有地雷为最终游戏目标,若打开的方块没有雷,则会出现一个数子用于统计该空格附近雷的数量。
这次呢,博主会带领大家完成一个初级的扫雷游戏(9*9),这次博主依旧如前面三子棋游戏实现一样,采用三个文件
game.h 里包含了我们这次所需要的头文件
game.c 里是我们游戏的具体实现
test.c 是我们的一个游戏测试
游戏主界面
作为一个游戏,我们肯定的有一个界面,让使用者知道这是干什么,那我们先写一个主界面吧:
1. void meanu() 2. { 3. printf("*************************\n"); 4. printf("****** 扫雷游戏 ******\n"); 5. printf("****** 1.玩游戏 ******\n"); 6. printf("****** 2.退出游戏 ******\n"); 7. printf("*************************\n"); 8. }
主界面代码实现如下:
主界面都实现了,我们肯定的有一个主函数;那么主函数我们应该怎么写呢?
我们在有了三子棋经验后,便知道这个游戏我们需要可以选择,只要不退出可以满足多次游戏,那么我们便可以写出代码了
1. int main() 2. { 3. int input = 0; 4. meanu(); 5. srand((unsigned int)time(NULL));//与rand()搭配使用,用于产生随机数 6. printf("请选择>:"); 7. do 8. { 9. scanf("%d",& input); 10. switch (input) 11. { 12. case 1: 13. game(); 14. break; 15. case 2: 16. printf("退出游戏"); 17. break; 18. default:printf("非法输入,请重新输入"); 19. } 20. } while (input != 2); 21. return 0; 22. }
主界面和主函数的成功实现,那么我们test.c就可以写出来了
1. #include "game.h" 2. 3. void meanu() 4. { 5. printf("*************************\n"); 6. printf("****** 扫雷游戏 ******\n"); 7. printf("****** 1.玩游戏 ******\n"); 8. printf("****** 2.退出游戏 ******\n"); 9. printf("*************************\n"); 10. } 11. 12. int main() 13. { 14. int input = 0; 15. meanu(); 16. srand((unsigned int)time(NULL)); 17. printf("请选择>:"); 18. do 19. { 20. scanf("%d",& input); 21. switch (input) 22. { 23. case 1: 24. game(); 25. break; 26. case 2: 27. printf("退出游戏"); 28. break; 29. default:printf("非法输入,请重新输入"); 30. } 31. } while (input != 2); 32. return 0;
头文件
为了防止每次使用函数前都需要声明,所以我们将所有需要的声明和头文件都放在了game.h里面
我们先来看一下所需要用的game.h内容
1. #include <stdio.h> 2. #include <stdlib.h> 3. #include <time.h> 4. 5. #define ROW 9 //进行宏定义 6. #define COL 9 // 7. #define ROWS ROW+2 // 8. #define COLS COL+2 // 9. #define cnt 10 10. 11. //初始化棋盘 12. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); 13. //打印棋盘 14. void DisplayBoard(char board[ROW][COL], int row, int col); 15. //布置雷场 16. void SetMine(char board[ROWS][COLS], int row, int col); 17. //排查雷 18. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
在game.h里面我们看到了一些函数的声明,而他们就是我们等会儿需要在game.c里逐一实现函数,接下来看看博主是怎么实现的吧
初始化棋盘
首先我们得先创建数组,博主用的是创建两个二维数组的方式,创建如下
1. char mine[ROWS][COLS];//用来储存含‘0’和‘1’的棋盘,含雷盘 2. char show[ROWS][COLS];//用来储存玩家所看见的棋盘
至于为什么这儿用ROWS和COLS,而不用row和col,主要是为了方便雷数量的判断,后面还会有介绍。
这里初始化时,因为我们mine[ROWS][COLS]里存放的是雷,而我们这里用‘0’和‘1’来表示,‘1’表示雷,而这里初始化时因为没有雷,我们全部初始化为‘0’;show[ROWS][COLS]是展示给玩家的,我们给它全部初始化为‘*’;
InitBoard()函数代码如下
1. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) 2. { 3. int i = 0; 4. for (i = 0; i < rows; i++) 5. { 6. int j = 0; 7. for (j = 0; j < cols; j++) 8. { 9. board[i][j] = set; 10. } 11. } 12. }
当我们需要使用时,只需要传入我们所需初始化的参数就行
1. InitBoard(mine,ROWS,COLS,'0'); 2. InitBoard(show, ROWS, COLS, '*');
打印棋盘
我们希望玩家在选择玩游戏后,可以给玩家打印出以下这样一个棋盘
这个棋盘包含行和列的编码,显示的时9*9,顶上有扫雷游戏的提示,打印的是‘*’,获取这些信息,便可以写出代码如下
1. void DisplayBoard(char board[ROWS][COLS], int row, int col) 2. { 3. int i = 0; 4. printf("*****扫雷游戏******\n");//打印扫雷 5. for (i = 0; i <=col; i++)//打印列的编号 6. { 7. printf("%d ", i); 8. } 9. printf("\n"); 10. for (i = 1; i <= row; i++) 11. { 12. printf("%d", i);//打印行的编号 13. int j = 1; 14. for (j = 1; j <= col;j++) 15. { 16. printf(" %c", board[i][j]); 17. } 18. printf("\n"); 19. } 20. } 21. //i和j从1开始,等于row、col结束,这里传进来的是ROW、COL,也就是9 22. //是为了打印9*9的棋盘
传参如下
DisplayBoard(show, ROW, COL);//打印9*9的棋盘