编程学习 (C规划) 6 {24_4_18} 七 ( 简单扫雷游戏)
首先我们要清楚扫雷大概是如何实现的:
1.布置雷
2.扫雷(排查雷)
(1)如果这个位置是雷就炸了,游戏结束
(2)如果不是雷,就告诉周围有几个雷
3.把所有不是雷的位置都找到,剩下的都是雷,游戏结束
我们先来看文件的创建以及赋予他们的作用是什么

那么大致清楚了方向,我们就开始进行第一步了
第一步:先在 test.c 中写出游戏的菜单

在这里我们可以想一下,在扫雷中我们可以把开始扫雷的界面看成一个二维数组

就像这里我们可以创建一个 9 * 9 的二维数组mine[ 9 ][ 9 ]

在这里思考一个问题:如果不是雷那么就在格子里放一个0,是雷就放1,但是如果排查出某一个地方不是雷,但是周围有一颗雷,就容易混淆,即使用*代替雷,#代替非雷,可以实现扫雷,但是代码处理起来会很占内存。
那么这里提供一个新的思路:

就是创建两个一样大小的二维数组一个存放雷的信息,另一个存放排查出的雷的信息(就是周围有几个雷放在这里)
在这里又遇到一个新的问题:

就是如果在上图这个位置要排查这个位置的雷的信息时会越界访问,总不能是在排查位置之前先判断该位置的坐标周围有无越界然后实现不同的排查方式吧?
那么在此提供一个新的思路:
可以将存放类的面板以及存放排查出的雷的信息的面板再扩大一圈,同时保证放雷时仅再原来扩大之前的面板上放雷。

在这里我打算将未排查过的地方放 ' * ' ,查过的地方就放周围的雷的个数,所以使用char类型的数组会更好一些,由于两个面板的数组类型的创建为一致的话会更方便一些,所以两个数组都选择创建成char类型的数组。
这里明确一下下面几步的思路:
1.使用2个二维数组来实现
2.如果棋盘大小为 9 * 9 ,数组大小就应该为 11 * 11
3.数组统一使用字符数组
接下来我们再test.c文件的game函数中创建了如下的数组

但是想扩大缩小范围的话改起来比较麻烦,而VS不支持变长数组,那么可以创建一个宏定义:
可以在game.h中定义:

此时game()中应如下创建数组:

在此如果想使用game.c中的宏定义那么test.c中应包含头文件#include"game.h"
下一步我们就应该初始化棋盘了:

game.h中声明如下:
![]()
在这里应注意:game.h中已定义宏ROWS与COLS所以创建Initboard函数中不能再创建ROWS、COLS了,所以应该用小写区分开
game.c中实现如下:
首先不要忘记包含头文件#include"game.h"

下一步就要打印棋盘了:
test.c中我们使用一下:

注意哦,上面第二个图是放雷的信息,玩的时候不要打印哦
game.h中声明如下:

这里注意:show数组已经创建为ROWS*COLS的数组了,所以传的时候应用ROWS*COLS相同大小的数组来接收。
game.c中实现如下:


在此跑程序时可以发现打印show棋盘时不容易看出棋盘有几行几列,所以修改一下DisplayBoard函数,添加上行和列的信息:


接下来进行下一步:布置雷
在test.c中使用如下:
![]()
game.h中声明:
![]()
game.c中实现如下:

在此若想更改难度,也就是雷的个数,可以在game.h中定义一个宏:
![]()
后在void SetMine中将 int count 改为 int count = EAZY_COUNT

若想查看雷是否真的布置成功,可在test.c中布置雷的后面使用一下函数 Display Board(mine,ROW,COL)用来查看雷的分布

对了不要忘了rand的种子srand的设置

下一步实现排查雷:
排查雷的思路:
1.输入一个坐标
2.判断这个坐标是否越界
3.判断这个位置是不是雷
(1)是雷就炸死,游戏结束
(2)不是雷就统计其周围雷的个数
test.c中使用:
![]()
game.h中声明:
![]()
game.c中实现:

这里我们思考一下(x,y)坐标周围雷的坐标:

这样就好办了把所有坐标加起来就好了,但是我们要知道往mine中存放的雷是字符 ‘ 1 ’ 而不是数字 ‘ 1 ’ 要想将字符 ‘ 1 ’ 转换成数字1可以这样用 ‘ 1 ’ - ‘ 0 ’ = 1因为 ‘ 1 ’的ASCII码值为49 ‘ 0 ’的ASCII码值为48所以可以把所有坐标相加减去字符 ‘ 0 ’
在game.h中声明:

如果理解以上做法故而可以简化为:

到这里这个扫雷程序还差一步,就是将所有非雷的格子都排完后还无法显示游戏结束。
这里我们可以想一下,在该 9 * 9 的格子中有10个雷,只要把另外71个非雷的格子找到后就判定扫雷成功:
可以修改一下函数FindMine

好了到了这里这个扫雷程序就大致写完了
下面我分别把我写的game.c文件test.c文件以及game.h文件分享给大家:
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{//注意这里是要把所有格子初始化int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-----------扫雷-----------\n");int i = 0;for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;int x = 0;int y = 0;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] != '1'){mine[x][y] = '1';//布置一个雷count--;}}
}int GetMineCount(char mine[ROWS][COLS], int x, int y)
{int i = 0;int count = 0;for (i = -1; i <= 1; i++){int j = 0;for (j = -1; j <= 1; j++){count += (mine[x + i][y + i] - '0');}}return count;
}//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x, y;int win = 0;while (row * col - EASY_COUNT){printf("请输入要排查的坐标");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判断是否越界{if (mine[x][y] == '1')//输入的位置是雷{printf("对不起,你踩雷了,游戏结束");break;}else { //看周围雷的个数int count = GetMineCount(mine, x, y);show[x][y] = count + '0';//因为count是数字放置char数组中用%c打印时会打印成相应的ASCII码值的字符DisplayBoard(show, ROW, COL);win++;}}else{printf("输入的坐标有误,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!!!\n");}else{printf("很抱歉,排雷失败\n本局中雷的布局为:");DisplayBoard(mine, ROW, COL);}}
test.c
#define _CRT_SECURE_NO_WARNINGS 1//先写菜单
//test.c
#include"game.h"
void menu()
{printf("##########################\n");printf("####### 1. 开始游戏 ######\n");printf("####### 0. 退出游戏 ######\n");printf("##########################\n");}void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');//打印棋盘DisplayBoard(show, ROW, COL);//DisplayBoard(mine, ROW, COL);//这是雷的信息,玩的时候别打印//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//这是布置好的雷的信息,玩的时候别打印//排查雷FindMine(mine, show, ROW, COL);
}void test()
{int input;do {menu();printf("请选择:》");scanf("%d",&input);switch(input){case 1:game();//扫雷实现break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重输\n");break;}} while (input);}
int main()
{srand((unsigned int)time(NULL));test();return 0;
}
game.h
#define _CRT_SECURE_NO_WARNINGS 1#pragma
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define EASY_COUNT 10#define ROW 9 //行 9
#define COL 9 //列 9#define ROWS ROW+2
#define COLS COL+2//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//注意show的数组已经创建为ROWS*COLS的数组了
//所以传的时候应使用ROWS*COLS大小的数组来接收//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//看周围雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y);
好了是时候该跟大家说再见了,拜拜!!!
相关文章:
编程学习 (C规划) 6 {24_4_18} 七 ( 简单扫雷游戏)
首先我们要清楚扫雷大概是如何实现的: 1.布置雷 2.扫雷(排查雷) (1)如果这个位置是雷就炸了,游戏结束 (2)如果不是雷,就告诉周围有几个雷 3.把所有不是雷的位置都找…...
【AI】llama-fs的 安装与运行
pip install -r .\requirements.txt Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows(venv) PS D:\XTRANS\pythonProject>...
Android NDK系列(五)内存监控
在日常的开发中,内存泄漏是一种比较比较棘手的问题,这是由于其具有隐蔽性,即使发生了泄漏,很难检测到并且不好定位到哪里导致的泄漏。如果程序在运行的过程中不断出现内存泄漏,那么越来越多的内存得不到释放࿰…...
软件设计师,下午题 ——试题六
模型图 简单工厂模式 工厂方法模式抽象工厂模式生成器模式原型模式适配器模式桥接模式组合模式装饰(器)模式亨元模式命令模式观察者模式状态模式策略模式访问者模式中介者模式 简单工厂模式 工厂方法模式 抽象工厂模式 生成器模式 原型模式 适配器模式 桥…...
《Kubernetes部署篇:基于麒麟V10+ARM64架构部署harbor v2.4.0镜像仓库》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 一、环境信息 K8S版本 操作系统 CPU架构 服务版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…...
远程工作/线上兼职网站整理(数字游民友好)
文章目录 国外线上兼职网站fiverrupwork 国内线上兼职网站甜薪工场猪八戒网云队友 国外线上兼职网站 fiverr https://www.fiverr.com/start_selling?sourcetop_nav upwork https://www.upwork.com/ 国内线上兼职网站 甜薪工场 https://www.txgc.com/ 猪八戒网 云队友 …...
elasticsearch7.15实现用户输入自动补全
Elasticsearch Completion Suggester(补全建议) Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能,引导用户在输入时找到相关结果,提高搜索精度。 理想情况下,自动补…...
掌握正则表达式的力量:全方位解析PCRE的基础与进阶技能
Perl 兼容正则表达式(PCRE)是 Perl scripting language 中所使用的正则表达式语法标准。这些正则表达式在 Linux 命令行工具(如 grep -P)及其他编程语言和工具中也有广泛应用。以下是一些基础和进阶特性,帮你掌握和使用…...
FastFM库,一款强大神奇的Python系统分析预测的工具
FastFM库概述 在机器学习领域,Factorization Machines(FM)是处理稀疏数据集中特征间交互的重要工具.Python的fastFM库提供了高效的实现,特别适合用于推荐系统、评分预测等任务.本文将全面介绍fastFM的安装、特性、基本和高级功能,并结合实际应用场景展示…...
R语言绘图 --- 饼状图(Biorplot 开发日志 --- 2)
「写在前面」 在科研数据分析中我们会重复地绘制一些图形,如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包(Biorplot),用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…...
用于日常任务的实用 Python 脚本
Python 是一种多功能编程语言,以其简单易读而闻名。它广泛应用于从 Web 开发到数据分析等各个领域。Python 脚本,它们可以通过自动执行常见任务来使您的生活更轻松。 用于日常任务的实用 Python 脚本 1. 使用 Pandas 进行数据分析2. 使用 BeautifulSoup …...
7-Zip是什么呢
1. 简介 7-Zip 是一个功能强大、免费开源的文件压缩和解压缩工具,适用于个人用户和企业用户,可以在多种操作系统上进行使用,并且支持广泛的压缩格式和高级功能。 2. 特点与优势 开源免费:7-Zip 是免费的开源软件,可…...
Satellite Stereo Pipeline学习
1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况,基本上哪个包出问题…...
linux-gpio
在Linux shell中测试GPIO通信,通常需要使用GPIO的设备文件,这些文件通常位于/sys/class/gpio目录下。要使用特定的GPIO引脚,比如GPIO92,你需要执行以下步骤: 导出GPIO引脚:首先,需要确保GPIO92已…...
C# 代码配置的艺术
文章目录 1、代码配置的定义及其在软件工程中的作用2、C# 代码配置的基本概念和工具3、代码配置的实践步骤4、实现代码配置使用属性(Properties)使用配置文件(Config Files)使用依赖注入(Dependency Injection…...
268 基于matlab的模拟双滑块连杆机构运动
基于matlab的模拟双滑块连杆机构运动,并绘制运动动画,连杆轨迹可视化输出,并输出杆件质心轨迹、角速度、速度变化曲线。可定义杆长、滑块速度,滑块初始位置等参数。程序已调通,可直接运行。 268 双滑块连杆机构运动 连…...
进口铝合金电动隔膜泵
进口铝合金电动隔膜泵是一种高效、可靠的工业泵,其特点、性能与应用广泛,以下是对其的详细分析: 特点 材质与结构: 采用铝合金材料制造,具有良好的耐腐蚀性和轻量化特点。铝合金材质使得泵体结构紧凑、轻便ÿ…...
G4 - 可控手势生成 CGAN
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 代码总结与心得 代码 关于CGAN的原理上节已经讲过,这次主要是编写代码加载上节训练后的模型来进行指定条件的生成 图像的生成其实只需要使用…...
使用 DuckDuckGo API 实现多种搜索功能
在日常生活中,我经常使用搜索引擎来查找信息,如谷歌和百度。然而,当我想通过 API 来实现这一功能时,会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容,并…...
【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目
文章目录 DrissionPage爬虫库简介1. 浏览器操控模式(类似于游戏中的后台模拟鼠标键盘)2. 数据包收发模式(类似于游戏中的协议封包) 实战中学习需求:爬取Gitee开源项目的标题与描述解决方案1:用数据包方式获…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
