C语言做扫雷游戏(下)
上半部分我们将准备工作完成下面我们将完成game函数中所有子函数void game() { char mine[ROWS][COLS] { 0 }; char show[ROWS][COLS] { 0 }; //初始化 init_board(mine, ROWS, COLS, 0); init_board(show, ROWS, COLS, *); //打印 print_board(show, ROWS, COLS); //部署雷 put_mine(mine, ROWS, COLS); //排雷 pai_mine(mine, show, ROWS, COLS); }一. 初始化//初始化 void init_board(char arr[ROWS][COLS], int r, int c,char in) { int i 0; int j 0; for (i 0;i r;i) { for (j 0;j c;j) { arr[i][j] in; } } }用经典的双变量循环对mine数组和show数组进行初始化赋值i 表示处在第几行j 表示处在第几列此代码块写在game.c中。这里我们用r和c分别接收ROWS行数和COLS列数。注意因为show数组要有隐秘性所以我们可以选择字符‘*’初始化show数组。而此初始化函数应具有推广性即mine数组也应可以用它进行初始化所以可以用字符‘0’初始化mine数组以保持与show数组初始常量类型一样。而‘*’‘0’均可以用char in进行接收所以这个函数共有四个形参与四个实参相对应init_board( mine, ROWS, COLS, 0); init_board( show, ROWS, COLS, *); init_board(char arr[ROWS][COLS], int r, int c,char in)打印下面讲打印函数的效果show数组 mine数组二. 打印void print_board(char arr[ROWS][COLS], int r, int c) { int i 0; int j 0; printf(\n); for (i 1;i ROW;i) { for (j 1;j COL;j) { printf(%c , arr[i][j]); } printf(\n); } printf(\n); }打印同理用双变量法因为是打印游戏部分所以i和j最大分别到ROW和COL但是效果是这样玩家不能立马分清第几行和第几列所以要加上行和列的标注改代码void print_board(char arr[ROWS][COLS], int r, int c) { int i 0; int j 0; for (j 0;j COL ;j) { printf(%d , j); } printf(\n); for (i 1;i ROW;i) { printf(%d , i); for (j 1;j COL;j) { printf(%c , arr[i][j]); } printf(\n); } printf(\n); }在打印棋盘之前先打出0~COL,再在打印每行之前打印行数然后效果如此玩家可以更加方便选择排查坐标。三. 部署地雷void put_mine(char mine[ROWS][COLS], int r, int c) { int s 1; while (s COUNT) { int x rand() % ROW 1; int y rand() % COL 1; if (mine[x][y] ! 1) { mine[x][y] 1; s; } } }简单模式下一般设置10个地雷为了更加灵活可在game.h文件中引入COUNT表示雷数#define COUNT 10//雷数因为要保证部署的随机性因此可以用srand((unsigned int)time(NULL))放在main函数开头;和rand()生成0~ROW和0~COL随机数然后int x rand() % ROW 1和int y rand() % COL 1记录行x和列y。接着将mine[x][y] 1即可注意这里用字符‘1’表示地雷。但在部署地雷之前需要先判断是否已经部署过所以用if语句进行判断。然后在while语句中循环用s记录已部署次数即在每次成功部署后s加一直到COUNT。结果正好10颗四. 排雷并给予提示//排雷 void pai_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c) { int win 0; while (win71) { int x 0, y 0; printf(请输入你想要排查的坐标); scanf(%d%d, x, y); if (x 1 x ROW-1 y 1 y COL-1) { if (show[x][y] *) { if (mine[x][y] 0) { show[x][y] find_mine(mine, x, y) 0; print_board(show, ROWS, COLS); win; } else { printf(你被炸死了\n); print_board(mine, ROWS, COLS); break; } } else { printf(此处已排查\n); print_board(show, ROWS, COLS); } } else { printf(输入错误\n); print_board(show, ROWS, COLS); } } }这里mine数组和show数组均用到所以有两个数组形参。先引入行x列y并让玩家输入然后判断输入是否正确即第一层if语句然后在判断此地是否已经被排查即第二层if语句接着·判断此地是否有雷即第三层if语句。第三层时就是判断show[x][y]为‘1’还是‘*’。若是前者则游戏结束若是后者则要在此处标记附近雷的个数此时用find_mine(mine, x, y)函数static size_t find_mine(char mine[ROWS][COLS], int x, int y) { int i 0; int j 0; size_t n 0; for (i -1;i 1;i) { for (j -1;j 1;j ) { n (mine[x i][y j] - 0); } } return n; }find_mine(mine, x, y)函数只用于pai_mine(中所以应放在pai_mine(上方可以用stasic静态修饰防止其他文件误用。size_t类型指无符号整形类型此处用于函数的返回类型因为雷个数n无负数。因为数字的ASCLL码值-‘0’的ASCLL码值即为数字本身所以将show[x][y]周围的字符数字-‘0’后相加即为周围雷的个数怎样相加呢观察这个图引入i和j初始为-1然后用双变量for循环将mine[x i][y j] - 0全部相加得到雷数n再返回给show[x][y]这样便完成标识然后在开头引入int win每次成功排雷后win直到ROW*COL-COUNT无雷个数然后成功游戏结束。进入下一次循环。五. 总结做扫雷游戏几乎将之前学的所有知识全部复习了一遍例如选择判断循环语句函数定义与调用等等。我亲手实践并写了这两篇博客后我对C语言的理解有加深了一步所以你跟着我将扫雷游戏做完也一定收获颇丰。但是这只是一个简单的版本你也可以用opencode和VS code对其进行优化比如如果排查位置不是雷周围也没有雷可以展开周围的一片这个需要学习函数递归等可以用特殊符号标记雷可以加上排雷的时间显示等等。这里就不再展示。希望这两篇博客对你有所帮助有问题在评论区讨论感谢你的阅读六. 代码展示还没有注册git我给你完整代码text.c#define _CRT_SECURE_NO_WARNINGS #includegame.h void menu() { printf(------------------------\n); printf(------ 1-开始 ------\n); printf(------ 0-退出 ------\n); printf(------------------------\n); printf(请选择); } void game() { char mine[ROWS][COLS] { 0 }; char show[ROWS][COLS] { 0 }; //初始化 init_board(mine, ROWS, COLS, 0); init_board(show, ROWS, COLS, *); //打印 print_board(show, ROWS, COLS); //print_board(mine,ROWS,COLS); //部署雷 put_mine(mine, ROWS, COLS); //print_board(mine, ROWS, COLS); //排雷 pai_mine(mine, show, ROWS, COLS); } int main() { srand((unsigned int)time(NULL)); int input 0; do { menu(); scanf(%d, input); switch (input) { case 1: { game(); break; } case 0: { printf(退出\n); break; } default: { printf(输入错误\n); break; } } } while (input); return 0; }game.c#define _CRT_SECURE_NO_WARNINGS #includegame.h //初始化 void init_board(char arr[ROWS][COLS], int r, int c,char in) { int i 0; int j 0; for (i 0;i r;i) { for (j 0;j c;j) { arr[i][j] in; } } } //打印 void print_board(char arr[ROWS][COLS], int r, int c) { int i 0; int j 0; for (j 0;j COL ;j) { printf(%d , j); } printf(\n); for (i 1;i ROW;i) { printf(%d , i); for (j 1;j COL;j) { printf(%c , arr[i][j]); } printf(\n); } printf(\n); } //部雷 //随机生成COUNT个雷 void put_mine(char mine[ROWS][COLS], int r, int c) { int s 1; while (s COUNT) { int x rand() % ROW 1; int y rand() % COL 1; if (mine[x][y] ! 1) { mine[x][y] 1; s; } } } //标雷 static size_t find_mine(char mine[ROWS][COLS], int x, int y) { int i 0; int j 0; size_t n 0; for (i -1;i 1;i) { for (j -1;j 1;j ) { n (mine[x i][y j] - 0); } } return n; } //排雷 void pai_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c) { int win 0; while (win (ROW*COL-COUNT)) { int x 0, y 0; printf(请输入你想要排查的坐标); scanf(%d%d, x, y); if (x 1 x ROW-1 y 1 y COL-1) { if (show[x][y] *) { if (mine[x][y] 0) { show[x][y] find_mine(mine, x, y) 0; print_board(show, ROWS, COLS); win; } else { printf(你被炸死了\n); print_board(mine, ROWS, COLS); break; } } else { printf(此处已排查\n); print_board(show, ROWS, COLS); } } else { printf(输入错误\n); print_board(show, ROWS, COLS); } } }game.h#pragma once #includestdio.h #includestdlib.h #includetime.h #define ROW 9//行 #define COL 9//列 #define ROWS ROW2 #define COLS COL2 #define COUNT 10//雷数 //初始化 void init_board(int arr[11][11], int r, int c, char in); //打印 void print_board(char arr[ROWS][COLS], int r, int c); //部雷 void put_mine(char mine[ROWS][COLS], int r, int c); //排雷 void pai_mine(mine, show, r, c);

相关新闻

UE5嵌入浏览器:基于CEF与UMG的网页交互完整指南

UE5嵌入浏览器:基于CEF与UMG的网页交互完整指南

1. 项目概述:为什么要在UE5里嵌入一个浏览器?做游戏或者做数字孪生应用的朋友,可能都遇到过这个需求:需要在虚幻引擎的UI界面上,直接显示一个网页。比如,游戏内的公告板需要实时显示官网新闻,或…

2026/10/13 10:20:58 阅读更多 →
Cocos Creator性能优化全攻略:从资源管理到渲染优化的移动端实战

Cocos Creator性能优化全攻略:从资源管理到渲染优化的移动端实战

1. 项目概述:从“能跑”到“跑得顺”的性能认知跃迁刚接触Cocos Creator时,很多开发者(包括我自己)都容易陷入一个误区:只要游戏逻辑写对了,画面能正常显示,项目就算完成了。直到第一次把项目打…

2026/10/8 0:32:38 阅读更多 →
力扣437力扣总和Ⅲ

力扣437力扣总和Ⅲ

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点&…

2026/10/10 13:52:29 阅读更多 →

最新新闻

K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

我不会起名字322 后端 / 算法 / 数据库 📘 技术栈 | 🧩 力扣 Hot100 | 🐹 Go 项目 | 🟥 Redis | 🐬 MySQL 文章目录K8s 探针配置的 3 个反直觉行为:为什么 P…

2026/10/13 10:20:50 阅读更多 →
Linux 6.12 源码深度剖析: shrink_node

Linux 6.12 源码深度剖析: shrink_node

Linux 6.12 内核深度解析:内存回收核心引擎 shrink_node 1. 📌 技术点速览 在 Linux 内存管理系统中,当物理内存紧张、达到或低于特定的水位线(Watermark)时,内核必须启动页面回收(Page Reclaim)机制以释放物理内存。shrink_node 函数是整个内存回收子系统的核心控制…

2026/10/13 10:20:50 阅读更多 →
闲鱼自动回复不生效怎么办?叮当小宝CS排查三步

闲鱼自动回复不生效怎么办?叮当小宝CS排查三步

闲鱼的自动回复是卖家最常用也最常出状况的功能:明明设了话术,买家发来消息却没有回。这篇按三步排查把常见原因过一遍,再说说闲鱼自带工具的边界,以及单量上来之后怎么补位。## 先查:设置是否真的保存生效路径再走一遍…

2026/10/13 10:20:50 阅读更多 →
十六进制转十进制C语言代码实现

十六进制转十进制C语言代码实现

本文章主要讲解: 将输入的十六进制数转化为十进制数的C语言代码实现过程知识较为基础&#xff0c;若有不足请各位多多指教首先给出完整实现代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define weish…

2026/10/13 10:20:50 阅读更多 →
Godot VisibleOnScreenNotifier2D 实战指南:基于渲染剔除的 2D 屏幕可见性检测

Godot VisibleOnScreenNotifier2D 实战指南:基于渲染剔除的 2D 屏幕可见性检测

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 VisibleOnScreenNotifier2D 是 Godot Engine 官方文档&#xff08;本仓库 godot-docs&#x…

2026/10/13 10:20:50 阅读更多 →
HANA数据库HA高可用双机架构原理

HANA数据库HA高可用双机架构原理

HA双机架构的核心概念与设计思路拆解1. 主流HA模式&#xff1a;共享存储 vs. 存储复制HANA HA主要有两种实现模式&#xff0c;选择哪一种&#xff0c;取决于你的基础设施策略和成本考量。共享存储架构&#xff08;Shared Storage&#xff09; &#xff1a;这是较为传统和经典的…

2026/10/13 10:19:49 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →