> 文档中心 > C语言实现扫雷(完整版)

C语言实现扫雷(完整版)


作者介绍:友友们好我是沐曦希,可以叫我小沐💕
作者主页:沐曦希的个人博客主页.🎉
作者的gitee:https://gitee.com/muxi-c-language.
零基础学习C语言系列:
🎈 https://blog.csdn.net/m0_68931081/category_11742786.html.
🎉小沐和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。✨如果文章有错误,欢迎在评论区✏️指正。那么开始今天的学习吧!😘

文章目录

  • 🎈扫雷游戏
      • ✨游戏介绍
      • 🎈游戏菜单
      • ✨雷盘的初始化
      • ✨布置雷
      • 🎈排查雷
      • 🎈标记雷坐标
      • 🎉获取雷的个数
      • 🎈递归展开一片
  • 🎉完整代码
      • ✨game.h
      • 🎉test.c
      • 🎉game.c
  • 🎉写在最后

C语言实现扫雷(完整版)

🎈扫雷游戏

✨游戏介绍

C语言实现扫雷(完整版)

大家都应该玩过扫雷游戏,上图是通过代码编写的雷盘,通过输入坐标进行扫雷。例如:
C语言实现扫雷(完整版)
输入坐标(1,1),显示1,表示该坐标附近有一个雷,如此下去,直到把所有的没有雷的位置全部翻完或者踩到雷,则游戏结束。
以下用test.c来测试游戏的逻辑,并打印游戏菜单。
game.h作为游戏的头文件,进行函数的声明。
game.c作为游戏的功能实现,是游戏代码实现的核心。

🎈游戏菜单

#includevoid meau(){printf("**********************************\n");printf("*********   1.开始游戏    ********\n");printf("*********   0.退出游戏     *******\n");printf("**********************************\n");}int main(){int input;srand((unsigned int)time(NULL));do{meau();printf("请输入选择:>");scanf("%d", &input);switch (input){case 1:printf("开始扫雷!\n");game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);}

C语言实现扫雷(完整版)

✨雷盘的初始化

通过建立两个二维数组,一个初始为*供玩家扫雷,并存储玩家游玩的过程,另一个初始化为0,该数组不能进行打印,存储布置雷的信息。

//game.h#includevoid meau();#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define count 10void Initbord(char board[ROWS][COLS], int rows, int cols, char set);void DisPaly(char board[ROWS][COLS], int row, int col);
//test.c#include"game.h"void game(){char mine[ROWS][COLS] ;//存放布置好的雷的信息char show[ROWS][COLS] ;//存放排查好的雷的信息Initbord(mine, ROWS, COLS,'0');//初始化布置好的雷的数组全为‘0’,雷则为‘1’Initbord(show, ROWS, COLS,'*');//初始化排查好的雷的信息,全为‘*’,数字表示该数字周围有多少个雷。}
//game.cvoid Initbord(char board[ROWS][COLS], int rows, int cols, char set){int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}}void DisPaly(char board[ROWS][COLS], int row, int col){int j = 0;printf("-----扫雷游戏-----\n");for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");int i = 0;for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----扫雷游戏-----\n");}

✨布置雷

void SetMine(char board[ROWS][COLS], int row, int col){int x = 0;int y = 0;int a = count;while (a){x = rand() % row+1;y = rand() % col+1;if (board[x][y] == '0'){board[x][y] = '1';a--;}}}

🎈排查雷

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int x = 0;int y = 0;int win = 0;while (win < row * col - count){printf("请输入坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标已被排除,不能重复排除!\n");}else{if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");    DisPaly(mine, row, col);break;}else{win++;int set = get_mine_conut(mine, x, y);show[x][y] = set + '0';DisPaly(show, row, col);int c = 0;printf("是否需要标记雷的位置,如果需要请输入1,不需要输入0!请输入:>");scanf("%d", &c);if (c == 1){Mark(show, row, col);}}}}else{printf("输入的坐标超出范围,请重新输入!\n");}}if (win == row * col - count){printf("恭喜你,挑战成功!\n");DisPaly(mine, row, col);}}

🎈标记雷坐标

void Mark(char show[ROWS][COLS], int row, int col){int input = 0;DisPaly(show, row, col);int x = 0;int y = 0;printf("请输入需要标记的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){show[x][y] = '/';DisPaly(show, row, col);}else{printf("该坐标已被排除过,请重新输入。\n");}}else{printf("输入的坐标超出范围,请重新输入。\n");}printf("是否需要继续标记,如果需要请输入1,不需要请输入0。请输入选择:>");scanf("%d", &input);if (input == 1){Mark(show, row, col);}}

🎉获取雷的个数

int get_mine_conut(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 Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col){if (row >= 1 && row <= ROW && col >= 1 && col <= COL){int a = sum(board, row, col);if (a != 0){show[row][col] = a + '0';}else if (show[row][col] != '_'){show[row][col] = '_';int i = 0, j = 0;for (i = row - 1; i <= row + 1; i++){for (j = col - 1; j <= col + 1; j++){Openboard(show, board, i, j);}}}else{return;}}}

🎉完整代码

✨game.h

#include#include#includevoid meau();#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define count 10void Initbord(char board[ROWS][COLS], int rows, int cols, char set);void DisPaly(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);void Openboard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);void Mark(char show[ROWS][COLS], int row, int col);

🎉test.c

#include"game.h"void game(){char mine[ROWS][COLS] ;char show[ROWS][COLS] ;Initbord(mine, ROWS, COLS,'0');Initbord(show, ROWS, COLS,'*');SetMine(mine, ROW, COL);DisPaly(show, ROW, COL);FindMine(mine, show, ROW, COL);}int main(){int input;srand((unsigned int)time(NULL));do{meau();printf("请输入选择:>");scanf("%d", &input);switch (input){case 1:printf("开始扫雷!\n");game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);}

🎉game.c

#include"game.h"void meau(){printf("**********************************\n");printf("*********   1.开始游戏    ********\n");printf("*********   0.退出游戏     *******\n");printf("**********************************\n");}void Initbord(char board[ROWS][COLS], int rows, int cols, char set){int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}}void SetMine(char board[ROWS][COLS], int row, int col){int x = 0;int y = 0;int a = count;while (a){x = rand() % row+1;y = rand() % col+1;if (board[x][y] == '0'){board[x][y] = '1';a--;}}}void DisPaly(char board[ROWS][COLS], int row, int col){int j = 0;printf("-----扫雷游戏-----\n");for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");int i = 0;for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----扫雷游戏-----\n");}int get_mine_conut(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 Mark(char show[ROWS][COLS], int row, int col){int input = 0;DisPaly(show, row, col);int x = 0;int y = 0;printf("请输入需要标记的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){show[x][y] = '/';DisPaly(show, row, col);}else{printf("该坐标已被排除过,请重新输入。\n");}}else{printf("输入的坐标超出范围,请重新输入。\n");}printf("是否需要继续标记,如果需要请输入1,不需要请输入0。请输入选择:>");scanf("%d", &input);if (input == 1){Mark(show, row, col);}}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int x = 0;int y = 0;int win = 0;while (win < row * col - count){printf("请输入坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标已被排除,不能重复排除!\n");}else{if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");    DisPaly(mine, row, col);break;}else{win++;int set = get_mine_conut(mine, x, y);show[x][y] = set + '0';DisPaly(show, row, col);int c = 0;printf("是否需要标记雷的位置,如果需要请输入1,不需要输入0!请输入:>");scanf("%d", &c);if (c == 1){Mark(show, row, col);}}}}else{printf("输入的坐标超出范围,请重新输入!\n");}}if (win == row * col - count){printf("恭喜你,挑战成功!\n");DisPaly(mine, row, col);}}void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col){if (row >= 1 && row <= ROW && col >= 1 && col <= COL){int a = sum(board, row, col);if (a != 0){show[row][col] = a + '0';}else if (show[row][col] != '_'){show[row][col] = '_';int i = 0, j = 0;for (i = row - 1; i <= row + 1; i++){for (j = col - 1; j <= col + 1; j++){Openboard(show, board, i, j);}}}else{return;}}}

🎉写在最后

那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!😘感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。

你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的🙌关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧😘

下一期见了!

K歌软件