当前位置: 首页 > news >正文

C语言 ——— 在控制台实现扫雷游戏(一次展开一片,递归实现)

前言

两个数组,一个用来显示在控制台上,一个用来存放雷

两个数组的实际大小为11 * 11 ,而为了方便排查雷的个数,实际使用范围是9 * 9 


test.c 

#include"mine_sweeping.h"void game()
{// 存放雷char mine[ROWS][COLS];// 展示char show[ROWS][COLS];// 初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');// 打印棋盘DisplayBoard(show, ROW, COL);// 布置雷SetMine(mine, ROW, COL);// 排查雷FindMine(mine, show, ROW, COL);
}int main()
{int input = 0;// 随机数生成器srand((unsigned int)time(NULL));do{menu();printf("请输入:");scanf("%d", &input);if (input == 1){game();}else if (input == 0){printf("退出游戏\n");}else{printf("输入错误,请重新输入\n");}} while (input);return 0;
}

game.h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define MINE ((ROW + COL) / 2)// 打印菜单
void menu();// 初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char str);// 打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);// 布置雷
void SetMine(char board[ROWS][COLS], int row, int col);// 排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#include"mine_sweeping.h"// 打印菜单
void menu()
{printf("*******************************************\n");printf("*****     1.play           0.next     *****\n");printf("*******************************************\n");
}// 初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}// 打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("\n");//printf("--------------mine game--------------\n");// 打印横坐标for (int i = 1; i <= row; i++){printf(" %d ", i);printf(" ");}printf("\n");for (int i = 1; i <= row; i++){for (int j = 1; j <= col; j++){// 打印每一行printf(" %c ", board[i][j]);if (j < row){printf("|");}}// 打印纵坐标printf(" %d\n", i);// 打印分割线if (i < col){for (int k = 0; k < row; k++){printf("---");if (k < row - 1){printf("|");}}printf("\n");}}printf("\n");
}// 布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{// 雷的个数int mine = MINE;while (mine){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';mine--;}}
}// 统计雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
//	return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + 
//		mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');int count = 0;if (mine[x - 1][y] == '1')count++;if (mine[x - 1][y - 1] == '1')count++;if (mine[x][y - 1] == '1')count++;if (mine[x + 1][y - 1] == '1')count++;if (mine[x + 1][y] == '1')count++;if (mine[x + 1][y + 1] == '1')count++;if (mine[x][y + 1] == '1')count++;if (mine[x - 1][y + 1] == '1')count++;return count;
}// 一次展开一片
void UnfoldSlice(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL){int count = GetMineCount(mine, x, y);if (count == 0 && mine[x][y] != '*'){show[x][y] = count + '0';mine[x][y] = '*';UnfoldSlice(mine, show, x - 1, y);UnfoldSlice(mine, show, x - 1, y - 1);UnfoldSlice(mine, show, x, y - 1);UnfoldSlice(mine, show, x + 1, y - 1);UnfoldSlice(mine, show, x + 1, y);UnfoldSlice(mine, show, x + 1, y + 1);UnfoldSlice(mine, show, x, y + 1);UnfoldSlice(mine, show, x - 1, y + 1);}if (count != 0){show[x][y] = count + '0';return;}}else{return;}}int IsWin(char show[ROWS][COLS], int row, int col)
{int count = 0;for (int i = 1; i <= row; i++){for (int j = 1; j <= col; j++){if (show[i][j] == '*')count++;}}return count;}// 排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int MineCount = MINE;while (IsWin(show, row, col) > MineCount){printf("请输入要排查雷的坐标(用空格隔开):");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了,游戏结束\n");DisplayBoard(mine, ROW, COL);break;}else{// 一次展开一片UnfoldSlice(mine, show, x, y);DisplayBoard(show, ROW, COL);}}else{printf("坐标非法,请重新输入\n");}}if (IsWin(show, row, col) == MINE){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

相关文章:

C语言 ——— 在控制台实现扫雷游戏(一次展开一片,递归实现)

前言 两个数组&#xff0c;一个用来显示在控制台上&#xff0c;一个用来存放雷 两个数组的实际大小为11 * 11 &#xff0c;而为了方便排查雷的个数&#xff0c;实际使用范围是9 * 9 test.c #include"mine_sweeping.h"void game() {// 存放雷char mine[ROWS][COL…...

el7升级Apache模块编译

1.背景 接续https://blog.csdn.net/nanhai_happy/article/details/140566070&#xff0c;由于升级升级Apache过程中&#xff0c;发现需要使用的mod_wsgi、mod_systemd和mod_cgi模块缺失&#xff0c;故接着解决继续编译生成。 2. 编译mod_cgi、mod_system 2.1 安装依赖 yum …...

Linux系统下的日志管理与ELK Stack实践

关于“Linux系统下的日志管理与ELK Stack实践”&#xff0c;这个主题涵盖了如何在Linux环境中高效地收集、解析、存储及分析日志&#xff0c;以及如何利用ELK Stack&#xff08;Elasticsearch、Logstash、Kibana&#xff09;这套工具来实现日志的集中管理和可视化。下面我会简要…...

C++入门基础知识

在之前我们学习了C语言和初阶数据结构的相关知识&#xff0c;现在已经有了一定的代码能力和对数据结构也有了基础的认识&#xff0c;接下来我们将进入到新的专题当中&#xff0c;这个专题就是C。在C中我们需要花费更大的精力和更长的时间去学习这门建立在C语言基础之上的计算机…...

Python爬虫技术 第28节 数据可视化

Python 爬虫设计结合数据可视化是一个非常强大的组合&#xff0c;可以用来分析和展示从网络获取的数据。以下是如何设计一个 Python 爬虫并结合数据可视化的详细步骤&#xff1a; 步骤 1: 确定数据源和目标 首先&#xff0c;确定你想要爬取的数据源和目标。例如&#xff0c;你…...

react中的装饰器

一、初见react装饰器 初初接触react&#xff0c;发现一些神秘符号和语法&#xff0c;觉得很神奇。类似这样&#xff1a; import React, { PureComponent, Fragment } from react; import {Form} from antd;Form.create() class UpdateForm extends PureComponent {。。。 }哇…...

Elasticsearch:用例、架构和 6 个最佳实践

1. 什么是 Elasticsearch&#xff1f; Elasticsearch 是一个开源分布式搜索和分析引擎&#xff0c;专为处理大量数据而设计。它建立在 Apache Lucene 之上&#xff0c;并由Elastic 支持。Elasticsearch 用于近乎实时地存储、搜索和分析结构化和非结构化数据。 Elasticsearch 的…...

tcp常用网络接口 linux环境

TCP&#xff08;传输控制协议&#xff09;网络通信是常见的网络应用形式&#xff0c;它提供了面向连接的、可靠的数据传输服务。TCP通信常用的接口主要包括以下几个方面&#xff1a; 常用接口 1. socket() int socket(int domain, int type, int protocol); 功能&#xff1…...

第10节课:JavaScript基础——网页交互的魔法

目录 JavaScript的作用JavaScript的基本语法基本语法规则变量、数据类型和运算符变量数据类型运算符 实践&#xff1a;使用JavaScript增强网页功能结语 JavaScript是一种高级的、解释型的编程语言&#xff0c;它使得网页能够从静态文档转变为具有动态交互性的应用程序。本节课将…...

springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后

汽车租赁系统是针对目前汽车租赁管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的汽车租赁管理系统存在的问题进行分析&#xff0c;完善客户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率高&…...

.NET C# 将文件夹压缩至 zip

.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …...

软考基本介绍

一,基本了解 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软件考试&#xff09;为国家级考试。 考试设置了27个专业资格&#xff0c;涵盖5个专业领域&#xff0c; 3个级别层次&#xff08;初级、中级、高级&#xff09;。 中国计算机技术职业…...

【Vue】vue3 中使用 ResizeObserver 监听元素的尺寸宽度变化

要监听 div 宽度的变化&#xff0c;可以使用 ResizeObserver 接口。ResizeObserver 允许你观察一个或多个元素的尺寸变化&#xff0c;并在发生变化时执行回调函数。这种方法比使用 MutationObserver 更专注于尺寸变化&#xff0c;且不受元素属性变化的影响。 使用 ResizeObserv…...

信息安全专业好吗?

22 届的 211 信安毕业生&#xff0c;目前在读研&#xff08;虽然已经和安全没关系&#xff09;&#xff0c;整体来看大部分高校的信安都是作为计算机的附属专业存在的&#xff0c;除了极具特色的几个高校&#xff0c;例如山大的密码学&#xff0c;广州大学某院士加持的网络安全…...

梧桐数据库(WuTongDB):数据库中元数据表的常见信息

元数据表是数据库系统中用于存储和管理元数据的表。这些表提供关于数据库对象&#xff08;如表、列、索引、视图、存储过程等&#xff09;的详细信息。以下是元数据表的一些常见类型及其详细解释&#xff1a; 常见元数据表类型 表信息表 表名&#xff1a;TABLES描述&#xff1…...

在 Linux 9 上安装 Oracle 19c:克服兼容性问题 (INS-08101)

Oracle 数据库 19c 的基础版本 (19.3) 发布的时候还没有 Linux 9 &#xff0c;因此在Linux 9上面安装Oracle 19c会遇到很多兼容性问题。本文将探讨如何解决这些问题。 安装步骤 设置环境变量以绕过操作系统检查&#xff1a; Oracle 19.3 安装程序无法识别 Linux 9。 [WARNIN…...

【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…...

十六、【Python】基础教程 - 【Flask】网络编程开发

目录 前言 Flask 基础概念 安装 Flask 示例&#xff1a;创建一个 Flask Web 应用 运行 Flask 应用 更复杂的例子 测试新功能 前言 Flask 是一个用 Python 编写的微型 Web 框架&#xff0c;它以简单性和灵活性著称&#xff0c;非常适合快速开发小型到中型的 Web 应用。F…...

C#初级——List 容器

容器 在C#中&#xff0c;容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组&#xff1a;List<T> 内部使用数组来存储元素&#xff0c;当添加元素超出当前数组容量时&#xff0c;会自动调整大小&#xff08;扩容&#xff09;。 list容器 List<&g…...

serial靶机教程

靶机下载地址 https://download.vulnhub.com/serial/serial.zip 主机发现 arp-scan -l 端口扫描 nmap 192.168.229.131 -A 根据对⽐可知serial的⼀个ip地址为192.168.47.143 该靶机开启了22端⼝和80端⼝ 对⽹站进⾏⼀个访问&#xff0c;⼤概意思为这是对新的cookie处理程序…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...