扫雷小游戏
游戏思路
游戏编写
1.test.c 测试游戏逻辑 2. game.c游戏代码实现 3. game.h游戏代码声明
1. 游戏思路:
两个雷盘,其一用于布置雷(玩家不可见)
另一个用于扫雷,并计算所排查位置周围存在雷的数目
//存放布置雷的信息 char mine[ROWS][COLS] = { 0 };
将10个雷随机存放在中间 99格子里
而之所以使用 1111的棋盘,是因为以此可便于每次扫雷之后计算周围8个格子里存在雷的数目
例如 排查第一行第八列时,若是使用99的棋盘,在计算周围八个格子里存在的雷时就会产生越界。而使用1111的棋盘可以巧妙解决这个问题
//存放排查雷的信息 char show[ROWS][COLS] = { 0 };
在每次排查某个格子时,会自动把这个格子周围八个格子里存放雷的个数,以数字字符形式存放在这个格子里
例如。接这个上面的情景,在第一行第八列的格子里,此时存放的便是’2‘,其余情景于此相似。
2. 游戏编写
1.test.c
1.1 引头文件
#include"game.h"
1.2 主函数
#include"game.h" int main() { int input = 0; srand((unsigned int)time(NULL));//设置随机数起点 do { menu(); //打印菜单 printf("请选择>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }
1.3 打印菜单
void menu() { printf("********************************\n"); printf("********** 1.play *********\n"); printf("********** 0.exit *********\n"); printf("********************************\n"); }
1.4 游戏逻辑
void game() { //设置雷的雷盘 char Mineboard[ROWS][COLS] = { 0 }; //排查雷的雷盘 char Showboard[ROWS][COLS] = { 0 }; //初始化雷盘 //将初始化的内容也传递给函数Initboard //避免产生歧义 //mine 在没有布置雷的位置 全为 ‘0’ Initboard(Mineboard, ROW, COL, '0'); //show 在没有排查雷的位置 全为 ‘*’ Initboard(Showboard, ROW, COL, '*'); //设置雷的位置 //虽然棋盘大小为11*11,但只在中间9*9内设置雷的位置 Setmine(Mineboard, ROW, COL); //打印排查雷的信息 //第一次执行时并未进行扫雷,此时运行全为* Displayboard(Showboard, ROW, COL); //扫雷 //这里将两个雷盘都传递给函数Findmine() //1.传递mine,是为了在其上面完成扫雷 //2.传递show,是为了在扫雷之后,把这个坐标周围 //存在雷的个数存放show中 Findmine(Mineboard, Showboard, ROW, COL); }
2.game.c
2.1 引头文件
#include"game.h"
2.2 初始化雷盘
//ch 在这里即代表’0‘,也代表’*‘ void Initboard(char board[ROWS][COLS], int row, int col, char ch) { int i = 0; int j = 0; for (i = 0; i <= row; i++) { for (j = 0; j <= col; j++) { board[i][j] = ch; } } }
2.3 打印雷盘
void Displayboard(char board[ROWS][COLS], int row, int col) { printf("************扫雷游戏**********\n"); int i = 0; int j = 0; //打印列数,起点为0 for (j = 0; j <= col; j++) { printf("%d ", j); } printf("\n"); for (i = 1; i <= row; i++) { //打印行数,起点为1 printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("************扫雷游戏**********\n"); }
2.4 设置雷的位置
void Setmine(char board[ROWS][COLS], int row, int col) { //游戏中存在雷的总数为 mine_number int count = mine_number; while (count) { //行数范围 1-9 //列数范围 1-9 int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; //每完成一次雷的设置,count--, //直到count==0为止 count--; } } }
2.5 扫雷
int get_mine(char board[ROWS][COLS], int x, int y) { return (board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] - 8 * '0'); } void Findmine(char Mineboard[ROWS][COLS], char Showboard[ROWS][COLS], int row, int col) { int x = 0; int y = 0; //找到不是雷的个数 //当 win==row*col-mine_number 时,代表玩家胜利 int win = 0; while (win<row* col - mine_number) { printf("输入需要排查的坐标>"); scanf("%d%d", &x, &y); //判断坐标是否重复排查 if (Showboard[x][y] != '*') { printf("坐标已被排查,不可重复操作\n"); } else { //判断坐标是否合法 if (x >= 1 && x <= row && y >= 1 && y <= col) { //判断是否踩雷 //如果是雷 if (Mineboard[x][y] == '1') { printf("很遗憾,游戏结束\n"); //打印设置雷的最终结果 Displayboard(Mineboard, ROW, COL); break; } //如果不是雷 //计算board[x][y]周围雷的个数 else { win++; int number = get_mine(Mineboard, x, y); //转换成数字字符 Showboard[x][y] = number + '0'; //打印排查雷的结果 Displayboard(Showboard, row, col); } } else { printf("坐标非法,请重新输入\n"); } } } if (win == row * col - mine_number) { printf("恭喜扫雷成功!\n"); } }
如何计算某个格子周围存在雷的数目?
例如某格子,坐标为[x][y]
因为在mine()中,雷存在的位置存放的是字符’1‘,否则存放的则为字符’0‘
若是使用if语句一个个去判断太过繁琐
换个角度,将周围八个坐标里的字符全部加在一起,然后减去8*’0‘, 得到的数值便是,周围雷的个数。最后再加上’0‘转换成数字字符存放到show中
3.game.h
函数声明
#include<stdio.h> //使用srand(),rand()函数需引用头文件 #include<stdlib.h> //使用time()函数需引用头文件 #include<time.h> //define定义的常量,可通改变ROW,COL的数值来控制雷盘的大小 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 //定义雷的数目 #define mine_number 10 //初始化雷盘 void Initboard(char board[ROWS][COLS], int row, int col, char ch); //打印雷盘 void Displayboard(char board[ROWS][COLS],int row,int col); //设置雷盘 void Setmine(char board[ROWS][COLS], int row, int col); //扫雷 void Findmine(char Mineboard[ROWS][COLS], char Showboard[ROWS][COLS], int row, int col);








