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

C经典小游戏之扫雷

编译环境:VS022

目录

1.算法思路

2.代码模块

   2.1 game.h

   2.2 game.cpp

   2.3 test.cpp

3.重点分析

4.金句省身


1.算法思路

         主要采用二维数组进行实现,设置两个二维数组,一个打印结果,即为游戏界面显示的效果,一个用来存放雷的位置信息,在判断玩家想要查看的坐标时,通过对比雷的位置信息数组来在显示的数组里来输出信息,在输出信息时,如果该坐标的八个方向上都没有雷,就会以该坐标为中心,展开附近的所有的安全区(类似于bfs),此处呢,我也是用了普通递归和bfs两种方法来展开安全区,详细思路请见代码。

2.代码模块

   2.1 game.h

//game.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <bits/stdc++.h>
#include <Windows.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2//空出来两行是为了防止数组越界访问
#define COLS COL+2//初始化棋盘
void init(char board[ROWS][COLS], int rows, int cols,char ch);//打印棋盘
void display(char board[ROWS][COLS], int row, int col);//布置雷
void setmine(char board[ROWS][COLS], int row, int col, int difficulty_selection);//排查雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//递归遍历展开安全区方法1
void dfs(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);//递归遍历展开安全区方法2
void bfs(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);

2.2 game.cpp

//game.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
using namespace std;
//初始化棋盘
void init(char board[ROWS][COLS], int rows, int cols,char ch)
{memset(board,ch, rows * cols * sizeof(char));
}//打印棋盘
void display(char board[ROWS][COLS], int row, int col)
{//可以先打印行列号便于区分printf("******  扫雷  ******\n");for (int i = 0; i <= col; i++)printf("%d ", i);printf("\n");for (int i = 1; i <= row; i++){printf("%d ", i);for (int j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}//布置雷
void setmine(char board[ROWS][COLS], int row, int col,int  difficulty_selection)
{int count = difficulty_selection ? 10 : 25;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}//(x,y)坐标上雷的数量
int countmine(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');}//对于周围不存在雷的坐标加以递归遍历到边界处(存在雷的地方),也就是展开安全区void bfs(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{int dx[8] = {-1,0,1,1,1,0,-1,-1};//分别表示八个方向的方向数组int dy[8] = {1,1,1,0,-1,-1,-1,0};//标记数组,用于判断是否已经被访问queue<pair<int, int>> m;m.push({ x,y });while (!m.empty()){int tempx = m.front().first;int tempy = m.front().second;m.pop();for (int i = 0; i < 8; i++){int xx = tempx + dx[i];int yy = tempy + dy[i];if (xx >= 1 && xx <= ROW && yy >= 1 && yy <= COL && show[xx][yy] == '*'){int k = countmine(mine, xx, yy);if (!k){show[xx][yy] = '0';m.push({ xx,yy });}elseshow[xx][yy] = k + '0';}}}
}
/*
void dfs(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{int count= countmine(mine, x, y);if (!count)//展开安全区{show[x][y] = '0';for (int i = x - 1; i <= x + 1; i++)for (int j = y - 1; j <= y + 1; j++){if (i >= 1 && i <= ROW && j >= 1 && j <= COL && show[i][j] == '*' && mine[i][j] != 1)dfs(mine, show, i, j);}}elseshow[x][y] = '0' + count;
}
*/
//排查雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x, y;while (1){printf("请输入要排查的目标坐标:->\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");printf("\n说明:其中数字\"1\"表示雷,数字\"0\"表示非雷\n");display(mine,ROW,COL);Sleep(5000);break;}else{//该坐标不是雷int count = countmine(mine, x, y);show[x][y] = count + '0';if(count==0){ //运用两种方法遍历到边界处,前一种试过的已经加了注释//dfs(mine, show, x, y);bfs(mine, show, x, y);}display(show, ROW, COL);}}elseprintf("坐标输入有误,请重新输入\n");}
}

2.3 test.cpp

//test.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"void menu()
{printf("********************************\n");printf("******     1.   play      ******\n");printf("******     0.   exit      ******\n");printf("********************************\n");
}
void game()
{char mine[ROWS][COLS]={0};//表示实际上的布雷情况char show[ROWS][COLS]={0};//表示显示在控制台上的界面int difficulty_selection = 0;
again:printf("请选择游戏难度->\n");printf("********************\n");printf("*****EASY---PLAY INPUT THR NUMBER \"1\"\n");printf("*****DIFFICULTY ---PLAY INPUT THE NUMBER \"0\"\n");printf("********************\n");scanf("%d", &difficulty_selection);if (difficulty_selection != 0 && difficulty_selection != 1){printf("\n选择错误,请重新选择->\n\n");goto again;}//初始化棋盘init(mine, ROWS, COLS,'0');init(show, ROWS, COLS,'*');//打印棋盘//display(mine, ROW, COL);display(show, ROW, COL);//布置雷的信息setmine(mine,ROW,COL, difficulty_selection);//display(mine, ROW, COL);//排查雷findmine(mine,show,ROW,COL);
}
int main()
{int input;srand((unsigned int)time(NULL));do {system("cls");menu();printf("请选择:->");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

3.重点分析

        bfs和dfs的两种递归,对于学过数据结构或者之前有了解的人比较友好,其实这两者本质上是递归的应用,dfs基本和递归没什么区别,简单说一下bfs,大多数情境下,bfs在配合C++的STL中的栈或者队列来使用(当然dfs是可以直接用c来实现的,在代码中也有体现),通过将初始元素压入队,对队中的元素依次进行判断,再将判断后符合入队条件的元素再次入队,当然,也要将该层的元素出队并做好不再参与入队的标记,当队列为空时,即是递归到达了截止条件,向外层的扩展得以结束。

4.金句省身

        有志少年,先谋生而后谋爱,唯有父母和前程不可辜负,想想你往那些虚拟的世界里扔出的金钱,再想想父母的努力,醒醒吧,如果一单648能让你觉醒的看清资本家的嘴脸,那么这单是值得的,如果你的父母依旧辛苦,那么我们长大的意义又在哪里?变好的过程都不太舒服,试试再努力点。加油,为你也为我...

         

 

相关文章:

C经典小游戏之扫雷

编译环境&#xff1a;VS022 目录 1.算法思路 2.代码模块 2.1 game.h 2.2 game.cpp 2.3 test.cpp 3.重点分析 4.金句省身 1.算法思路 主要采用二维数组进行实现&#xff0c;设置两个二维数组&#xff0c;一个打印结果&#xff0c;即为游戏界面显示的效果&#xff0c;一个用…...

第十节 使用设备树插件实现RGB 灯驱动

Linux4.4 以后引入了动态设备树&#xff08;Dynamic DeviceTree&#xff09;&#xff0c;我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中&#xff0c;并被内核识别。例如我们要在系统中增加RGB 驱动&#xff0c;那么我们可以针对R…...

【LeetCode】公交路线 [H](宽度优先遍历)

815. 公交路线 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&#xff0c;第 i 辆公交车将会在上面循环行驶。 例如&#xff0c;路线 routes[0] [1, 5, 7] 表示第 …...

报表生成器 FastReport .Net 用户指南 2023(十):Band的属性

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…...

DAMA数据管理知识体系指南之文档和内容管理

第10章 文档和内容管理 10.1 简介 文档和内容管理是对存储在关系数据库以外的信息的采集、存储、访问以及使用的控制活动。文档和内容管理的侧重点在完整性和访问控制上。因此&#xff0c;它与关系数据库的数据操作管理大致相同。由于多数非结构化数据与存储在结构化文件中的…...

C++入门:数据结构

C/C 数组允许定义可存储相同类型数据项的变量&#xff0c;但是结构是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许您存储不同类型的数据项。结构用于表示一条记录&#xff0c;假设您想要跟踪图书馆中书本的动态&#xff0c;您可能需要跟踪每本书的下列属性&#x…...

C语言实现烟花表白,内含源码!!

虽然现在看烟花有一定难度&#xff0c;但代码式烟花可以随时随地看&#xff01; 烟花的代码很多&#xff0c;实际上是可以用 Python、HTML5 等语言写烟花&#xff0c;但今天主要想和大家分享用C语言写的烟花代码&#xff0c;非常细致和实用。 同学们一定要亲自敲一遍&#xf…...

虚拟机安装CentOS 7(带界面)

目录 一、虚拟机安装CentOS 7&#xff08;带界面&#xff09; 1、打开下好的VMware&#xff0c;点击创建虚拟机 2、下一步 3、点击下一步 4、选择Linux&#xff0c;ContOS7&#xff0c;点击下一步 5、修改虚拟机名称和路径 6、下一步 7、点击自定义硬件 8、设置虚拟机大…...

Java测试——selenium具体操作

selenium的前置准备工作可以参考我之前的博客&#xff1a;Java测试——selenium的安装与使用教程 这篇博客讲解一下selenium的常见操作 先创建driver ChromeDriver driver new ChromeDriver();输入网址 driver.get("https://www.baidu.com");常见操作 查找元素…...

电子器件系列32:逻辑与门芯片74LS11

一、编码规则 先看看这个代码的意思&#xff1a;74LS11 74是一个系列&#xff08;74 表示为工作温度范围&#xff0c;74: 0 ~ 70度。&#xff09; ls的意思就是工艺类型&#xff08;Bipolar(双极)工艺&#xff09; 11是代码 什么是74系列逻辑芯片&#xff1f; - 知乎 什么是…...

LeetCode-101. 对称二叉树

目录题目分析递归法题目来源 101. 对称二叉树 题目分析 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01; 对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与右子树是不是相互翻转的&#xff0c;理解这一…...

使用intlinprog求解指派问题MATLAB代码分享

% 输入指派矩阵C [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];f C(:); %生成一个列向量&#xff0c;作为目标函数系数&#xff0c;matlab默认以列排序[m,n] size(C);Aeq zeros(2*n,n*n); %2*n个等式约束&#xff0c;n*n个变量for i 1:n %这里先生成的是后5个…...

Spark On YARN时指定Python版本

坑很多&#xff0c;直接上兼容性最佳的命令&#xff0c;将python包上传到hdfs或者file:/home/xx/(此处无多余的/) # client 模式 $SPARK_HOME/spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --conf "spark.yarn.dist.archives<Python包…...

[数据库]库的增删改查

●&#x1f9d1;个人主页:你帅你先说. ●&#x1f4c3;欢迎点赞&#x1f44d;关注&#x1f4a1;收藏&#x1f496; ●&#x1f4d6;既选择了远方&#xff0c;便只顾风雨兼程。 ●&#x1f91f;欢迎大家有问题随时私信我&#xff01; ●&#x1f9d0;版权&#xff1a;本文由[你帅…...

Wine零知识学习1 —— 介绍

一、什么是Wine Wine是“Wine Is Not an Emulator” 的首字母缩写&#xff0c;是一个能够在多种POSIX-compliant操作系统&#xff08;诸如Linux、macOS及BSD等&#xff09;上运行 Windows 应用的兼容层。Wine不像虚拟机或者模拟器那样模仿内部的Windows逻辑&#xff0c;而是將…...

设计模式--建造者模式 builder

设计模式--建造者模式 builder&#xff09;建造者模式简介建造者模式--小例子&#xff08;电脑购买&#xff09;1.产品类2.抽象构建者3.实体构建类4.指导者类5.客户端测试类小结建造者模式简介 建造者模式有四个角色,概念划分如下&#xff1a; Product &#xff1a; 产品类&a…...

终于周末啦,继续来总结一下Python的一些知识点啦

目录 Python概念梳理 常见概念梳理 Python经典判断题 判断题 选择题 Python概念梳理 常见概念梳理 Python中&#xff0c;不仅仅变量的值是可以变化的&#xff0c;类型也是可以随时变化的 1、Python的变量必须初始化否则提示 is not defined 2、if、while中定义的变量在…...

CUDA By Example(八)——流

文章目录页锁定主机内存可分页内存函数页锁定内存函数CUDA流使用单个CUDA流使用多个CUDA流GPU的工作调度机制高效地使用多个CUDA流遇到的问题(未解决)页锁定主机内存 在之前的各个示例中&#xff0c;都是通过 cudaMalloc() 在GPU上分配内存&#xff0c;以及通过标准的C库函数 …...

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …...

less常用语法总结

CSS预处理器 CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题: 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器;没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...