C# Windows Forms 扫雷游戏源码实现
本文通过完整的 C# Windows Forms 项目,展示了经典扫雷游戏的开发过程。内容涵盖了从界面布局构建、难度参数配置到核心逻辑如随机布雷、数字揭示以及递归式空白区域展开的详细代码实现。
项目目标与基础设置
本实验旨在掌握 C# 窗体应用程序的基本控件使用及事件处理。系统需支持三种标准难度模式,并实现经典的鼠标交互规则:左键点击揭开格子,右键循环切换标记(旗帜、问号、无标记)。
第1步:定义窗体属性与全局变量
在 Form1 类中声明控制游戏状态的关键变量,包括二维数组用于存储雷区数据 (MileState) 和按钮控件数组 (buttonarray),同时初始化窗口尺寸常量。
Button[,] buttonarray;
int[,] MileState; // -1表示雷,0-8表示周围雷数
int Miles = 10; // 总雷数
int widths = 9, heights = 9; // 网格宽高
int remain; // 剩余未标记雷数
int notMiles; // 剩余安全格数
第2步:初始化菜单栏与主界面
通过代码动态创建菜单条,添加“开始”(含难度选项)、“帮助”及“退出”菜单项,并在顶部居中放置表情图标按钮作为重新开始入口。
// 创建菜单结构
MenuStrip ms = new MenuStrip();
ToolStripMenuItem tsmione = new ToolStripMenuItem("开始");
toolStripMenuItem[] levels = new ToolStripMenuItem[4];
levels[0] = new ToolStripMenuItem("初级");
levels[1] = new ToolStripMenuItem("中级");
levels[2] = new ToolStripMenuItem("高级");
// 注册各难度按钮的点击事件...
核心游戏逻辑实现
第3步:初始化雷区与动态渲染
根据选定的难度更新窗口大小、行列数及总雷数。随后通过嵌套循环实例化 Button 对象,将其放置在指定坐标并绑定 MouseDown 事件监听器。
- 重置参数:根据难度设定
widths、heights和Miles。 - 创建控件:遍历网格创建按钮,设置固定宽度和高度,统一添加到 Form。
- 位置计算:笑脸按钮的位置根据第一排按钮的跨度进行自动居中。
第4步:随机布雷与数字预计算
布雷过程需要在确定网格范围后随机填充。为确保效率,直接采用暴力法在已知雷格子的相邻8个位置递增数值,从而得到每个非雷格周围的雷数。
while (count < Miles) {
int x = r.Next(heights);
int y = r.Next(widths);
if (MileState[x, y] != -1) {
MileState[x, y] = -1; // 标记为雷
count++;
// 对周围的8个邻居进行边界检查并增加计数...
}
}
第5步:鼠标交互与胜利判定
在 but_MouseDown 事件中处理左键和右键逻辑:
- 左键点击 (LMB):若踩雷 (
MileState == -1) 则触发失败;若点击空白区域 (== 0) 调用递归函数展开;若点击数字格,仅显示当前数字。 - 右键点击 (RMB):循环修改文本状态:
""→"×"(旗帜) →"?"(问号) →""。当所有雷均被正确标记时提示胜利。


第6步:递归展开空白区域 (Flood Fill)
当用户点击到一个周围雷数为0的格子时,程序需自动将其周围所有未揭开的区域一并翻开。这是实现“一触开一片”效果的核心,使用深度优先搜索 (DFS) 完成。
private void print(int x, int y, int[,] sign) {
// 标记已访问
sign[x, y] = 1;
notMiles--;
// 向上下左右及对角线方向递归探索
// 如果邻居也是空白(0),继续深入print()
// 如果邻居是数字(>0),仅揭开该邻居不再向下递归
}
运行结果与测试
编译并运行生成的 .exe 文件,即可体验以下功能:
- 界面展示:不同难度对应不同的面板大小,初始为灰色方格矩阵。
- 交互反馈:翻开后的数字格背景色有所区分,成功标记雷区可观察到计数器归零。
- 胜负判定:点中地雷立即显示哭脸图标并全盘揭秘;全部安全点开或标记完毕则弹出胜利消息框。
以上就是C#实现扫雷游戏代码逻辑与功能的详细内容,更多关于C#桌面小游戏开发的技巧资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













