尧图精选

C语言实现简易扫雷游戏

🕒 发布时间:2026/10/2 12:01:07 📁 来源:尧图网络
前言扫雷是经典的小游戏非常适合用来练习C语言二维数组、循环、函数封装的知识点。本篇使用的两个二维数组的思路1. mine数组雷盘存放地雷信息‘1’代表地雷‘0’代表无雷给程序内部看玩家不可见。2. show数组展示盘给玩家看默认全部都是’ * ’排查后显示周围地雷数量。整体设计思路1. 头文件game.h宏定义函数声明2. 游戏实现game.c各个功能函数棋盘初始化 InitBoard打印棋盘 DisplayBoard随机布雷 SetMine统计坐标周围地雷数 GetMineCount玩家排雷逻辑 FindMine菜单 menu游戏入口 game3. 主文件test.c程序入口循环菜单启动游戏完整代码game.h#pragma once #include stdio.h #include stdlib.h #include time.h #define EASY_COUNT 10//地雷数量 #define ROW 9 #define COL 9 #define ROWS ROW2 #define COLS COL2 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int r, int c, char set); //打印棋盘 void DisplayBoard(char board[ROWS][COLS], int r, int c); //布置地雷 void SetMine(char board[ROWS][COLS], int r, int c); //玩家排雷逻辑 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c);game.c#define _CRT_SECURE_NO_WARNINGS #include game.h void menu() { printf( 扫雷 \n); printf(--------------------\n); printf(-----1.开始游戏-----\n); printf(-----0.退出游戏-----\n); printf(--------------------\n); } void game() { char mine[ROWS][COLS]; char show[ROWS][COLS]; InitBoard(mine, ROWS, COLS,0);//定义雷盘 InitBoard(show, ROWS, COLS, *);//定义棋盘 SetMine(mine, ROW, COL);//布雷 DisplayBoard(show, ROW, COL);//打印棋盘 //DisplayBoard(mine, ROW, COL); FindMine(mine, show, ROW, COL); } 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; }test.c#define _CRT_SECURE_NO_WARNINGS #include game.h void InitBoard(char board[ROWS][COLS], int r, int c, char set) { int i 0; int j 0; for (i 0; i r; i) { for (j 0; j c; j) { board[i][j] set; } } } void DisplayBoard(char board[ROWS][COLS], int r, int c) { system(cls); int i 0; int j 0; for (j 0; j c; j) { printf(%d , j); } printf(\n); for (i 1; i r; i) { printf(%d , i); for (j 1; j c; j) { printf(%c , board[i][j]); } printf(\n); } printf(\n); } void SetMine(char board[ROWS][COLS], int r, int c) { int count EASY_COUNT; while (count) { int x rand() % r 1; int y rand() % c 1; if (board[x][y] 0) { board[x][y] 1; count--; } } } int GetMineCount(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 r, int c) { printf(例如5 2\n); int x 0; int y 0; int win 0; while (win r*c - EASY_COUNT) { printf(请输入想要排查的坐标); scanf(%d%d, x, y); if (x 1 x 10 y 1 y 10) { if (show[x][y] ! *) { printf(已排查过此位置请输入其他坐标\n); } else { if (mine[x][y] 1) { system(cls); DisplayBoard(mine, ROW, COL); printf(雷被引爆游戏失败\n); break; } else { int count GetMineCount(mine, x, y); show[x][y] count 0; DisplayBoard(show, ROW, COL); win; } } } else { printf(请输入正确的坐标\n); } } if (win r * c - EASY_COUNT) { system(cls); DisplayBoard(mine, ROW, COL); printf(已排出全部雷游戏胜利\n); } }代码核心知识点讲解1. 为什么数组要ROW2如果直接用9*9数组当排查边界格子比如第一行、最后一列统计周围8格的时候数组下标会越界。外围多一圈不会放雷计算周围雷数时就不用额外写大量边界判断简化代码。2. 两个棋盘的作用mine后台雷盘记录地雷位置玩家正常看不到。show前端展示盘玩家看到的界面默认全部‘ * ‘点开后显示数字。3. GetMineCount计算雷数原理把周围8个格子的字符加起来减去8*’0‘利用ASCII码差值把字符数转换成真实数字。4. 胜利与失败判定失败输入坐标对应的mine[x][y] 1踩到地雷。胜利点开的空白格子数量win 总格子数-地雷数量。运行演示1. 运行程序选择1进入游戏2. 输入坐标例如5 2排查对应位置3. 踩雷直接游戏结束点开所有非雷格子获得胜利小结这个扫雷项目非常适合C语言入门练手综合考察二维数组、函数封装、循环分支、随机数、ASCII码转换。把数据和显示分离两个棋盘的思想也是后面写小游戏很常用的思路。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →