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/8/3 4:46:18 阅读更多 →
Cocos Creator性能优化全攻略:从资源管理到渲染优化的移动端实战

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

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

2026/8/3 4:46:18 阅读更多 →
力扣437力扣总和Ⅲ

力扣437力扣总和Ⅲ

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

2026/8/3 4:46:18 阅读更多 →

最新新闻

光伏电站动态无功优化配置与Matlab实现

光伏电站动态无功优化配置与Matlab实现

1. 项目背景与核心价值光伏电站作为分布式电源的重要组成部分,其快速无功响应特性对电网稳定运行具有关键作用。传统分布式电源配置方法往往忽略这一动态特性,导致电网在电压波动时无法快速调节。我们开发的这套基于Matlab的优化配置方法,首次…

2026/8/3 5:47:48 阅读更多 →
恐惧管理的神经科学与行为干预实践

恐惧管理的神经科学与行为干预实践

1. 项目背景与核心价值 "老王-不要害怕"这个看似简单的标题,实际上蕴含着一个极具现实意义的社会心理现象。作为从业十余年的心理咨询师,我发现现代人普遍存在一种"恐惧泛化"现象——对未知变化的过度担忧、对人际关系的过度敏感、对…

2026/8/3 5:47:48 阅读更多 →
图像数据预处理:标准化与归一化的原理、选择与实践指南

图像数据预处理:标准化与归一化的原理、选择与实践指南

1. 从像素值到模型输入:为什么图像数据需要“预处理”?刚入行做计算机视觉或者深度学习的时候,很多人拿到一批图像数据,第一反应可能就是直接扔进模型里开始训练。结果呢?模型要么收敛得特别慢,训练曲线像心…

2026/8/3 5:47:48 阅读更多 →
Unity 2020+ XR开发:告别旧VR架构,掌握XR Plugin Management新范式

Unity 2020+ XR开发:告别旧VR架构,掌握XR Plugin Management新范式

1. 项目概述:为什么Unity 2020的VR开发必须告别“老方法”?如果你是从Unity 5.x或者2017/2018版本一路走来的VR开发者,打开一个老项目,第一反应可能就是去Player Settings里勾选那个熟悉的Virtual Reality Supported复选框&#x…

2026/8/3 5:47:48 阅读更多 →
安克A2644充电器深度拆解:近千元定价背后的技术真相与价值分析

安克A2644充电器深度拆解:近千元定价背后的技术真相与价值分析

安克A2644深度拆解:苹果官网卖近千元,内部设计能撑起价格吗?最近在给家人挑选充电配件时,发现苹果官网在售的安克(Anker)A2644 30W USB-C 充电器价格接近千元,这个定价在第三方充电器市场里绝对…

2026/8/3 5:47:47 阅读更多 →
Java多线程编程核心技术与实战指南

Java多线程编程核心技术与实战指南

1. Java多线程编程核心概念解析多线程作为Java语言的核心特性之一,是每个Java开发者必须掌握的进阶技能。我在实际项目中发现,90%的性能优化需求最终都会涉及多线程方案的改造。理解线程的本质,首先要明白它和进程的区别——线程是CPU调度的最…

2026/8/3 5:46:47 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →