居然这么简单就能实现扫雷游戏!

目录

     一.思路

     1.成果展示

     2.思路

     二.具体操作

     1.创建"棋盘"

     2.初始化雷

     3.布置雷

      4.打印

      5.排除雷

     三.代码实现

     1.test.c文件

     2.thunder.h文件

      3.thunder.c文件


       Hello,大家好,今天我们来实现扫雷游戏,希望这一篇博客能给带给大家一些收获。

     一.思路

     1.成果展示

       在真正开始讲解之前,我们先来看一下我的成果展示:

屏幕录制 2024-07-03 165322-CSDN直播

     2.思路

       我们先来讲解一下扫雷游戏的思路:这个思路就是和我们在完游戏时候的那个思路时一模一样的,就是排除雷,简单来说,就是我们给定一个位置,看这个位置是不是雷,如果我们不幸,选中的这个位置就刚好是一个雷的话,那么我们就被炸死了,反之如果这个位置不是雷的话,那么,相应的,我们就要统计一下这个位置旁边与这个位置相邻的位置中雷的个数。

     二.具体操作

     1.创建"棋盘"

       实际上就是创建框架,就是创建如下面所示的一个"棋盘"。

我们首先要创建一个如上图一样的类似于"棋盘"一样的框架,要制作这个框架其实是很简单的,就是建立一个二维数组就可以了,将数组中的所有的元素均设置成 ' * ' 就可以了。这里我们在创建框架的时候需要注意一件事情,就必须要创建两个一模一样的二维数组,大家不妨看一看我们上面的那个游戏思路,如果这个位置是雷,我们就"死了",反之,就要在这个位置上写上周围的所有位置的雷的数目总和。为了区分有雷和无雷,我们将有雷的位置赋值1,无雷的位置赋值为0,那么,这样的话,我们在玩游戏的过程中出现了1的话,我们是无法知道这个位置是雷还是说这个位置不是雷,周围总共有1个雷?如果我们只是使用一个二维数组的话,是无法明白这个出现的1的含义的,会让我们产生歧义。因此,我们在这里要使用两个一模一样的数组来实现,我们呈现在屏幕上面的"棋盘"样式就是上面的那幅图所示,由于 ' * ' 符号属于字符,因此,我们要建立一个字符数组,但是如果按照我们上面所说的那样的话,一个数组是int类型,另一个数组是char类型,这样写的话有一点点麻烦,为了统一,我们这里将两个数组均写成是char类型的。

     2.初始化雷

       通过上面的思路我们可知我们建立了两个char类型的数组,我们接下来就要进行初始化操作了,在进行初始化操作之前,我们首先要知道创建的两个数组是干什么的,一个数组是用来布置雷的,我们为了方便,将雷使用字符 ' 1 ' 来表示,不是雷的位置使用字符 ' 0 ' 来表示,这个数组我们不可以展示出来(因为这个数组中存放的是雷的分布情况),另一个数组就是我们要展示出来的数组,是用来显示我们要查的这个位置又没有雷的存在。

我们将不展示出来的这个数组命名为mine数组,如下图所示:

mine数组我们在进行初始化的时候,将这个数组中的所有的元素全部初始化为字符 ' 0 ' (通过我们上面的解释我们可知 ' 0 ' 代表的是要排查的这个位置没有雷)。

我们将展示出来的这个数组命名为show数组,如下图所示:

show数组我们在进行初始化的时候,将这个数组中的所有元素全部初始化为 ' * ' ,我们这个数组是作为展示的一个数组,因此,我们不能暴露里面的雷的放置情况。

     3.布置雷

       我们的雷的布置这一操作是在mine数组中进行的,我们的"棋盘"是采用的是 9 * 9实现的,我们这里在布置是只布置10个雷就i可以了,我们是要在这个"棋盘"中去进行雷的布置的,因此,不能超过这个"棋盘"的范围,这里我们要使用一个函数,就是 rand( ) 函数,下面是关于这个函数的链接,大家可以去了解一下,这个函数可以随机生成一个随机数,

rand - C++ Referenceicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand我们可以通过这个函数来确定雷的位置,使用这个函数我们就可以得到两个值x,y作为坐标来确定一个地址(这个地址必须在mine函数的范围之内),将这个地址赋值为字符 ' 1 ' ,利用循环,创建10个雷。

      4.打印

        我们在进行打印这一操作的时候,就是将mine数组和show数组中的各个元素均打印到屏幕上即可,这里使用for循环,(最后有代码)。

      5.排除雷

        前面的几步都是我们的准备操作,这一步才是我们玩游戏的步骤,我们给定一个坐标位置,去判断这个位置是否有雷(判断这一步操作是在mine数组中判断的(雷的分布是在mine数组中的)),若mine数组中这个位置是字符 ' 1 ' 的话,就说明我们碰到雷了,反之,若mine数组中这个位置是字符 ' 0 ' 的话,我们就要去统计一下这个位置周围的位置的雷的个数,然后将这个个数转化为字符赋值给show数组中的这个相同的位置,为了方便观看,我们这里将show数组在打印到屏幕上就可以了,这里还要有一个结束条件,就是我们将所有的雷全部都排完之后,我们就扫雷成功了,因此,我们还要定义一个变量来表示我们找到的非雷位置的个数,用这个变量来表示雷有没有被扫完。

     三.代码实现

     1.test.c文件

#include"thunder.h"
void menu()
{printf("********************\n");printf("****   1.play   ****\n");printf("****   0.exit   ****\n");printf("********************\n");
}
void game()
{char mine[COWS][COLS] = { 0 };char show[COWS][COLS] = { 0 };// 初始化雷Initebroad(mine, COWS, COLS, '0');Initebroad(show, COWS, COLS, '*');// 布置雷Setmine(mine, COW, COL);// 打印Displaydroad(mine, COW, COL);Displaydroad(show, COW, COL);// 排除雷Findmine(mine, show, COW, COL);
}
void test()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("游戏结束,退出游戏\n");break;default:printf("输入错误,请重新输入\n");}} while (input);
}
int main()
{test();return 0;
}

     2.thunder.h文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define COW 9
#define COL 9
#define COWS COW+2
#define COLS COL+2
#define mount 10
void Initebroad(char arr[COWS][COLS], int cows, int cols, char set);
void Setmine(char arr[COWS][COLS], int cow, int col);
void Displaydroad(char arr[COWS][COLS], int cows, int cols);
void Findmine(char mine[COWS][COLS], char show[COWS][COLS], int cow, int col);

      3.thunder.c文件

#include"thunder.h"
void Initebroad(char arr[COWS][COLS], int cows, int cols, char set)
{for (int i = 0; i < cows; i++){for (int j = 0; j < cols; j++){arr[i][j] = set;}}
}
void Setmine(char arr[COWS][COLS], int cow, int col)
{int count = mount;while (count > 0){int x = rand() % cow + 1;int y = rand() % col + 1;if (arr[x][y] == '0'){arr[x][y] = '1';count--;}}
}
void Displaydroad(char arr[COWS][COLS], int cow, int col)
{ printf("------开始游戏-----\n");for (int i = 0; i <= col; i++) {printf("%d ",i);}printf("\n");for (int i = 1; i <= cow; i++){printf("%d ",i);for (int j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}
//static这个关键字可以保证这个函数只能在当前.c文件中使用,其他的文件使用不了。
static int Getminecount(char arr[COWS][COLS], int x, int y)
{int count = 0;for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){count += arr[i][j] - '0';}}return count;
}
void Findmine(char mine[COWS][COLS], char show[COWS][COLS], int cow, int col)
{int x = 0, y = 0;int win = 0;while (win < cow * col - mount)//确保雷全部被排完。{   printf("请输入要排查的坐标位置\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= cow && y >= 1 && y <= col){if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,您被炸死了\n");Displaydroad(show, COW, COL);break;}else{// 当程序进行到这里时,就说明要排查的当前位置不是雷,那么,就要统计周围一圈的雷的个数。int count = Getminecount(mine, x, y);show[x][y] = count + '0';Displaydroad(show, COW, COL);win++;}}else{printf("这个位置您已经排查过了,请另排查一个\n");}}else{printf("输入的坐标不存在,请重新输入\n");}}if (win == cow * col - mount){printf("恭喜您,排雷成功\n");Displaydroad(mine, COW, COL);}
}

       OK,以上就是我们对于扫雷游戏的全部讲解了,希望能对大家有所收获,感谢大家的支持。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】最长连续序列

题目&#xff1a;最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,…

使用LabVIEW报告生成工具包时报错97

问题详情&#xff1a; 在运行使用Excel/Word调用节点的程序时&#xff0c;收到错误97&#xff1a;LabVIEW&#xff1a;&#xff08;十六进制0x61&#xff09;输入中传递了一个空引用句柄或先前已删除的引用句柄。 当运行报告生成工具包中的一个示例程序时&#xff0c;收到错误…

速锐得解码汽车以太网技术特点接口定义数据传输及应用

在当前的汽车工业中&#xff0c;随着技术的飞速发展&#xff0c;车载网络技术也在不断进步与更新。其中&#xff0c;具备以太网的车型已成为一个新兴趋势&#xff0c;这主要归功于车载以太网技术在车内带宽需求较高的系统上的应用&#xff0c;如高级驾驶辅助系统&#xff08;AD…

1000T的文件怎么能快速从南京传到北京?最佳方案你肯定想不到

今天刷面试题看到一个有意思的面试题&#xff0c; 1000T的文件怎么能以最快速度从南京传到北京&#xff1f; 网络传输 首先我们考虑通过网络传输&#xff0c;需要多长时间。 我特地咨询了在运营商工作的同学&#xff0c;目前带宽&#xff1a; 家庭宽带下行最大1Gbps&#…

Python学习笔记27:进阶篇(十六)常见标准库使用之质量控制中的代码质量与风格第一部分

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…

Linux应用---内存映射

写在前面&#xff1a; 在进程间通信中&#xff0c;有一种方式内存映射。内存映射也是进程间通信的方式之一&#xff0c;其效率高&#xff0c;可以直接对内存进行操作。本节我们对内存映射进行学习&#xff0c;并结合案例进行实践。 1、基本理论 内存映射&#xff1a;是将磁盘文…

代码随想录-Day46

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

【JVM-05】Java内存区域(运行时数据区)、对象创建过程、内存布局

【JVM-05】Java内存区域即运行时数据区、对象创建过程、内存布局 1. 介绍下Java内存区域(运行时数据区)1.1 程序计数器(线程私有)1.2 虚拟机栈(线程私有)1.3 本地方法栈(线程私有)1.4 Java堆(线程共享)1.5 方法区(线程共享)1.5.1 方法区和永久代的关系1.5.2 常用参数1.5.3 为什…

Halcon支持向量机

一 支持向量机 1 支持向量机介绍&#xff1a; 支持向量机(Support Vector Machine&#xff0c;SVM)是Corinna Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别表现出许多特有的优势。 2 支持向量机原理: 在n维空间中找到一个分类超平面…

node与npm安装教程

node与npm的下载安装教程&#xff1a; 文章目录 node与npm的下载安装教程&#xff1a;---Node.js 介绍NPM 介绍 一&#xff1a;下载&#xff08;node与npm的安装包是在一起的&#xff09;二&#xff1a;安装1&#xff1a;双击运行安装文件1-node-v14.15.0-x64.msi,点击下一步。…

前端uni-app篇之在uni-app中实现图片瀑布流布局并进行性能优化

在uni-app中实现图片瀑布流布局并进行性能优化。 考虑从以下几个方面优化&#xff1a; 使用虚拟列表&#xff1a;对于大量图片的加载&#xff0c;可以使用虚拟列表技术&#xff0c;只渲染屏幕可见的图片&#xff0c;未进入视口的图片不加载&#xff0c;从而减少内存占用和提高…

常用渲染管线介绍

1、光栅化渲染管线&#xff08;Raster pipeline&#xff09; 1.1、光栅化概述 光栅化图形渲染管线是实时渲染的核心组件。渲染管线的功能是通过给定虚拟相机、3D场景物体以及光源等场景要素来产生或者渲染一副2D的图像。如上图所示&#xff0c;场景中的3D物体通过管线转变为屏…

动态渲染dom

最近在做类似论文生成的一个系统&#xff0c;比较复杂&#xff0c;简单来说就是文字、图表的展示&#xff0c;但是顺序不固定&#xff0c;所以有动态渲染dom的需求&#xff0c;以下是我写的小demo&#xff0c;以作记录。 <template><div id"app"><div…

第一周java.1

一维数组 java数组要求所有数组元素具有相同的数据型。因此&#xff0c;在一个数组中&#xff0c;数组元素的类型是唯一的&#xff0c;即一个数组里只能存储一种数据类型的数据&#xff0c;而不能存储多种数据类型的数据 。 一旦数组的初始化完成 &#xff0c;数组在内存中所…

自媒体的竞争将会何去何从?

未来自媒体的竞争将会呈现出以下几个主要的发展趋势&#xff1a; 1. 内容质量与垂直化竞争加剧 内容质量提升&#xff1a;在信息爆炸的时代&#xff0c;用户对优质内容的需求越来越高。自媒体创作者需要不断提升自己的专业素养和创作能力&#xff0c;以提供有深度、有价值的内…

Datadog Dash 2024 新功能解析

Datadog 2024 年的 Dash 刚刚落下帷幕&#xff0c;作为正在与 Datadog 开始竞争的观测云&#xff0c;我们认真仔细的分析了 Datadog 的每一个新功能&#xff0c;发现一些很有意思的事情&#xff0c;今天就给大家做一次全面的分析。&#xff08;所有 Datadog 的 Dash 的最新功能…

基于改进YOLOv5s的跌倒行为检测 | 引入SKAttention注意机制 + 引入空间金字塔池化结构SPPFCSPC + 结合ASFF自适应空间融合

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。为了实现电厂人员跌倒行为的实时检测&#xff0c;防止跌倒昏迷而无法及时发现并救援的事件发生&#xff0c;针对跌倒行为检测实时性以及特征提取能力不足的问题&#xff0c;提出了一种改进YOLOv5s的跌倒行为检测算法网络&a…

PD虚拟机和VirtualBox有什么区别?Parallels Desktop 19.1.1 破解版

随着计算机技术的不断发展&#xff0c;虚拟机软件在现代信息技术领域中扮演着越来越重要的角色。虚拟机不仅可以帮助用户在一台物理机器上运行多个操作系统&#xff0c;还能有效隔离不同环境&#xff0c;提升系统安全性。在众多的虚拟机软件中&#xff0c;PD虚拟机&#xff08;…

第一百三十八节 Java数据类型教程 - Java boolean数据类型和float数据类型

Java数据类型教程 - Java boolean数据类型 布尔数据类型只有两个有效值:true和false。 这两个值称为布尔值字面量。 我们可以使用布尔值字面量 boolean done; // Declares a boolean variable named done done true; // Assigns true to done布尔变量不能转换为任何其他…

Unity按键表大全

Unity键值对应表# KeyCode是由Event.keyCode返回的。这些直接映射到键盘上的物理键&#xff0c;以下是键值对应列表&#xff1a; 常用键# Backspace 退格键 Delete Delete键 TabTab键 Clear Clear键 Return 回车键 Pause 暂停键 Escape ESC键 Space 空格键 小键盘# …