《C语言课程设计:Windows控制台扫雷游戏(DFS自动展开+首点保护+排行榜系统)》

📌 项目类型: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×910
中级16×1640
高级16×3099

选择界面:

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 语言,强烈建议亲手实现一遍,你会对数组、递归和状态管理有更深入的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值