用C语言设计扫雷游戏的核心逻辑与实现步骤
扫雷是一个经典的逻辑推理游戏适合用来练习程序设计。这次我们选择在命令行下用C语言实现它重点在于数据结构的规划、递归算法的应用以及用户交互的处理。下面我将不提供任何一行代码只用文字详细描述整个游戏是如何设计的每个功能是如何一步步实现的。阅读完这篇文章你应该就能自己写出完整程序了。一、数据设计用一个结构体代表一个格子游戏需要一个二维棋盘大小为9行9列。每个格子要记住四种信息它下面是否有地雷、周围八个格子里有多少雷如果是安全格、是否已经被玩家翻开、是否被玩家插了旗子。最适合的方式是定义一个结构体里面包含四个成员分别表示“是否雷”、“周围雷数”、“是否翻开”、“是否标记”。然后用这个结构体类型创建一个9×9的二维数组作为游戏的内部数据核心。此外还需要两个全局变量一个表示游戏是否结束布尔型另一个标记当前是否为玩家的第一次点击布尔型。第一次点击的作用后面会详细说。二、初始化创建空棋盘但不着急布雷程序开始时先初始化整个二维数组将所有格子的“是雷”置为假、“周围雷数”置为0、“翻开”置为假、“标记”置为假。此时棋盘上还没有任何一颗雷因为我们要等玩家进行第一次“翻开”操作之后才布雷——这是实现“首次点击安全”的关键。三、随机布雷避开第一次点击的安全区当玩家第一次输入“翻开”指令并且给出了一个具体的行和列坐标后我们才开始执行布雷函数。布雷函数接受这个坐标作为参数目的是在这个坐标的周围3×3区域即以该坐标为中心的九宫格内不放置任何地雷。这样保证玩家第一下点开的不仅不是雷而且周围也没有雷点开后一定是一个空白区域从而能大片展开游戏体验更好。具体做法是循环10次因为总共10颗雷每次生成一个随机行号和列号。检查这个随机位置是否满足两个条件第一它当前还没有被放置地雷第二它的行号不在安全行减一到加一的范围内或者列号不在安全列减一到加一的范围内。如果满足就在这个位置放雷并将已放置雷数加一如果不满足就重新生成随机坐标直到放满10颗为止。四、计算每个安全格子的数字布雷完成后我们需要为棋盘上每一个没有雷的格子计算它周围8个方向有多少颗雷。遍历所有行和列遇到有雷的格子就跳过对于安全格子定义一个包含八个方向偏移量的数组上下左右及四个对角线然后检查偏移后的新坐标是否在棋盘范围内并且对应位置是否有雷有的话计数器加一。最后将计数结果存入该格子的“周围雷数”成员中。五、显示棋盘用字符映射当前状态控制台界面需要清晰地反映每个格子对玩家来说是什么样子。设计一套字符映射规则尚未翻开且没有标记的格子显示井号“#”。尚未翻开但被玩家标记了的格子显示大写字母“F”。已经被翻开的格子根据情况显示不同内容如果是雷显示星号“*”如果周围雷数为0显示空格表示空白区域如果周围雷数为1到8显示对应的数字字符如‘1’到‘8’。在打印棋盘之前先调用清屏命令Windows下是“cls”Linux/Mac下是“clear”让画面每次操作后都能刷新。然后在棋盘上方和左方打印列号与行号方便玩家输入坐标注意给玩家看的时候行和列是从1开始的内部处理时要减一转为数组索引。最后在棋盘下方提示操作格式输入“行 列 操作码”其中操作码“o”表示翻开“f”表示标记或取消标记。六、核心交互翻开格子与递归展开翻开格子的函数是整个游戏最复杂的部分。它接收一个行和列作为参数。首先做边界检查如果坐标越界或格子已经被翻开或者已被标记就直接返回什么也不做。否则将该格子的“翻开”标志设为真。翻开之后要判断这格底下是什么。如果是地雷立即将全局游戏结束标志置为真函数返回后续主循环检测到失败。如果是安全格再看它的周围雷数是不是0如果不是0什么都不用做显示数字即可但如果是0就需要自动展开周围的8个格子。这里用递归实现遍历这8个方向对每个方向的新坐标再次调用同一个翻开函数。由于函数开头有“已翻开则返回”的判断所以不会造成无限递归或重复翻开。通过这样的递归调用所有相连的空白区域都会被一次性翻开直到遇到数字边界。七、标记与取消标记标记功能很简单只需要切换格子的“标记”状态。首先判断该格是否已经被翻开如果翻开了就不能标记给用户一句提示。如果没有翻开就把标记标志取反原来是假就改为真原来真就改为假。主程序里会重新绘制棋盘显示或清除“F”。八、胜负判断与游戏结束处理每次操作完并重绘棋盘后都要检查游戏是否胜利。胜利的条件是所有不是雷的格子都已经被翻开。遍历整个棋盘一旦发现某个格子的“是雷”为假且“翻开”也为假说明还有安全格没打开就不算赢。如果遍历完都没有找到这样的格子就判定胜利输出祝贺信息并结束游戏。如果玩家翻开了地雷除了将游戏结束标志置为真还需要做一个“揭示所有地雷”的操作再次遍历棋盘将所有“是雷”的格子的“翻开”状态设为真同时清除它们的标记以免标记覆盖了雷的显示。然后重绘棋盘让玩家看到所有雷的位置显示为星号并在下面打印失败提示。九、主循环串联一切程序主逻辑非常简单先初始化随机数种子初始化棋盘打印初始界面。然后进入一个循环只要游戏未结束就反复执行以下步骤提示并等待玩家输入行、列、操作码将行和列转换为内部索引检查输入合法性如果是“翻开”操作并且是第一次翻开就先调用布雷函数传入当前坐标和计算数字函数然后调用翻开函数如果是“标记”操作调用标记切换函数操作后判断游戏是否因踩雷而结束若是则揭示全部雷并打印失败信息后跳出循环否则重绘棋盘再检查是否胜利胜利则打印胜利信息并跳出循环。十、可扩展的点与总结上述设计已经实现了一个完整可玩的控制台扫雷。如果想进一步扩展可以借助AI增加选择难度的功能改变棋盘大小和雷数、加入计时器记录从第一次翻开到胜利所用的秒数、保存最佳成绩到文件、甚至用图形库如EasyX替换控制台界面。但在基础层面重点掌握的是二维数组搭配结构体存储状态、延迟生成避开首次点击的随机布雷、递归实现空白展开、以及刷新式命令行交互这些技术。

相关新闻

Feign文件下载内存溢出解决方案:流式处理与配置优化实践

Feign文件下载内存溢出解决方案:流式处理与配置优化实践

1. 从一次线上故障说起:为什么Feign文件下载不是小事那天下午,系统监控突然告警,一个核心服务的接口响应时间从平时的几十毫秒飙升到了十几秒,紧接着就是内存使用率报警。我们紧急排查,发现流量并没有激增,…

2026/10/12 8:28:15 阅读更多 →
基于深信服AF防火墙的SQL注入与XSS攻击防御实战实验

基于深信服AF防火墙的SQL注入与XSS攻击防御实战实验

1. 项目概述:为什么要在防火墙下模拟攻击? 很多刚入行安全或者运维的朋友,一听到“防火墙”就觉得它是个黑盒子,配置复杂,效果神秘。而“SQL注入”、“XSS攻击”这些名词,又常常出现在各种安全报告和新闻里…

2026/10/5 1:13:56 阅读更多 →
CH343 USB转串口桥接板:硬件拆解、驱动安装与高级应用指南

CH343 USB转串口桥接板:硬件拆解、驱动安装与高级应用指南

1. 从USB到串口:为什么我们还需要一块“桥接板”?如果你玩过单片机、树莓派或者任何嵌入式开发板,对“串口”这个词一定不陌生。它就像设备与电脑之间最古老、最可靠的那条“电话线”,负责传输最基础的调试信息、程序代码或者控制…

2026/10/8 15:00:58 阅读更多 →

最新新闻

AI芯片软硬件协同设计实战:从GPU瓶颈到专用架构的权衡

AI芯片软硬件协同设计实战:从GPU瓶颈到专用架构的权衡

1. 为什么GPU不能通吃所有AI场景:从算力垄断到专用芯片做了几年AI芯片的软硬件协同设计,我经常被问到同一个问题:现在GPU这么强,H100、A100都上万卡了,为什么还要费劲搞专用AI芯片?等GPU大规模铺开之后&…

2026/10/12 9:17:54 阅读更多 →
AI芯片软硬件协同设计:从MAC阵列到编译器工具链的实战解析

AI芯片软硬件协同设计:从MAC阵列到编译器工具链的实战解析

1. 先从产品视角看:AI芯片的软硬件设计到底在解决什么问题做芯片方向好几年了,每次有新同事入职,问的第一个问题基本都是"AI芯片和普通芯片到底差在哪"。这个问题看着基础,其实特别值得展开聊。AI芯片的软硬件设计&…

2026/10/12 9:17:54 阅读更多 →
FTP内网大文件传输实战:从被动模式到Python自动化

FTP内网大文件传输实战:从被动模式到Python自动化

简介:面向Java开发者的FTP文件传输资源包,解决在服务器与本地之间上传、下载文件的常见需求,适合正在学习Apache Commons Net或需要快速集成FTP/SFTP功能的项目人员。资源压缩后约106KB,仅含2个文件:一个Java源码文件和…

2026/10/12 9:17:54 阅读更多 →
Go 运行时锁竞争排查:使用 pprof -block 与 mutex 找出双 11 性能杀手

Go 运行时锁竞争排查:使用 pprof -block 与 mutex 找出双 11 性能杀手

双 11 前第二轮全链路压测,团队遇到了一个极其诡异的性能瓶颈。聚合网关跑在 8 核 16G 的容器里,当发压机把并发数从 2000 逐步拉升到 10000 时,服务吞吐量却死死卡在 8200 QPS 纹丝不动。更离奇的是,监控大盘上的 CPU 利用率只有…

2026/10/12 9:17:54 阅读更多 →
热点商品秒杀缓存设计:Redis 多级缓存与本地 LRU 缓存的协同抗压实录

热点商品秒杀缓存设计:Redis 多级缓存与本地 LRU 缓存的协同抗压实录

去年双 11 预售刚过零点,监控报警平台就发出了刺耳的猩红告警:Redis 核心集群的 04 号分片节点出网带宽瞬间飙到 98MB/s(千兆网卡已触顶),单核 CPU 占用直接顶死在 100%。紧接着,依赖该分片的一百多个无关商…

2026/10/12 9:17:54 阅读更多 →
凌晨一点的工位与耳机里的二五一和弦:在大厂解决内存泄漏的节奏冥想

凌晨一点的工位与耳机里的二五一和弦:在大厂解决内存泄漏的节奏冥想

园区大楼的中央空调已经在午夜十二点准时切换成低功率吹风模式。工位对面的几排屏幕早就暗了下去,空气里只剩下机房服务器微弱的嗡嗡声,还有机械键盘敲击的清脆声响。 耳机里循环放着 Bill Evans 钢琴三重奏里的经典段落。爵士乐里最迷人的莫过于“二五一…

2026/10/12 9:16:53 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →