基于C语言实现扫雷小游戏

扫雷游戏

  • 1. 扫雷游戏分析和设计
    • 1.1 扫雷游戏的功能说明
    • 1.2 游戏的分析和设计
    • 1.2.1 数据结构的分析
  • 2. 扫雷游戏的代码实现
  • 3. 扫雷游戏的扩展


1. 扫雷游戏分析和设计

1.1 扫雷游戏的功能说明

  • 使用控制台实现经典的扫雷游戏

  • 游戏可以通过菜单实现继续玩或者退出游戏

  • 扫雷的棋盘是9*9的格子

  • 默认随机布置10个雷

  • 可以排查雷

  • 如果位置不是雷,就显示周围有几个雷

  • 如果位置是雷,就炸死游戏结束

  • 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束

游戏的界面:

在这里插入图片描述

1.2 游戏的分析和设计

1.2.1 数据结构的分析

扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。

因为我们需要在9 * 9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个9 * 9的数组来存放信息。

空棋盘

在这里插入图片描述
如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

布置雷的棋盘

在这里插入图片描述
假设我们排查(2,5)这个坐标时,我们访问周围的一圈8个黄色位置,统计周围雷的个数是1

假设我们排查(8,6)这个坐标时,我们访问周围的一圈8个黄色位置,统计周围雷的个数时,最下面的三个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9 * 9的坐 标上,周围一圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11 * 11 是比较合适。

排雷的假设

在这里插入图片描述

周围加上一圈的棋盘

在这里插入图片描述
再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和非雷的信息(0),假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢?

如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。
这里我们肯定有办法解决,比如:雷和非雷的信息不要使用数字,使用某些字符就行,这样就避免冲突了,但是这样做棋盘上有雷和非雷的信息,还有排查出的雷的个数信息,就比较混杂,不够方便。

这里我们采用另外⼀种方案,我们专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。

同时为了保持神秘,show数组开始时初始化为字符’ * ‘,为了保持两个数组的类型⼀致,可以使用同⼀套函数处理,mine数组最开始也初始化为字符’0’,布置雷改成’1’。如下如:

mine数组布置雷后的状态

在这里插入图片描述

show输出初始化的状态

在这里插入图片描述
对应的数组应该是:

char mine[11][11] = {0}; //⽤来存放布置好的雷的信息
char show[11][11] = {0}; //⽤来存放排查出的雷的个数信息

2. 扫雷游戏的代码实现

text.h


#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>#define row 9
#define line 9
#define ROW 9
#define LINE 9void menu();//菜单函数
void game();//主游戏函数
void initialization(char (*board)[line],int a,int b, char element);//初始化函数
void SHOW(char(*board)[line], int a, int b);//打印元素
void LAY(char(*board)[line], int a, int b);//放置炸弹
int INSPECT(char(*board)[line], char(*board1)[line] ,int a, int b);//检查炸弹
int win(char(*board)[line], int a, int b);//获胜条件

text.c

#include "text.h"void menu()
{printf("******************************************************\n");printf("******************************************************\n");printf("**********1. 开始游戏*********0. 退出游戏*************\n");printf("******************************************************\n");printf("******************************************************\n");
}void initialization(char (*board)[line], int a, int b, char element)
{int i, j;for (i = 0; i < a; i++){for(j = 0 ; j < b ; j++ ){board[i][j] = element;}}
}void SHOW(char (*board)[line], int a, int b)
{int i, j;for (i = 0; i < a; i++){if (i == 0){for (j = 0; j <= b; j++)printf("%3d", j);printf("\n");}printf("%3d", i + 1);for (j = 0; j < b; j++){printf("%3c", board[i][j]);}printf("\n");}printf("\n");
}void LAY(char(*board)[line], int a, int b)
{int c = 0,d = 0,count = row;while (count){c = rand() % row + 1;d = rand() % line + 1;if (board[c][d] == '0'){board[c][d] = '1';count--;}}
}int INSPECT(char(*board)[line], char(*board1)[LINE], int a, int b)
{int c = 0, d = 0,e = 0,f = 0,count = 0;if (a + 1 >= ROW) c = a;else c = a + 1;if (b + 1 >= LINE) d = b;else d = b + 1;if (a - 1 < 0) e = a;else e = a - 1;if (b - 1 < 0) f = b;else f = b - 1;if (board[a][b] == '1'){printf("you loss \n");return 0;}else{for (int i = e; i <= c; i++){for (int j = f; j <= d ; j++){if (board[i][j] == '1'){count++;}else{board1[i][j] = '0';}}}printf("周围一共有%d的雷\n", count);SHOW(board1, row, line);}
}int win(char(*board)[line], int a, int b)
{int count = 0;for (int i = 0; i < a; i++){for (int j = 0; j < b; j++){if (board[i][j] == '*')count++;}}if (count == line){printf("you win\n");return 0;}else return 1;
}
void game()
{char chessboard[row][line], chessboardshow[ROW][LINE];int x = 0, y = 0,count = 1;printf("---------------扫雷游戏开始-----------------------\n");initialization(chessboard,row,line, '0');initialization(chessboardshow,ROW,LINE, '*');LAY(chessboard, row, line);SHOW(chessboardshow, row, line);while(count){printf("输入你需要排查的位置: \n" );scanf_s("%d%d", &x, &y, 2);if (x <= 0 && x >= row){printf("error\n");continue;}if (y <= 0 && y >= line){printf("error\n");continue;}count = INSPECT(chessboard,chessboardshow, x, y);count = win(chessboardshow, ROW, LINE);}
}

main.c

#include "text.h"int main()
{int a;srand((unsigned int)time(NULL));do{menu();scanf_s("%d", &a, 1);switch(a){case 1:game(); break;case 0:exit(0); break;default:continue;}} while (1);system("pause");return 0;
}

3. 扫雷游戏的扩展

  • 是否可以选择游戏难度 可以通过修改宏定义,来实现棋盘难度的选择

  • 简单 9*9 棋盘,10个雷

  • 中等 16*16棋盘,40个雷

  • 困难 30*16棋盘,99个雷

  • 是否可以标记雷 ——待完善

  • 是否可以加上排雷的时间显示 ——待完善

在线扫雷游戏


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

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

相关文章

React使用富文本CKEditor 5,上传图片并可设置大小

上传图片 基础使用&#xff08;标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片&#xff09; 官网查看&#xff1a;https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…

k8s系列文章一:安装指南

前言 k8s是docker的升级版&#xff0c;可用于docker集群配置管理微服务 一、更新ubuntu系统版本 sudo apt update sudo apt upgrade二、添加GPG密钥(阿里源) 尽管我不知道gpg是个什么东西&#xff0c;反正跟着做就完了 curl https://mirrors.aliyun.com/kubernetes/apt/do…

【Echarts】玫瑰饼图数据交互

在学习echarts玫瑰饼图的过程中&#xff0c;了解到三种数据交互的方法&#xff0c;如果对您也有帮助&#xff0c;不胜欣喜。 一、官网教程 https://echarts.apache.org/examples/zh/editor.html?cpie-roseType-simple &#xff08;该教程数据在代码中&#xff09; import *…

echarts 画散点图, x周,y周在指定位置标志一下

文章目录 echarts 画散点图&#xff0c; x周&#xff0c;y周在指定位置标志一下示例一例子二示例三 echarts 画散点图&#xff0c; x周&#xff0c;y周在指定位置标志一下 示例一 let scatterData {data: [[[-0.2, -0.6],[0.4, 0.3],[0.1, 0.4],[0.3, 0.5],[0.09, 0.1],[0.7,…

【React】【react-globe.gl】3D Objects效果

目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果 示例地址 实现过程 踩坑 示例是通过script引入的依赖&#xff0c;但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaS…

kibana显示时间数据时的时区问题及时间显示格式设置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数据中心如何散热?

数据中心的散热是一个非常重要的问题&#xff0c;因为数据中心内运行的服务器、存储设备以及网络设备等都会产生大量的热量&#xff0c;如果不能有效地进行散热&#xff0c;将会导致设备故障和性能下降。下面是一些常见的数据中心散热方法&#xff1a; 空调系统&#xff1a;数据…

重定向-缓冲区

1.重定向 文件描述符对应的分配规则是什么? 尝试用这个代码 关闭0,1&#xff0c;2文件描述符&#xff0c;看看有什么现象&#xff1f;关闭哪个&#xff0c;你打开的文件fd应该就是哪个 结论&#xff1a; 从0下标开始&#xff0c;寻找最小的没有没使用的数组位置&#xff0c;它…

构建mono-repo风格的脚手架库

前段时间阅读了 https://juejin.cn/post/7260144602471776311#heading-25 这篇文章&#xff1b;本文做一个梳理和笔记&#xff1b; 主要聚焦的知识点如下&#xff1a; 如何搭建脚手架工程如何开发调试如何处理命令行参数如何实现用户交互如何拷贝文件夹或文件如何动态生成文件…

Linux内核input子系统详解

目录 1 input子系统整体架构 2 input子系统驱动框架分析 2.1 怎么添加input_dev 2.2 input_dev和input_handler匹配后&#xff0c;connec函数做了什么 3 input子系统读数据流程 3.1 open输入设备流程 3.2 read读取输入事件流程 4 应用程序读取的输入数据是怎样的 4.1 …

chap认证带客户端IP分配案例

PPP协议两边的网段可以不在同一个网段&#xff0c;因为数据链路帧用0xff表示帧&#xff0c;不用arp&#xff0c;所以可以不同网段。 R1&#xff1a; aaa local-user test password cipher admin local-user test service-type ppp interface Serial4/0/0 link-protocol ppp pp…

Git 标签(Tag)实战:打标签和删除标签的步骤指南

目录 前言使用 Git 打本地和远程标签&#xff08;Tag&#xff09;删除本地和远程 Git 标签&#xff08;Tag&#xff09;开源项目标签&#xff08;Tag&#xff09;实战打标签删除标签 结语开源微服务商城项目前后端分离项目 前言 在开源项目中&#xff0c;版本控制是至关重要的…

在钣金加工领域,迅镭激光切割机广泛使用的原因和优点何在?

激光切割工艺和激光切割设备正在被广泛的板材加工企业逐渐理解并接受&#xff0c;凭借其高效率的加工、高精度的加工、优质的切割断面、三维切割能力等诸多优势&#xff0c;逐步取代了传统的钣金切割设备。 苏州迅镭激光科技有限公司推出的激光切割设备的柔性化程度高&#xff…

Centos下用nodejs实现一个简单的web服务器

WebRTC是音视频直播中最常用的一个框架&#xff0c;在使用的过程中&#xff0c;我们就需要实现一个服务器端。本文以nodejs实现一个服务器为例&#xff0c;讲述一下在centos下如何用nodejs实现一个简单的web服务器。 一、安装nodejs 在linux环境下安装nodejs有多重方式&#x…

消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#xff0c;炙手可热的Kafka&a…

数据库概述 -- 数据模型知识点要点详解

数据模型 概述概念数据特征组成要素分类概念层数据模型逻辑层数据模型物理层数据模型 主页传送门&#xff1a;&#x1f4c0; 传送 概述 数据模型是对现实世界数据特征的抽象&#xff0c;它描述了数据的结构、操作和约束条件&#xff0c;为数据库系统的信息表示与操作提供一个抽…

JWT

目录 JWT组成 第一部分header 第二部分payload 第三部分signature 注意 JWT认证算法&#xff1a;签发和校验 drf使用jwt drf项目的jwt认证开发流程 drf-jwt安装和简单使用 安装 简单使用 drf-jwt使用 jwt内置类JSONWebTokenAuthentication 控制使用jwt的登录接口…

人工智能基础_机器学习014_BGD批量梯度下降公式更新_进一步推导_SGD随机梯度下降和MBGD小批量梯度下降公式进一步推导---人工智能工作笔记0054

然后我们先来看BGD批量梯度下降,可以看到这里,其实这个公式来源于 梯度下降的公式对吧,其实就是对原始梯度下降公式求偏导以后的梯度下降公式,然后 使用所有样本进行梯度下降得来的,可以看到* 1/n 其实就是求了一个平均数对吧.所有样本的平均数. 然后我们看,我们这里* 1/n那么…

启用NTP服务解决Linux系统时间与北京时间不同步问题

一、背景 1、服务器的Linux版本为Linux version 4.18.0-348.7.1.el8_5.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC)) #1 SMP Wed Dec 22 13:25:12 UTC 2021 2、NTP即Network Time Protocol&#xff08;网络时间协议&am…

Unity3D与iOS的交互 简单版开箱即用

本文适合的情况如下&#xff1a; Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…