数组和函数实践:扫雷游戏玩法和棋盘初始化(1)

news2025/4/5 0:26:18

各位少年,大家好,我是博主那一脸阳光,我们学会了数组,exturn声明外部文件,static修饰静态变量,那么很显然,我们需要用到我们学习这些,实现一个扫雷游戏。

扫雷游戏介绍以及玩法

在这里插入图片描述
在地图上布置十个雷
排查雷:如果位置是雷,就炸死了,游戏结束,不是雷,就统计 :就统计周围雷的个数,并显示。
请添加图片描述
在这里插入图片描述
这个1表示周围格子有雷,如果把所有非雷的位置找到,游戏结束,如果碰到雷游戏结束。
在这里插入图片描述

如何实现9*9扫雷

数据的分析和设计

数据结构的分析
扫雷过程中,布置雷和排查除的雷信息都需要存储,所以我们需要一定的数据结构来存储这些信息,因为我们需要在99的棋盘上布置的信息和排查雷,我们首先想到的就是创建一个99的数组来存放信息。

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

在这里插入图片描述
那问题出来了,如果说我们要访问第0行第0列,我们知道一个方块等排查旁边一个元素,那么很显然,这里出现了越界。所以说要创建11杠11的模块来实现。

多文件的使用

我们在写一性大型游戏的时候,往往需要N多行代码,比如说这个比较小众的扫雷,就需要两百块C语言代码,我们才能达到最总目的
在这里插入图片描述
我们主要分为这三个模块性,来帮我们实现扫雷这个游戏的代码,我们会使用到自定义头文件,使用多文件会让我们代码更加方面简介,易修改。
在这里插入图片描述
我们创建了三个文件,然后我们来编写程序即可,test c我们放代码的文本,自定义函数在game。c中使用,然后放到test。c
game。h放头文件以及define定义,总之game点h是来测试游戏的。

#include<stdio.h>
void menu()
{
	printf("*******************\n");
	printf("******  1.play  ********\n");
	printf("******  0.exit  *********\n");
	printf("*******************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		priintf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("扫雷\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

do while:如果我们打开这个游戏,肯定要玩一次,先玩一次,玩完以后再判断do-while玩不玩下次的问题(1)代表false玩,0代表true假不玩,我们这里不需要多判断用switch语句是最好的。
好,我们把扫雷换成自定义函数game(),来实现这个游戏

#include<stdio.h>
void menu()
{
	printf("*******************\n");
	printf("******  1.play  ********\n");
	printf("******  0.exit  *********\n");
	printf("*******************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		priintf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			void game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数是1
假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三
个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的99的坐
标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成11
11
是⽐较合适。
排雷的假设 周围加上⼀圈的棋盘比较合适

在这里插入图片描述
我们多谢几行的方面性比写代码限制效率高,存放数据的类型太多,容易产生歧义,在统计一个坐标周围的雷的个数的时候,可能会越界。

雷的隐秘,没初始化。

我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某
⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录
存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布
置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。
这⾥我们肯定有办法解决,⽐如:雷和⾮雷的信息不要使⽤数字,使⽤某些字符就⾏,这样就避免冲
突了,但是这样做棋盘上有雷和⾮雷的信息,还有排查出的雷的个数信息,就⽐较混杂,不够⽅便。
这⾥我们采⽤另外⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再
给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到
mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期
排查参考。
同时为了保持神秘,show数组开始时初始化为字符 ‘*’,为了保持两个数组的类型⼀致,可以使⽤同⼀
套函数处理,mine数组最开始也初始化为字符’0’,布置雷改成’1’。如下

在这里插入图片描述

char mine[11] [11]//雷用1表示非雷0表示

在这里插入图片描述


```c
char show[11] [11]//雷用1表示非雷0表示
```对应的数组应该是:
char mine[11][11] = {0};//⽤来存放布置好的雷的信息
char show[11][11] = {0};//⽤来存放排查出的雷的个数信息
大家想象,如果想玩大点的扫雷游戏,不要九乘九了,要20*20是不是要更改的很麻烦
所以说这里来头文件定义两个宏
game.H
#define ROW 9
#define COL 9//后面会使用
#define ROWS ROW+2
#define COLS 11
void game()
{
char mine[ROWS][COLS]
char show[ROWS][COLS]
}

这样方便了不少,我们修改上面的宏改变整个数组的大小,改变扫雷游戏的大小。

初始化棋盘

我们写一个自定义函数 来把这个扫雷的棋盘初始化,写出来,我们自定义一个InitBoard函数,给他传三个参数

InitBoard(mine,ROWS,COLS);

你要初始化布置雷的数组你也要初始化,隐藏数组show

InitBoard(show,ROWS,COLS);

game.h这里需要放一个函数的声明,如果以后后期改游戏配置会在game头文件中更改

void InitBoard(char arr[ROWS][COLS], int rows, int cols);

然后我们在game .c里实现

#include"game.h"
void InitBoard(char arr[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = 0;
		}
	}
}

那问题出来了,我们得初始化o,那么*就是遮住棋盘的符号怎么打印呢?再写一个,是可以的,但是有点挫,那我们如何用一个game点c的模板,完成两个数组的初始化呢?那我们再传入一个参数**或者0传进去
test。c

void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	InitBoard(mine, ROWS, COLS,'0');
	InitBoard(show, ROWS, COLS,'*');

}

game .c

#include"game.h"

void InitBoard(char arr[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++)
		{
			arr[i][j] = set;
		}
	}
}

.game.h

```c
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);

我们实现了扫雷棋盘的打印,通过循环的方式把扫雷的基本模型实现了,但是我们得打印出来呀?判断输赢呀?
由于篇幅的问题,我们只能下篇分析介绍

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

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

相关文章

idea git回滚之前提交记录

提交代码时&#xff0c;如果不小心提交了不需要提交的内容&#xff0c;在本地仓库中&#xff0c;此时需要回滚版本&#xff0c;如何回滚 1.打开git控制台&#xff0c;左下角git,选择要处理的分支&#xff0c;选择刷新获取最新git提交记录 2&#xff09;选中自己commit需要回滚…

计算机导论03-计算机组成

计算机系统结构 冯•诺依曼体系结构 冯•诺依曼体系结构的基本要点 冯•诺依曼思想即冯•诺依曼体系结构思想&#xff0c;其最基本的概念是存储程序概念&#xff0c;它奠定了现代计算机的结构基础。 功能部件: 计算机必须具备五大基本组成部件&#xff0c;包括&#xff1a;运…

【读书笔记】学习突围

最近在读一本书《学习突围》&#xff0c;作者是常青&#xff0c;知乎大V。对他的一些回答非常认同&#xff0c;受益匪浅&#xff0c;特此买来纸质书籍细细学习一番&#xff01; 1.【学习心态】&#xff08;拖延症、自控、执行力、专注力&#xff09; 2.【学习方法】&#xff0…

[后端] 微服务的前世今生

微服务的前世今生 整体脉络: 单体 -> 垂直划分 -> SOA -> micro service 微服务 -> services mesh服务网格 -> future 文章目录 微服务的前世今生单一应用架构特征优点&#xff1a;缺点&#xff1a; 垂直应用架构特征优点缺点 SOA 面向服务架构特征优点缺点 微服…

Vue入门四(组件介绍与定义|组件之间的通信)

文章目录 一、组件介绍与定义介绍定义1&#xff09;全局组件2&#xff09;局部组件 二、组件之间的通信1&#xff09;父组件向子组件传递数据2&#xff09;子传父通信 一、组件介绍与定义 介绍 组件(Component)是Vue.js 最强大的功能之一&#xff0c;它是html、css、js等的一个…

bootstrap搭建一个简单的官网案例附代码

bootstrap搭建一个简单的官网案例附代码 效果常用属性完整代码 效果 大概的效果如下 主要都是用bootstrap的代码实现的 网站是照着 b站视频做的 查看视频教程 建议自己先看一遍文档再跟着视频写&#xff0c;不然可能看不懂 bootstarp中文文档 logo是从别人的站上扒的有点不太协…

走进shell

Linux系统启动时&#xff0c;会自动创建多个虚拟控制台。虚拟控制台是运行在Linux系统内存中的终端会话。 打开Linux控制台Terminal使用tty命令查看当前使用的虚拟控制台。 注&#xff1a;tty 表示电传打字机(teletypewriter) $ tty /dev/pts/0表示当前使用的是/dev/pts/0 虚拟…

Python从入门到网络爬虫(23个Python开源项目)

前言 随着互联网的快速发展&#xff0c;大量的信息被不断地产生和积累&#xff0c;这也使得网络爬虫变得越来越重要。而Python作为一门高效、易用的编程语言&#xff0c;被广泛地应用于网络爬虫领域。本文将从多个角度分析Python开源爬虫项目的优缺点、应用场景以及未来发展方…

【AI之路】使用huggingface_hub通过huggingface镜像站hf-mirror.com下载大模型(附代码,实现大模型自由)

文章目录 前言一、Hugging face是什么&#xff1f;二、huggingface镜像站hf-mirror.com三、大模型一键下载1. 准备工作2. 下载代码 总结后记 前言 要玩AI大模型&#xff0c;Hugging face 不可错过&#xff0c;但资源虽不错&#xff0c;可奈何国内下载速度很慢&#xff0c;动则…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中&#xff0c;有些数据需要远程调用&#xff0c;导致查询时间缓慢&#xff0c;影响以下代码逻辑运行&#xff0c;并且这些浪费时间的逻辑与以后的请求并没有关系&#xff0c;这样会大大增加服务的时间。 假如商品详情页的每个查询&#xff0c;需要如下…

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而实习管理…

老铁,请收藏!IT人必备13个在线工具

本文根据很多很多大牛程序员分享&#xff0c;还请教了身边的资深职场人&#xff0c;给大家总结了一份大咖推荐的超实用网站合集&#xff0c;包含工具类和提效类&#xff0c;赶上要做年终汇报和来年计划的档口&#xff0c;80%你都用得上&#xff01; 先收藏&#xff0c;有需要随…

“第四个中国人民警察节”细语

今&#xff08;2024年1月10日&#xff09;天&#xff0c;是第四个中国人民警察节&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《一起致敬人民警察&#xff01;》。 图&#xff1a;来源“人民体验官”推广平台 笔者认同“平安的密码叫110”这个洽当比喻。因为人民…

Android App打包加固后的APK无法安装问题

最近开发的一个应用要上架&#xff0c;正常流程打完包后去加固&#xff0c;由于以前一直用的是360的加固助手&#xff0c;这里开始也是选择用它。 使用360加固&#xff1a; 问题一、开始出现的问题是说应用未签名无法加固&#xff0c;我明明是签名后打的包&#xff0c;怎么会…

世邦 IP网络对讲广播系统 getjson.php接口存在任意文件读取漏洞

产品简介 SPON世邦IP网络对讲广播系统是一种先进的通信解决方案&#xff0c;旨在提供高效的网络对讲和广播功能。 漏洞概述 SPON世邦IP网络对讲广播系统getjson.php接口处存在任意文件读取漏洞&#xff0c;未经身份验证的攻击者可利用此漏洞读取敏感文件。 指纹识别 fofa:…

ROS2——发布和订阅

现在我们以主题 int_topic 和发布者 publisher_node 和订阅者 subscriber_node 为例子进行展开。 头文件 在调用各种消息类型时&#xff0c;需要先引用头文件&#xff0c;才能成功声明某一个消息类型的变量。 我们在写头文件时&#xff0c;需要将该类成员的大写字母转换成小写…

文献阅读1

A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images 会议/期刊&#xff1a;CVPR 2023&#xff1b;阿里达摩院&#xff1b;Biwen Lei 概述&#xff1a;这是一篇单张图片三维人脸重建的论文&#xff0c;这篇论文的…

LeetCode-棒球比赛(682)

题目描述&#xff1a; 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的。你会得到一个记录操作的字符串列表 ops&#xff0c;其中 ops[i] 是你需要记录的第…

STM32 使用 DS18B20 温度传感器实现环境温度监测

为了实现环境温度监测系统&#xff0c;我们可以利用STM32微控制器和DS18B20数字温度传感器。在本文中&#xff0c;我们将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据&#xff0c;并展示一个简单的示例代码。 1. 系统概述 环境温度监测系统旨在使用DS18B20数字温度…

ssm基于Web的汽车客运订票系统的设计与实现论文

毕业设计&#xff08;论文&#xff09; 汽车客运订票系统 姓 名 ______________________ 学 号 ______________________ 班 级 ______________________ 专 业 ______________________ 院 部 ______________________ 指导教师 ______________________ 年 月 日 目 录 目 录 …