2.4 布置雷
在game.h文件中先定义全局变量EASY_COUNT,控制雷的数量
#define EASY_COUNT 10
在布置雷时,要先生成随机坐标,然后判断该坐标是否可以放雷
- 用rand函数产生随机值
- 每一个格子只能存放一个雷,前面初始化棋盘时,已经将所有的格子(11x11)全初始化为’0’,所以在布置雷,只能在为’0’的格子中存放
//game.c void SetMine(char board[ROWS][COLS], int row, int col) { //布置雷 //生成随机的坐标,布置雷 int count = 10; while (count) { int x = rand() % row + 1;//为了控制随机值大小,防止越界,范围:1-9 int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } }
🍤 调用头文件:
//game.h #include<stdlib.h> #include<time.h>
2.5 排除雷
玩游戏选择坐标时,会有三种结果:
1. 选择存放了雷的坐标,游戏结束
玩家先输入坐标,该坐标行列大小在定义的范围内,然后判断是否是存放了雷的坐标。
在之前我们已经初始化了所有位置都是‘0’,只有随机存放了雷的位置,会变为‘1’,而当输入的坐标的内容为‘1’时,即玩家踩雷了,游戏结束。
2. 选择了安全的坐标,且显示周围8个坐标的雷的数量
如果输入的坐标的内容为‘0’,则计算出周围8个位置的雷的数量,并打印在此坐标上。
在这里,我们用GetMineCount函数单独计算,返回雷的数量
假设已知坐标x,y,其他周围的坐标就可以表示为:
🍤 代码实现:
//game.c int GetMineCount(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'); }
🍩游戏胜利的实现
定义一个变量win,在每次选择非雷的坐标后累加1,当win=棋盘总个数(9x9)-存放了雷的个数,即win==row* col - EASY_COUNT,也就排除了所有的雷,游戏胜利。
3. 坐标选择错误
当我们选择的行列坐标超出设定的范围,就提示玩家输入错误,重新输入。
printf("坐标非法,重新输入!\n");
2.5.1 代码实现
//game.c void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0, y = 0; int win = 0; while (win<row*col-EASY_COUNT) { printf("请输入要排查的坐标,如:1 2:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,你被炸死了"); DisplayBoard(mine, ROW, COL); break; } else { int count=GetMineCount(mine, x, y);//统计周围8个位置的雷的数量 show[x][y] = count + '0'; DisplayBoard(show, ROW, COL); win++; } } else { printf("坐标非法,重新输入!\n"); } } if(win == row* col - EASY_COUNT) { printf("恭喜你,排雷成功…^-^…"); DisplayBoard(mine, ROW, COL); } }
3. 总结
3.1 game.h文件所有内容
#include<stdlib.h> #include<time.h> #include<windows.h>//声明Sleep函数 #define EASY_COUNT 10 #define ROW 9 #define COL 9 #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 board[ROWS][COLS], int row, int col); //排查雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
3.2 game()游戏函数整体
//test.c void game() { char mine[ROWS][COLS];//存放布置好的雷 char show[ROWS][COLS];//存放排查出的雷的信息 //初始化棋盘 //1.mine数组最开始全‘0’、 //show数组最开始全‘*’ InitBoard(mine,ROWS,COLS,'0'); InitBoard(show,ROWS,COLS,'*'); //打印棋盘 DisplayBoard(show, ROW, COL); //1.布置雷 SetMine(mine,ROW,COL); //2.排查雷 FindMine(mine, show, ROW, COL); }
🍩注: 每一个.c文件最前面,需要用 #include "game.h" 进行声明