一. 1.老规矩,扫雷游戏也是用模块化加自定义函数实现,也是先写出一个大概框架与流程,前期实现可以看我三子棋的博文 http://t.csdn.cn/uMeOc ,因为是上来就要打印菜单,所以使用do while循环
void menu()
{printf("******************\n");printf("***** 0.exit *****\n");printf("***** 1.play *****\n");printf("******************\n");
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>"); scanf("%d", &input);switch (input){case 1:game();//扫雷游戏break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);//用是否为0来当作判断条件return 0;
}
2.然后就是游戏流程啦,首先我们用两个数组来存放,一个放是否是雷,另一个是玩家玩的时候用来显示出现的数据 3.然后就是初始化,打印,布置,排查,这么些个流程,这里需要注意的是因为扫雷输入坐标后显示的是周围一圈有几个雷,但是如果在数组的边界查一圈不就越界了吗,所以原本计划9×9变成11×11,初始化依旧用标识符常量,ROWS = ROW+2;COLS同理
void game()
{char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息char show[ROWS][COLS] = { 0 };//存放排查出来雷的信息//初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//排查雷FindMine(mine,show,ROW,COL);
}
4.接下来是初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set )
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
5.打印棋盘,这里需要打印出对应得行列号以便于玩家输入坐标
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----------扫雷游戏------------\n");//打印列号for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//打印列号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----------扫雷游戏------------\n");}
6.现在是布置雷,因为是随机布置,所以需要用到rand函数,用0和1来表示非雷和雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{//布置10个雷int count = EASY_COUNT;while (count){//生成随机的下标int x = rand()%row+1;int y = rand()%col+1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}
7.接下里是统计这个输入的坐标周围一圈有几个雷,这样子就可以返回有多少个雷
get_mine_count(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +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';
}
8.接下来是最重要的排查雷与判断胜负
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.输入排查坐标//2.检查坐标// (1)如果是雷 = 很遗憾,你被炸死了// (2)不是雷 = 统计周围有几个雷到show数组,游戏继续int x = 0;int y = 0;int win = 0;while (win<row*col- EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);//x(1,9),y(1,9)//判断坐标的合法性if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");printf("\n");printf("\n");DisplayBoard(mine, ROW, COL);break;}else{//统计想(x,y)周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';//显示排查出的信息DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标不合法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");printf("\n");printf("\n");DisplayBoard(mine, ROW, COL);}
}
最后分出胜负在打印布置雷的图,可以赢得明白
三. 1.最后就是头文件啦,里面有头文件的包含,函数声明,标识符常量定义
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 9
#define COL 9
#define EASY_COUNT 10#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col); //布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col);