📌 项目类型:C语言课程设计 / 数据结构实践项目
📌 开发环境:Visual Studio / Dev-C++ / CodeBlocks
📌 运行平台:Windows
📌 核心技术:结构体、二维数组、递归DFS、文件操作、Windows API
📖 前言
扫雷(Minesweeper)作为 Windows 系统最经典的益智游戏之一,是许多程序员接触计算机游戏开发的启蒙项目。
本项目使用 纯C语言 实现了一款增强版控制台扫雷游戏,不仅实现了传统扫雷的全部核心功能,还加入了:
✅ 首次点击保护
✅ 自动展开空白区域
✅ 彩色数字显示
✅ 剩余雷数统计
✅ 实时游戏计时
✅ 排行榜记录系统
✅ 三档难度选择
整体代码结构清晰,非常适合作为:
-
C语言课程设计
-
数据结构实验
-
控制台小游戏项目
-
C语言综合练习
🎮 项目效果展示
启动程序:
=================================
欢迎来到经典标准扫雷
=================================
1. 初级 (9×9,10雷)
2. 中级 (16×16,40雷)
3. 高级 (16×30,99雷)
游戏界面:
===================================================
🚩 剩余雷数: 08
⏱ 游戏时间: 032 秒
===================================================
# # # # # # #
# # 1 1 1 # #
# 1 . . . 1 #
# 1 . . . 1 #
# # 1 1 1 # #
胜利后:
🎉 恭喜通关!
你的成绩:32 秒
请输入昵称:
📂 项目整体结构
项目主要包含以下模块:
扫雷游戏
│
├── 难度选择模块
├── 地图初始化模块
├── 雷区生成模块
├── 控制台渲染模块
├── 用户输入模块
├── DFS自动展开模块
├── 胜负判断模块
├── 排行榜系统
└── 游戏结束模块
程序整体流程:
开始游戏
↓
选择难度
↓
初始化地图
↓
等待玩家操作
↓
生成雷区
↓
翻开格子
↓
胜利?——是→结束
↓否
踩雷?——是→结束
↓否
继续游戏
🔧 一、核心数据结构设计
Cell结构体
扫雷中的每个格子使用结构体表示:
typedef struct {
int isMine;
int isRevealed;
int isFlagged;
int neighborMines;
} Cell;
含义如下:
| 成员 | 作用 |
|---|---|
| isMine | 是否是雷 |
| isRevealed | 是否翻开 |
| isFlagged | 是否插旗 |
| neighborMines | 周围雷数 |
游戏地图
Cell board[MAX_ROW][MAX_COL];
采用二维数组存储整个雷区。
例如:
[ ][ ][ ]
[ ][ ][ ]
[ ][ ][ ]
本质上就是:
3×3 Cell对象矩阵
🎯 二、难度系统设计
程序提供经典三种难度:
Difficulty levels[3] = {
{9, 9, 10, "初级"},
{16,16,40,"中级"},
{16,30,99,"高级"}
};
对应关系:
| 难度 | 地图大小 | 雷数 |
|---|---|---|
| 初级 | 9×9 | 10 |
| 中级 | 16×16 | 40 |
| 高级 | 16×30 | 99 |
选择界面:
levelIdx = selectDifficulty();
实现了经典 Windows 扫雷难度配置。
💣 三、首点安全机制
为什么需要首点保护?
如果游戏开始就踩雷:
第一次点击
↓
直接爆炸
体验极差。
因此经典扫雷规定:
第一次点击永远不会踩雷。
实现思路
程序开始时:
firstClick = 1;
地图中实际上没有雷。
当玩家第一次翻开格子时:
generateMines(cursorY,cursorX);
才真正生成雷区。
九宫格保护
代码如下:
if(abs(r-startY)<=1 &&
abs(c-startX)<=1)
{
continue;
}
表示:
***
*O*
***
首次点击位置及周围8个格子都不会出现雷。
这样能够保证:
-
首次点击安全
-
更容易展开大片区域
-
游戏体验更好
🔢 四、周围数字计算
扫雷中的数字表示:
周围8个格子中雷的数量
例如:
* * .
* 3 .
. . .
中心数字为:
3
核心代码:
for(dr=-1;dr<=1;dr++)
{
for(dc=-1;dc<=1;dc++)
{
...
}
}
遍历:
↖ ↑ ↗
← O →
↙ ↓ ↘
统计雷数:
count++;
最终:
board[i][j].neighborMines=count;
🌊 五、DFS自动展开算法
这是扫雷最核心的功能之一。
效果
玩家点击:
0
后:
0 0 0 0
0 0 1 1
0 1 2 #
大片区域自动展开。
实现函数
void revealCell(int r,int c)
递归展开:
revealCell(r+dr,c+dc);
DFS思想
流程:
当前格为0
↓
展开周围8格
↓
发现新的0
↓
继续展开
本质:
Depth First Search
深度优先搜索
算法复杂度:
O(N)
其中N为连通区域大小。
🎨 六、控制台界面优化
相比普通课程设计项目,本项目加入了彩色界面。
隐藏光标
hideCursor();
调用:
SetConsoleCursorInfo(...)
避免控制台闪烁。
颜色控制
setColor(color);
底层:
SetConsoleTextAttribute(...)
实现数字颜色区分:
| 数字 | 颜色 |
|---|---|
| 1 | 蓝色 |
| 2 | 绿色 |
| 3 | 红色 |
| 4 | 紫色 |
| 5 | 黄色 |
更加接近Windows原版扫雷。
⏱ 七、计时系统实现
开始计时:
startTime = GetTickCount();
获取当前时间:
elapsedTime =
(GetTickCount()-startTime)/1000;
界面实时显示:
⏱ 游戏时间: 035秒
方便玩家挑战最快记录。
🚩 八、插旗功能
按下:
F
即可插旗。
核心逻辑:
board[y][x].isFlagged =
!board[y][x].isFlagged;
效果:
#
↓
F
再次按F:
F
↓
#
取消标记。
🏆 九、排行榜系统
本项目加入了成绩保存功能。
保存成绩
文件:
minesweeper_records.txt
格式:
初级 张三 35
初级 李四 41
高级 王五 156
写入:
fprintf(...)
读取:
fscanf(...)
效果
🏆 历史荣誉榜
第1名 张三 35秒
第2名 李四 41秒
第3名 王五 52秒
让游戏具有长期挑战价值。
🎯 十、项目亮点总结
相比普通扫雷课程设计,本项目具有以下特色:
| 功能 | 是否实现 |
|---|---|
| 多难度系统 | ✅ |
| 首点安全 | ✅ |
| 九宫格保护 | ✅ |
| DFS自动展开 | ✅ |
| 彩色界面 | ✅ |
| 游戏计时 | ✅ |
| 插旗系统 | ✅ |
| 排行榜 | ✅ |
| 文件存储 | ✅ |
📊 项目知识点总结
通过本项目可以学习到:
C语言基础
-
结构体
-
数组
-
指针
-
函数封装
数据结构
-
二维数组
-
状态存储
算法
-
DFS深度优先搜索
-
随机算法
-
邻域遍历
系统编程
-
Windows API
-
控制台控制
-
键盘监听
文件操作
-
fopen()
-
fprintf()
-
fscanf()
🚀 可扩展方向
如果继续优化,可以增加:
图形化界面
-
EasyX
-
SDL2
-
Qt
智能功能
-
自动扫雷AI
-
提示系统
-
自动标雷
联机功能
-
在线排行榜
-
对战模式
-
多人协作模式
📝 总结
本文实现了一款完整的 Windows 控制台版扫雷游戏,通过结构体管理地图状态,利用 DFS 实现自动展开,并结合 Windows API 实现彩色界面和实时刷新效果。
整个项目涵盖了:
-
数据结构
-
递归算法
-
文件系统
-
控制台编程
是一个非常适合作为 C语言课程设计、期末大作业、数据结构实践项目 的综合案例。
如果你正在学习 C 语言,强烈建议亲手实现一遍,你会对数组、递归和状态管理有更深入的理解。
349

被折叠的 条评论
为什么被折叠?



