一,游戏规则
1.输入9*9的格的坐标(*显示其坐标未被选择过)(共有10颗雷)
2.如果是雷,游戏结束
3.如果不是,将显示所点击的位置相邻八个位置有几颗雷
4.若除了雷位未选后,玩家胜利
例:(有80颗雷)
------------------------------------------------------------------1.play 0.exit----------------------------------------------------------------------请输入(0/1):3输入错误,请重新输入------------------------------------------------------------------1.play 0.exit----------------------------------------------------------------------请输入(0/1):1扫雷游戏开始0 1 2 3 4 5 6 7 8 91 * * * * * * * * *2 * * * * * * * * *3 * * * * * * * * *4 * * * * * * * * *5 * * * * * * * * *6 * * * * * * * * *7 * * * * * * * * *8 * * * * * * * * *9 * * * * * * * * *//有雷的为10 1 2 3 4 5 6 7 8 91 1 1 1 1 1 1 1 1 12 1 1 1 1 1 1 1 1 13 1 1 1 1 1 1 1 1 14 1 1 1 1 1 1 1 1 15 1 1 1 1 1 1 1 1 16 1 1 1 1 1 1 1 1 17 1 1 1 1 1 1 1 1 18 1 1 1 1 1 1 1 1 19 1 1 1 1 1 1 1 1 0请输入坐标(行 列):9 90 1 2 3 4 5 6 7 8 91 1 1 1 1 1 1 1 1 12 1 1 1 1 1 1 1 1 13 1 1 1 1 1 1 1 1 14 1 1 1 1 1 1 1 1 15 1 1 1 1 1 1 1 1 16 1 1 1 1 1 1 1 1 17 1 1 1 1 1 1 1 1 18 1 1 1 1 1 1 1 1 19 1 1 1 1 1 1 1 1 0恭喜你游戏成功------------------------------------------------------------------1.play 0.exit----------------------------------------------------------------------请输入(0/1):1扫雷游戏开始0 1 2 3 4 5 6 7 8 91 * * * * * * * * *2 * * * * * * * * *3 * * * * * * * * *4 * * * * * * * * *5 * * * * * * * * *6 * * * * * * * * *7 * * * * * * * * *8 * * * * * * * * *9 * * * * * * * * *0 1 2 3 4 5 6 7 8 91 1 1 1 1 1 1 1 1 12 1 1 1 1 1 1 1 1 13 1 1 1 1 1 1 0 1 14 1 1 1 1 1 1 1 1 15 1 1 1 1 1 1 1 1 16 1 1 1 1 1 1 1 1 17 1 1 1 1 1 1 1 1 18 1 1 1 1 1 1 1 1 19 1 1 1 1 1 1 1 1 1请输入坐标(行 列):8 7很遗憾,你被炸死了,游戏结束0 1 2 3 4 5 6 7 8 91 1 1 1 1 1 1 1 1 12 1 1 1 1 1 1 1 1 13 1 1 1 1 1 1 0 1 14 1 1 1 1 1 1 1 1 15 1 1 1 1 1 1 1 1 16 1 1 1 1 1 1 1 1 17 1 1 1 1 1 1 1 1 18 1 1 1 1 1 1 1 1 19 1 1 1 1 1 1 1 1 1------------------------------------------------------------------1.play 0.exit----------------------------------------------------------------------请输入(0/1):0退出游戏
二,游戏代码分析
1.设置游戏菜单,让玩家选择
输入1,游戏开始
输入0,游戏结束
输入其他值,提示输入错误,重新输入
void mnue(){ printf("-------------------------------\n"); printf("-------------------------------\n"); printf("----1.play 0.exit--------\n"); printf("-------------------------------\n"); printf("-------------------------------\n");}void test(){ int input = 0; srand((unsigned int)time(NULL)); do { mnue(); printf("请输入(0/1):"); scanf("%d", &input); switch (input) { case 1: printf("游戏开始\n"); game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input);}int main(){ test(); return 0;}
游戏效果:
2.由于输入坐标后,如果没踩雷,要显示周围八个位置共有几颗雷,为了防止数组的溢出选用11*11的棋盘
将字符‘0’放入不是雷的位置中
将字符‘1’放入是雷的位置中
所以将创造两个数组
1.一个数组将存储雷的信息
2.另一个数组排查出的雷的信息
一个数组初始化为‘0’
一个数组初始化为‘*’
函数的初始化
注意:设置一个变量用来接收初始化的结果,可以使不同的二维数组初始化为不同的值
void InitBoard(char board[ROWS][COLS], int row, int col, char set){ int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = set; } }}
3.函数的打印函数
注意打印的是9*9的棋盘
为了便于阅读,将坐标也打印了出来
void DisplayBoard(char board[ROWS][COLS], int row, int col){ int i = 0; for (i = 0; i <= col; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); int j = 0; for (j = 1; j <= col; j++) { printf("%c ",board[i][j]); } printf("\n"); }}
4.随机布置10个雷
将有10个雷要布置
将雷设为字符‘1’
一个数%9那么这个数在0到8之间
若再加一那么这个数将在1-9之间
void SetMine(char board[ROWS][COLS], int row, int col){ int x = 0; int y = 0; int count = EASY_COUNT; while (count) { x = rand() % row + 1;//1-8+1//1-9 y = rand() % col + 1;//1-8+1//1-9 if (board[x][y] == '0') { board[x][y] = '1'; count--; } }}
5.扫雷
字符3与字符0差数字3
计算周围8个(炸弹)数组元素为1的方法:
将8个字符元素相加-8个字符0得到的就是字符1的个数
因为返回值是int,所以需要加上字符0,转化为char
//'3'-'0'=3//'4'-'0'=4int get_mine_count(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] - 8 * '0';}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){ printf("请输入坐标(行 列):"); int x = 0; int y = 0; scanf("%d%d", &x, &y); int win = 0;//从0开始计数 while (win<col * row - EASY_COUNT)//下的次数小于9*9-10=71次时都未踩到炸弹 { //坐标合法 if (x > 1 && x <= row && y > 1 && y <= col) { if (mine[x][y] == '1')//踩雷 { printf("很遗憾,你被炸死了,游戏结束\n"); DisplayBoard(mine, ROW, COL); break; } else//计算周围八个位置的雷数 { int count = get_mine_count(mine, x, y); show[x][y] = count+'0';//存的是字符,返回值是int DisplayBoard(mine, ROW, COL); win++; } } //坐标非法 else printf("输入错误坐标,请重新输入:\n"); } //两个情况 //1.break; //2. win == col * row - EASY_COUNT if (win == col * row - EASY_COUNT) printf("恭喜你游戏成功\n");}
三,用文件实现
test.c源文件中的内容
调用函数时记得要引头文件(函数的声明一般放在相应的头文件中)
菜单函数
游戏的流程控制
游戏的流程
game.h头文件的内容
1.行,列
2.雷的个数
3.所用到的头文件
4.函数的声明
game.c源文件中的内容
调用函数时记得要引头文件(函数的声明一般放在相应的头文件中)
函数的初始化
棋盘的打印
雷设置的位置
周围8个位置中雷数的总和
扫雷流程