居然这么简单就能实现扫雷游戏!

news2024/11/18 21:24:53

目录

     一.思路

     1.成果展示

     2.思路

     二.具体操作

     1.创建"棋盘"

     2.初始化雷

     3.布置雷

      4.打印

      5.排除雷

     三.代码实现

     1.test.c文件

     2.thunder.h文件

      3.thunder.c文件


       Hello,大家好,今天我们来实现扫雷游戏,希望这一篇博客能给带给大家一些收获。

     一.思路

     1.成果展示

       在真正开始讲解之前,我们先来看一下我的成果展示:

屏幕录制 2024-07-03 165322-CSDN直播

     2.思路

       我们先来讲解一下扫雷游戏的思路:这个思路就是和我们在完游戏时候的那个思路时一模一样的,就是排除雷,简单来说,就是我们给定一个位置,看这个位置是不是雷,如果我们不幸,选中的这个位置就刚好是一个雷的话,那么我们就被炸死了,反之如果这个位置不是雷的话,那么,相应的,我们就要统计一下这个位置旁边与这个位置相邻的位置中雷的个数。

     二.具体操作

     1.创建"棋盘"

       实际上就是创建框架,就是创建如下面所示的一个"棋盘"。

我们首先要创建一个如上图一样的类似于"棋盘"一样的框架,要制作这个框架其实是很简单的,就是建立一个二维数组就可以了,将数组中的所有的元素均设置成 ' * ' 就可以了。这里我们在创建框架的时候需要注意一件事情,就必须要创建两个一模一样的二维数组,大家不妨看一看我们上面的那个游戏思路,如果这个位置是雷,我们就"死了",反之,就要在这个位置上写上周围的所有位置的雷的数目总和。为了区分有雷和无雷,我们将有雷的位置赋值1,无雷的位置赋值为0,那么,这样的话,我们在玩游戏的过程中出现了1的话,我们是无法知道这个位置是雷还是说这个位置不是雷,周围总共有1个雷?如果我们只是使用一个二维数组的话,是无法明白这个出现的1的含义的,会让我们产生歧义。因此,我们在这里要使用两个一模一样的数组来实现,我们呈现在屏幕上面的"棋盘"样式就是上面的那幅图所示,由于 ' * ' 符号属于字符,因此,我们要建立一个字符数组,但是如果按照我们上面所说的那样的话,一个数组是int类型,另一个数组是char类型,这样写的话有一点点麻烦,为了统一,我们这里将两个数组均写成是char类型的。

     2.初始化雷

       通过上面的思路我们可知我们建立了两个char类型的数组,我们接下来就要进行初始化操作了,在进行初始化操作之前,我们首先要知道创建的两个数组是干什么的,一个数组是用来布置雷的,我们为了方便,将雷使用字符 ' 1 ' 来表示,不是雷的位置使用字符 ' 0 ' 来表示,这个数组我们不可以展示出来(因为这个数组中存放的是雷的分布情况),另一个数组就是我们要展示出来的数组,是用来显示我们要查的这个位置又没有雷的存在。

我们将不展示出来的这个数组命名为mine数组,如下图所示:

mine数组我们在进行初始化的时候,将这个数组中的所有的元素全部初始化为字符 ' 0 ' (通过我们上面的解释我们可知 ' 0 ' 代表的是要排查的这个位置没有雷)。

我们将展示出来的这个数组命名为show数组,如下图所示:

show数组我们在进行初始化的时候,将这个数组中的所有元素全部初始化为 ' * ' ,我们这个数组是作为展示的一个数组,因此,我们不能暴露里面的雷的放置情况。

     3.布置雷

       我们的雷的布置这一操作是在mine数组中进行的,我们的"棋盘"是采用的是 9 * 9实现的,我们这里在布置是只布置10个雷就i可以了,我们是要在这个"棋盘"中去进行雷的布置的,因此,不能超过这个"棋盘"的范围,这里我们要使用一个函数,就是 rand( ) 函数,下面是关于这个函数的链接,大家可以去了解一下,这个函数可以随机生成一个随机数,

rand - C++ Referenceicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand我们可以通过这个函数来确定雷的位置,使用这个函数我们就可以得到两个值x,y作为坐标来确定一个地址(这个地址必须在mine函数的范围之内),将这个地址赋值为字符 ' 1 ' ,利用循环,创建10个雷。

      4.打印

        我们在进行打印这一操作的时候,就是将mine数组和show数组中的各个元素均打印到屏幕上即可,这里使用for循环,(最后有代码)。

      5.排除雷

        前面的几步都是我们的准备操作,这一步才是我们玩游戏的步骤,我们给定一个坐标位置,去判断这个位置是否有雷(判断这一步操作是在mine数组中判断的(雷的分布是在mine数组中的)),若mine数组中这个位置是字符 ' 1 ' 的话,就说明我们碰到雷了,反之,若mine数组中这个位置是字符 ' 0 ' 的话,我们就要去统计一下这个位置周围的位置的雷的个数,然后将这个个数转化为字符赋值给show数组中的这个相同的位置,为了方便观看,我们这里将show数组在打印到屏幕上就可以了,这里还要有一个结束条件,就是我们将所有的雷全部都排完之后,我们就扫雷成功了,因此,我们还要定义一个变量来表示我们找到的非雷位置的个数,用这个变量来表示雷有没有被扫完。

     三.代码实现

     1.test.c文件

#include"thunder.h"
void menu()
{
	printf("********************\n");
	printf("****   1.play   ****\n");
	printf("****   0.exit   ****\n");
	printf("********************\n");
}
void game()
{
	char mine[COWS][COLS] = { 0 };
	char show[COWS][COLS] = { 0 };
	// 初始化雷
	Initebroad(mine, COWS, COLS, '0');
	Initebroad(show, COWS, COLS, '*');
	// 布置雷
	Setmine(mine, COW, COL);
	// 打印
	Displaydroad(mine, COW, COL);
	Displaydroad(show, COW, COL);
	// 排除雷
	Findmine(mine, show, COW, COL);
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束,退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

     2.thunder.h文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define COW 9
#define COL 9
#define COWS COW+2
#define COLS COL+2
#define mount 10
void Initebroad(char arr[COWS][COLS], int cows, int cols, char set);
void Setmine(char arr[COWS][COLS], int cow, int col);
void Displaydroad(char arr[COWS][COLS], int cows, int cols);
void Findmine(char mine[COWS][COLS], char show[COWS][COLS], int cow, int col);

      3.thunder.c文件

#include"thunder.h"
void Initebroad(char arr[COWS][COLS], int cows, int cols, char set)
{
	for (int i = 0; i < cows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}
void Setmine(char arr[COWS][COLS], int cow, int col)
{
	int count = mount;
	while (count > 0)
	{
		int x = rand() % cow + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}
void Displaydroad(char arr[COWS][COLS], int cow, int col)
{ 
	printf("------开始游戏-----\n");
	for (int i = 0; i <= col; i++) 
	{
		printf("%d ",i);
	}
	printf("\n");
	for (int i = 1; i <= cow; i++)
	{
		printf("%d ",i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}
//static这个关键字可以保证这个函数只能在当前.c文件中使用,其他的文件使用不了。
static int Getminecount(char arr[COWS][COLS], int x, int y)
{
	int count = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			count += arr[i][j] - '0';
		}
	}
	return count;
}
void Findmine(char mine[COWS][COLS], char show[COWS][COLS], int cow, int col)
{
	int x = 0, y = 0;
	int win = 0;
	while (win < cow * col - mount)//确保雷全部被排完。
	{   
		printf("请输入要排查的坐标位置\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= cow && y >= 1 && y <= col)
		{
			if (show[x][y] == '*')
			{
				if (mine[x][y] == '1')
				{
					printf("很遗憾,您被炸死了\n");
					Displaydroad(show, COW, COL);
					break;
				}
				else
				{
					// 当程序进行到这里时,就说明要排查的当前位置不是雷,那么,就要统计周围一圈的雷的个数。
					int count = Getminecount(mine, x, y);
					show[x][y] = count + '0';
					Displaydroad(show, COW, COL);
					win++;
				}
			}
			else
			{
				printf("这个位置您已经排查过了,请另排查一个\n");
			}
		}
		else
		{
			printf("输入的坐标不存在,请重新输入\n");
		}
	}
	if (win == cow * col - mount)
	{
		printf("恭喜您,排雷成功\n");
		Displaydroad(mine, COW, COL);
	}
}

       OK,以上就是我们对于扫雷游戏的全部讲解了,希望能对大家有所收获,感谢大家的支持。 

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

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

相关文章

Hadoop集群部署【一】HDFS详细介绍以及HDFS集群环境部署【hadoop组件HDFS笔记】(图片均为学习时截取的)

HDFS详细介绍 HDFS是什么 HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一 全称是&#xff1a;Hadoop Distributed File System&#xff08;Hadoop分布式文件系统&#xff09;&#xff1b;是Hadoop技术栈内提供的分布式数据存储解决方案 可以在多台服务器上构建存储集群&…

对秒杀的思考

一、秒杀的目的 特价商品&#xff0c;数量有限&#xff0c;先到先得&#xff0c;售完为止 二、优惠券的秒杀 和特价商品的秒杀是一样的&#xff0c;只不过秒杀的商品是优惠券 三、秒杀的需求 秒杀前&#xff1a;提前将秒杀商品&#xff0c;存放到Redis秒杀中&#xff1a;使…

小红书“心愿单“薅羊毛活动,亲测有效!不是长期!!

大家好&#xff01;不知道你们有没有发现&#xff0c;最近小红书的"心愿单"活动在朋友圈都快刷频了&#xff0c;我也好奇点进去看了以下&#xff0c;还真有人通过这个活动以极低的价格甚至免费获得了商品。我也去测试了以下&#xff0c;方法没问题&#xff0c;就是一…

HTTPS数字证书验证论述

1 概述 网络请求方式通常分为两种&#xff0c;分别是HTTP请求和HTTPS请求&#xff0c;其中HTTP的传输属于明文传输&#xff0c;在传输的过程中容易被人截取并且偷窥其中的内容&#xff0c;而HTTPS是一种在HTTP的基础上加了SSL/TLS层&#xff08;安全套接层&#xff09;的安全的…

技术周总结 2024.06.24~06.30(Python并发执行shell并发执行 Spring Bean)

文章目录 一、 06.26 周三1.1&#xff09;问题01&#xff1a;怎么在mysql的命令行中查询出来 python能使用的元祖结果集1.2&#xff09;问题02&#xff1a;python中 set()是什么&#xff0c;怎么使用 二、06.27 周四2.1&#xff09;问题01&#xff1a;shell 并发执行2.2&#x…

【ARMv8/v9 GIC 系列 5 -- GIC GICD_CTRL 使用详细介绍】

文章目录 GICD_CTRLGICD_CTLR 寄存器结构RWP&#xff08;Register Write Pending&#xff09;E1NWF&#xff08;Enable 1 of N Wakeup Functionality&#xff09;DS&#xff08;Disable Security&#xff09; 亲和性路由&#xff08;Affinity Routing&#xff09;ARE_NSARE_S 中…

【分布式数据仓库Hive】常见问题及解决办法

目录 一、启动hive时发现log4j版本和hadoop的版本有冲突 解决办法&#xff1a;删除hive下高版本的slf4j 二、启动hive报错 Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Object;)V …

web自动化(三)鼠标操作键盘

selenuim 键盘操作 import timefrom selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selen…

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中&#xff0c;会发现表格组件el-table在未指定宽度情况下&#xff0c;会自动计算并给表格宽度赋值。但实际开发中&#xff0c;有时需要根据内容实际长度自动撑开显示&#xff0c;由内容的多少而决定表格的宽度&#xff0c;而不是默认宽度为100%。在默认情况下…

【Linux】线程——线程的概念、线程的特点、线程的优点和缺点、线程和进程、线程函数的使用

文章目录 Linux线程1. 线程的概念1.1 什么是线程 2. 线程的特点2.1 线程的优点2.2 线程的缺点2.4 线程和进程 3. 线程函数的使用pthread_create() 创建线程pthread_self() 获取线程IDpthread_exit() 线程终止pthread_cancel() 线程取消pthread_join() 线程等待pthread_detach()…

使用Redis实现消息队列:List、Pub/Sub和Stream的实践

摘要 Redis是一个高性能的键值存储系统&#xff0c;它的多种数据结构使其成为实现消息队列的理想选择。本文将探讨如何使用Redis的List、Pub/Sub和Stream数据结构来实现一个高效的消息队列系统。 1. 消息队列的基本概念 消息队列是一种应用程序之间进行通信的机制&#xff0…

docker容器间网络仿真工具-pumba

docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预&#xff0c;包括延迟&#xff0c;丢包&#xff0c;带宽限制等。 但是我在实际使用时&#xff0c;发现docker-tc这个工具在进行网络进行模…

Docker 部署 Minio 对象存储服务器

文章目录 Github官网文档简介dockerdocker-compose.ymlmc 客户端mc 基础命令Golang 示例创建 test 账号密钥文件上传示例 Github https://github.com/minio/minio 官网 https://min.io/https://www.minio.org.cn/ 文档 https://www.minio.org.cn/docs/minio/kubernetes/up…

摸爬滚打半年,我是如何从小白进阶到渗透测试工程师

前言 工作也好几年了&#xff0c;在这摸爬滚打中&#xff0c;遇到了服务器被黑&#xff0c;网站被人DDOS攻击&#xff0c;数据库被篡改等等。服务器也不是你说不让人上就不让人上的&#xff0c;所以IT安全这个话题还是比较沉重的&#xff0c;涉及的东西很多&#xff0c;只有你…

个人博客|PHP源码|支持多国语言切换

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;支持多国语言的个人博客网站源码&#xff0c;支持二开&#xff0c;无加密。此博客相当简洁&#xff0c;也适合海外。详细界面和功能见下面视频演示。 如果您正好有此需求源码&#xff0c;请联系小编…

SSM学习4:spring整合mybatis、spring整合Junit

spring整合mybatis 之前的内容是有service层&#xff08;业务实现层&#xff09;、dao层&#xff08;操作数据库&#xff09;&#xff0c;现在新添加一个domain&#xff08;与业务相关的实体类&#xff09; 依赖配置 pom.xml <?xml version"1.0" encoding&quo…

一篇文章搞懂弹性云服务器和轻量云服务器的区别

前言 在众多的云服务器类型中&#xff0c;弹性云服务器和轻量云服务器因其各自的特点和优势&#xff0c;受到了广大用户的青睐。那么&#xff0c;这两者之间到底有哪些区别呢&#xff1f;本文将为您详细解析。 弹性云服务器&#xff1a;灵活多变的计算资源池 弹性云服务器&…

鸿蒙开发设备管理:【@ohos.sensor (传感器)】

传感器 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import sensor from ohos.sensor;sensor.on ACCELEROMETER on(type: SensorType.SENSOR_TYPE_ID_ACCELEROMETER, callback: C…

04-ArcGIS For JavaScript的可视域分析功能

文章目录 综述代码实现代码解析结果 综述 在数字孪生或者实景三维的项目中&#xff0c;视频融合和可视域分析&#xff0c;一直都是热点问题。Cesium中&#xff0c;支持对阴影的后处理操作&#xff0c;通过重新编写GLSL代码就能实现视域和视频融合的功能。ArcGIS之前支持的可视…

Vue+Xterm.js+WebSocket+JSch实现Web Shell终端

一、需求 在系统中使用Web Shell连接集群的登录节点 二、实现 前端使用Vue&#xff0c;WebSocket实现前后端通信&#xff0c;后端使用JSch ssh通讯包。 1. 前端核心代码 <template><div class"shell-container"><div id"shell"/>&l…