首页/新闻资讯/正文详情

C语言实现扫雷游戏:数组与递归算法实战

发布时间:2026/11/4 17:46:48 来源:云帆数科 栏目:资讯中心
C语言实现扫雷游戏:数组与递归算法实战
1. 项目概述扫雷游戏作为经典的单机益智游戏其核心逻辑非常适合用C语言的数组和函数来实现。这个项目不仅能帮助我们掌握C语言的基础语法更能深入理解数组操作、函数封装、递归调用等核心编程概念。通过200行左右的代码我们可以完整实现一个控制台版本的扫雷游戏包含地图生成、雷区标记、安全区域展开等完整功能。2. 核心需求解析2.1 游戏基本规则扫雷游戏的核心规则包含三个要点游戏区域由若干方格组成随机分布着一定数量的地雷玩家需要揭开方格若揭开的是地雷则游戏失败若揭开的方格没有地雷会显示周围8个方格中的地雷数量2.2 技术实现要点基于上述规则我们需要实现以下功能使用二维数组存储游戏地图随机生成地雷分布实现递归展开安全区域处理玩家输入和游戏状态判断3. 数据结构设计3.1 地图表示方案我们使用两个二维数组来表示游戏状态mine_map存储实际的地雷分布1表示有雷0表示无雷show_map显示给玩家的地图包含以下状态*未揭开 已揭开且周围无雷1-8周围地雷数量!标记为地雷#define ROW 9 #define COL 9 #define MINE_COUNT 10 int mine_map[ROW][COL] {0}; // 地雷分布图 char show_map[ROW][COL] {0}; // 显示给玩家的地图3.2 初始化函数实现地图初始化包含三个步骤清空两个数组随机放置地雷计算每个方格周围的地雷数量void init_map() { // 清空地图 memset(mine_map, 0, sizeof(mine_map)); memset(show_map, *, sizeof(show_map)); // 随机放置地雷 int count 0; while (count MINE_COUNT) { int x rand() % ROW; int y rand() % COL; if (mine_map[x][y] 0) { mine_map[x][y] 1; count; } } }4. 核心算法实现4.1 递归展开安全区域当玩家点击一个周围无雷的方格时需要自动展开所有相邻的安全区域void expand_safe_area(int x, int y) { // 边界检查 if (x 0 || x ROW || y 0 || y COL) return; // 已揭开或标记为地雷则返回 if (show_map[x][y] ! *) return; // 计算周围地雷数量 int count count_around_mines(x, y); if (count 0) { show_map[x][y] 0 count; } else { show_map[x][y] ; // 递归展开周围8个方向 for (int i -1; i 1; i) { for (int j -1; j 1; j) { if (i ! 0 || j ! 0) { expand_safe_area(x i, y j); } } } } }4.2 地雷数量计算计算指定位置周围8个方格中的地雷总数int count_around_mines(int x, int y) { int count 0; for (int i -1; i 1; i) { for (int j -1; j 1; j) { int nx x i; int ny y j; if (nx 0 nx ROW ny 0 ny COL) { count mine_map[nx][ny]; } } } return count; }5. 游戏流程控制5.1 主游戏循环游戏主循环处理玩家输入并更新游戏状态void game_loop() { while (1) { print_map(); printf(请输入操作和坐标(例如: o 2 3 表示揭开2行3列, m 2 3 表示标记): ); char cmd; int x, y; scanf( %c %d %d, cmd, x, y); if (cmd o) { // 揭开方格 if (mine_map[x][y] 1) { printf(踩到地雷游戏结束\n); show_all_mines(); break; } expand_safe_area(x, y); } else if (cmd m) { // 标记地雷 show_map[x][y] !; } if (check_win()) { printf(恭喜你获胜了\n); break; } } }5.2 胜负判断胜利条件所有非地雷方格都被揭开int check_win() { for (int i 0; i ROW; i) { for (int j 0; j COL; j) { if (mine_map[i][j] 0 show_map[i][j] *) { return 0; } } } return 1; }6. 界面显示优化6.1 地图打印函数为提升可读性添加行列号和边框void print_map() { printf( ); for (int j 0; j COL; j) { printf(%d , j); } printf(\n -------------------\n); for (int i 0; i ROW; i) { printf(%d | , i); for (int j 0; j COL; j) { printf(%c , show_map[i][j]); } printf(|\n); } printf( -------------------\n); }6.2 游戏结束显示游戏结束时显示所有地雷位置void show_all_mines() { for (int i 0; i ROW; i) { for (int j 0; j COL; j) { if (mine_map[i][j] 1) { show_map[i][j] ; } } } print_map(); }7. 完整代码结构#include stdio.h #include stdlib.h #include string.h #include time.h #define ROW 9 #define COL 9 #define MINE_COUNT 10 // 函数声明 void init_map(); void print_map(); void expand_safe_area(int x, int y); int count_around_mines(int x, int y); void game_loop(); int check_win(); void show_all_mines(); int mine_map[ROW][COL] {0}; char show_map[ROW][COL] {0}; int main() { srand(time(NULL)); init_map(); game_loop(); return 0; } // 其他函数实现...8. 扩展与优化建议8.1 难度调整可以通过修改宏定义来调整游戏难度// 初级 #define ROW 9 #define COL 9 #define MINE_COUNT 10 // 中级 #define ROW 16 #define COL 16 #define MINE_COUNT 40 // 高级 #define ROW 16 #define COL 30 #define MINE_COUNT 998.2 图形界面版本掌握控制台版本后可以尝试使用图形库如EasyX或SDL开发图形界面版本添加更丰富的视觉效果和交互体验。8.3 性能优化对于大型地图递归展开可能导致栈溢出可以改用队列实现广度优先搜索的非递归展开算法。9. 常见问题与调试技巧9.1 随机数生成问题确保在main函数开头调用srand(time(NULL))否则每次运行的地雷分布会相同。9.2 数组越界检查所有数组访问操作都要进行边界检查特别是在递归展开时。9.3 输入验证处理玩家输入时要验证坐标是否合法避免程序崩溃。9.4 内存调试可以使用调试工具检查数组越界问题特别是在处理地图边界时容易出错。10. 项目总结这个扫雷游戏项目完整展示了C语言数组和函数的实际应用。通过二维数组存储游戏状态使用函数封装各个功能模块实现了经典游戏的完整逻辑。项目中涉及的技术点包括二维数组的定义和使用随机数生成和应用递归算法的实现模块化函数设计控制台交互处理对于C语言初学者来说这是一个非常好的综合练习项目能够帮助理解程序的分层设计和模块化开发思想。完成基础版本后可以尝试添加计时功能、排行榜记录等扩展特性进一步提升编程能力。

相关推荐

Wireshark 3.2 Windows安装与首次抓包验证完整指南
Wireshark 3.2 Windows安装与首次抓包验证完整指南

网络抓包这件事,说难不难,说简单也真不简单。很多人第一次接触协议分析,都是被一个具体问题逼到墙角的——某个服务端明明说发了数据,客户端就是收不到;某个接口在测试环境跑得飞起,上了生产就间歇性超时&a… · 2026/11/4 17:46:48

VVDI升级工具v1.5.1安装与固件升级避坑指南
VVDI升级工具v1.5.1安装与固件升级避坑指南

简介:Xhorse Update Tool v1.5.1 面向汽车维修技术人员与 VVDI 设备用户,是一款电脑端联网更新 Xhorse VVDI 智能诊断设备软件版本的工具,解决固件与诊断程序滞后带来的兼容与适配问题。压缩包共 31 个文件,以 exe 可执行程序、in… · 2026/11/4 17:45:48

大模型调用自动重试机制解析与工程实践指南
大模型调用自动重试机制解析与工程实践指南

1. 大模型调用失败后的自动重试,到底是谁在干活很多人第一次遇到大模型调用失败,第一反应是"这模型不稳定"。但如果你把整条链路拆开看,会发现一次请求从你的代码发出到拿到结果,中间至少经过四层:你的业务代… · 2026/11/4 17:45:48

选择性重建记忆:如何给大模型装上真正的长期记忆
选择性重建记忆:如何给大模型装上真正的长期记忆

我们的对话应用跑得越久,越能感觉到大模型记忆这件事被严重低估了。上下文窗口再大,塞满之后照样失忆;RAG 接上去,向量库检索出来的又是一段段割裂的原文,离"懂事"差着十万八千里。最近在 Hacker News 上看到… · 2026/11/4 18:32:53

解决IntelliJ IDEA中mapper.xml绿色背景问题
解决IntelliJ IDEA中mapper.xml绿色背景问题

1. 问题现象与背景解析作为一名长期使用IntelliJ IDEA进行Java开发的程序员,我经常遇到mapper.xml文件中出现大面积绿色背景的问题。这种视觉干扰不仅影响代码阅读体验,还会分散开发注意力。经过多次实践和排查,我发现这是IDEA对XML文件中SQL… · 2026/11/4 18:32:53

C# WinForm 桌面日程提醒器:定时检查与倒计时实现
C# WinForm 桌面日程提醒器:定时检查与倒计时实现

简介:这份资源是一套基于C#与WinForms开发的日程提醒器完整源码工程,面向具备一定C#基础、希望借助桌面小项目巩固WinForms界面设计与事件驱动编程的开发者。项目围绕事件添加、列表查看、提醒开关、倒计时显示与弹窗通知等核心功能展开,涵盖… · 2026/11/4 18:32:53

TypeScript 实战:从零构建 RAG 知识获取管道,打通 AI Agent 落地第一道坎
TypeScript 实战:从零构建 RAG 知识获取管道,打通 AI Agent 落地第一道坎

1. 为什么知识获取管道是 AI Agent 落地的第一道坎做 AI Agent 开发的人,绕不开一个尴尬的现实:模型本身很聪明,但它不知道你公司内部的业务规则、不知道你昨天刚更新的产品文档、更不知道你私有的那套数据长什么样。你问它一个关于内部流程的… · 2026/11/4 18:32:53

FPGA上CORDIC实现sin/cos:从定点设计到上板验证
FPGA上CORDIC实现sin/cos:从定点设计到上板验证

第一次把 CORDIC 的 Verilog 代码烧进 FPGA,我盯着逻辑分析仪的采样窗口看了很久——输入角度线性扫过去,cos 输出确实是一条余弦曲线,但峰值位置比离线脚本算出来的偏了将近两个采样点,零点附近还带着一层说不清的台阶。那时候我才明白,三角函数在 FPGA 里从来不是… · 2026/11/4 18:31:52

动态地理围栏技术提升本地商户到店转化率实战
动态地理围栏技术提升本地商户到店转化率实战

1. 项目背景与核心价值在本地生活服务领域,精准触达目标客群始终是商家最核心的诉求。过去三年间,我们团队为237家本地商户提供数字化解决方案时发现:超过68%的线下门店虽然线上曝光量可观,但实际到店转化率不足12%。问题根源在于… · 2026/11/4 18:31:52

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码