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

各位少年,大家好,我是博主那一脸阳光,我们学会了数组,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.hqwc.cn/news/338614.html

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

相关文章

【Github-Action】GithubAction 环境下,如何将临时生成的文件推送至指定分支。

通过这篇文章你可以掌握如何将github action 环境下临时生成的文件推送至指定分支&#xff0c;并且可以打开利用github开放的api做各种强大或有趣的事情的视野和思路。 如果你对github-action感兴趣&#xff0c;还可以看这篇文章&#xff0c; 这篇文章教会你如何开发Github Act…

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

064:vue中一维数组的全选、全不选、反选(图文示例)

第061个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Type-C PD充电器受电端sink诱骗取电汇总:小家电应用5V9V12V15V20V28V

小家电产品、美容产品、电动产品等升级采用Type-C接口&#xff0c;在Type-C接口上使用Type-C取电芯片&#xff0c;即可使用快速充电器的5V、9V、12V、15V、20V供电&#xff0c;无需再配充电器&#xff0c;各类品牌的充电器都可以支持。目前充电器常见的USB-PD功率为&#xff1a…

k8s的存储卷、数据卷

容器内的目录和宿主机目录进行挂载。 容器在系统上的生命周期是短暂的。 k8s用控制器创建的pod。delete相当于重启。容器的状态也会恢复到初始状态。一旦恢复到初始状态&#xff0c;所有的后天编辑的文件都会消失 容器和节点之间创建一个可以持久化保存容器内文件的存储卷。…

QML实现的图片浏览器

很久之前实现了一个QWidget版本的图片浏览器:基于Qt5的图片浏览器QHImageViewer 今天用QML也实现一个,功能差不多: ●悬浮工具栏 ●支持图片缩放、旋转、还原、旋转、拖动。 ●拖动图片时,释放鼠标图片会惯性滑动。 ●支持左右翻页查看文件夹中的图片。 ●支持保存图片至本…

Linux网络编程(一-网络相关知识点)

目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信&#xff0c;任何数字通信都离…

D55XT100-ASEMI电机专用整流桥D55XT100

编辑&#xff1a;ll D55XT100-ASEMI电机专用整流桥D55XT100 型号&#xff1a;D55XT100 品牌&#xff1a;ASEMI 封装&#xff1a;DXT-4 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;55A 最大反向击穿电压&#xff08;VRM&#xff09;&#xff1a;1000V 产品引…

02.构建和使用的大型语言模型(LLMs)阶段

我们为什么要建立自己的LLMs?LLM从头开始编码是了解其机制和局限性的绝佳练习。此外,它还为我们提供了必要的知识,可以保留或微调现有的开源LLM架构,以适应我们自己的特定领域的数据集或任务。 研究表明,在建模性能方面,定制(LLMs为特定任务或领域量身定制的)可以胜过…

最新版CleanMyMac X4.14.7智能清理mac磁盘垃圾工具

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff0c;…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷&#xff0c;但现有研究成果主要集中在财务业务单一领域&#xff0c;缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理&#xff0c;无论从自身技术发展&#xff0c;或…

112.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图&#xff1a; 常用的窗口类有3个 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的…