用C语言实现扫雷

本篇适用于C语言初学者,主要涉及对于函数,数组,分支循环的运用。

目录

设计思想:

总代码(改进后):

运行结果展示:

分布介绍:

声明:

代码主体部分:

功能模块实现:

初始化模块:

打印模块:

埋雷模块:

判断模块:

总结:


设计思想:

首先要有一个游戏菜单,输入1表示开始,0表示结束,其它数字则提示输入错误,请重新输入;其次要有雷盘,雷盘用二维数组表示,开始时要有初始化模块对二维数组初始化,要有埋雷模块放置雷,要有判断输赢及返回结果模块,要有打印模块向玩家展示雷盘,为了更容易实现这些模块,我们选择两个二维数组表示雷盘,其中一个埋雷,其中一个向玩家展示。为了方便计算周围雷的个数,空用 '0' 表示,;雷用 '1'表示。

总代码(改进后):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9
#define COL 9

#define ROWS ROW + 2
#define COLS COL + 2

#define Easy_Mine 10

void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch);
void DisplayBorad(char borad[ROWS][COLS], int row, int col);
void SetMine(char borad[ROWS][COLS], int row, int col);
void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col);

//初始化
void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;

	for (i = 0; i < rows; i++)
	{
		int j = 0;

		for (j = 0; j < cols; j++)
		{
			borad[i][j] = ch;
		}
	}
}

//打印拓展
void DisplayBorad(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
	//列标
	for (i = 0; i <= col; i++)
	{
		printf(" %d |", i);
	}
	printf("\n");
	for (i = 0; i <= col; i++)
	{
		printf("---|", i);
	}
	printf("\n");
  
	for (i = 1; i <= row; i++)
	{
		//行标
		printf(" %d |", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf(" %c |",borad[i][j]);
		}
		printf("\n");
		
		for (j = 0; j <= col; j++)
		{
			printf("---|", i);
		}
		printf("\n");
	}
	printf("\n");
}

//放置雷
void SetMine(char borad[ROWS][COLS], int row, int col)
{
	int count = Easy_Mine;

	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (borad[x][y] == '0')
		{
			borad[x][y] = '1';
			count--;
		}
	}

}

//改进判断法

//递归实现扫雷的展开一片
void GetMineCount(char mine_borad[ROWS][COLS], char show_borad[ROWS][COLS], int x, int y, int* count)
{
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL && show_borad[x][y] == '*')
	{
		int i = x - 1;
		int j = y - 1;
		int sum = 0;
		//计算周围有几个雷
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				sum = sum +(mine_borad[i][j] - '0');
			}
		}
		//如果周围没有雷,将此坐标置为空格,递归查找周围的周围是否有雷...
		if (sum == 0)
		{
			show_borad[x][y] = ' ';
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					//更正循环次数
					(*count)--;
					GetMineCount(mine_borad, show_borad, i, j, count);
				}
			}
		}
		//如果周围有雷,将此坐标字符该为对应雷的个数的字符
		else
		{
			//更正循环次数
			(*count)--;
			show_borad[x][y] = sum + '0';
		}
	}
}

void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = row * col - Easy_Mine;
	//实现主体
	while (count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine_borad[x][y] == '1')
			{
				printf("嘭!你被炸死了!\n");
				DisplayBorad(mine_borad, ROW, COL);
				break;
			}
			else if (mine_borad[x][y] == '0' && show_board[x][y] == '*');
			{
				GetMineCount(mine_borad, show_board, x, y, &count);
				//count = count_number(show_board, row, col);
				//DisplayBorad(mine_borad, ROW, COL);
				DisplayBorad(show_board, ROW, COL);
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	if (count == 0)
	{
		printf("恭喜你,你赢了!\n");
		DisplayBorad(mine_borad, row, col);

	}
}

void menu()
{
	printf("******************************\n");
	printf("********   1.paly   **********\n");
	printf("********   0.exit   **********\n");
	printf("******************************\n");
}

void game()
{
	//此二维数组用来放置雷
	char mine[ROWS][COLS] = { 0 };
	//此二维数组用于像玩家展示
	char show[ROWS][COLS] = { 0 };

	//初始化两个二维数组
	InitBorad(mine, ROWS, COLS, '0');
	//DisplayBorad(mine, ROW, COL);
	InitBorad(show, ROWS, COLS, '*');

	//放置雷
	SetMine(mine, ROW, COL);

	//打印棋盘
	DisplayBorad(show, ROW, COL);

	//DisplayBorad(mine, ROW, COL);
	//游戏实现主体
	FindMine(mine, show, ROW, COL);
}

//主函数
int main()
{
	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");
			break;
		}
	} while (input);
	return 0;
}

运行结果展示:

 

 

 

分布介绍:

声明:

如果想要更改雷盘大小,放置雷个数,只需对ROW , COL , Easy_Mine作相应的修改即可。 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//标识符定义行与列
#define ROW 9
#define COL 9
//雷盘实际大小
#define ROWS ROW + 2
#define COLS COL + 2
//雷的个数
#define Easy_Mine 10
//主要函数声明
void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch);
void DisplayBorad(char borad[ROWS][COLS], int row, int col);
void SetMine(char borad[ROWS][COLS], int row, int col);
void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col);

代码主体部分:

关于作为9 * 9的雷盘为什么要选择11 * 11的二维数组表示,是为了防止越界访问,以及更容易地实现扫雷后的判断和返回结果。用字符0将要放置雷的二维数组初始化,用字符*将向玩家展示的二维数组初始化,用字符1表示雷。

//游戏菜单
void menu()
{
	printf("******************************\n");
	printf("********   1.paly   **********\n");
	printf("********   0.exit   **********\n");
	printf("******************************\n");
}
//实现主体
void game()
{
	//此二维数组用来放置雷
	char mine[ROWS][COLS] = { 0 };
	//此二维数组用于像玩家展示
	char show[ROWS][COLS] = { 0 };

	//初始化两个二维数组
	InitBorad(mine, ROWS, COLS, '0');
	//DisplayBorad(mine, ROW, COL);
	InitBorad(show, ROWS, COLS, '*');

	//放置雷
	SetMine(mine, ROW, COL);

	//打印棋盘
	DisplayBorad(show, ROW, COL);

	//DisplayBorad(mine, ROW, COL);
	//游戏实现主体
	FindMine(mine, show, ROW, COL);
}
//主函数
int main()
{
	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");
			break;
		}
	} while (input);
	return 0;
}

功能模块实现:

初始化模块:

通过嵌套for循环用传过来的字符将传过来的数组初始化。

//初始化
void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;

	for (i = 0; i < rows; i++)
	{
		int j = 0;

		for (j = 0; j < cols; j++)
		{
			borad[i][j] = ch;
		}
	}
}

打印模块:

原始打印模块:

先利用for循环打印列标,再利用嵌套for循环打印行标及二维数组。代码及雷盘展示如下:

//打印
void DisplayBorad(char borad[ROWS][COLS], int row, int col)
{
	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 ", borad[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

雷盘:

改进打印模块:

原理如上,加以修饰,代码及雷盘展示如下:

//打印拓展
void DisplayBorad(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
	//列标
	for (i = 0; i <= col; i++)
	{
		printf(" %d |", i);
	}
	printf("\n");
	for (i = 0; i <= col; i++)
	{
		printf("---|", i);
	}
	printf("\n");
  
	for (i = 1; i <= row; i++)
	{
		//行标
		printf(" %d |", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf(" %c |",borad[i][j]);
		}
		printf("\n");
		
		for (j = 0; j <= col; j++)
		{
			printf("---|", i);
		}
		printf("\n");
	}
	printf("\n");
}

 雷盘:

埋雷模块:

要实现在雷盘上随机放置雷,需要srand()和time()库函数来确定随机数生成期起点,rand()库函数来生成随机数,将获得的随机数大小控制在1~9之间(雷盘逻辑大小),获得要放置雷的坐标后,找到与之对应的二维数组元素,将其置为字符1。(字符0表示不是雷,字符1表示雷)模块代码及放置雷的二维数组展示:

//放置雷
void SetMine(char borad[ROWS][COLS], int row, int col)
{
    //要放置的雷的个数
	int count = Easy_Mine;

	while (count)
	{
        //获得要放置雷的坐标
		int x = rand() % row + 1;
		int y = rand() % col + 1;
        //如果此坐标未放置雷,则放置雷,否则重新获得坐标
		if (borad[x][y] == '0')
		{
			borad[x][y] = '1';
			count--;
		}
	}
}

放置雷的二维数组:

判断模块:

原始判断模块;

此模块需要将真雷盘和假雷盘二维数组都传过去。玩家输入要扫雷的坐标,如果坐标不合法,提示输入错误,重新输入。如果坐标合法,与放置雷的二维数组的相应坐标对照,如果此坐标是雷,则输出玩家扫雷失败,并将埋雷的二维数组向玩家展示,游戏结束,如果此坐标不是雷,则判断此坐标周围一圈有无雷,如果无雷,返回0,有雷的话,返回雷的个数,并将向玩家展示的二维数组的对应的坐标更改为雷的个数,更正循环控制条件,继续游戏。当循环控制条件不再满足(及已将所有不是雷的坐标扫出)则获得游戏胜利,游戏结束。

//原始判断法

//返回此坐标周围雷的个数
int GetMineCount(char borad[ROWS][COLS], int x, int y)
{
	//字符1~9减去一个字符0就可以得到整型数1~9,这也是选择用字符0和1表示是否有雷的原因
	return (borad[x - 1][y] + borad[x - 1][y - 1] + borad[x][y - 1] + borad[x + 1][y - 1]
		+ borad[x + 1][y] + borad[x + 1][y + 1] + borad[x][y + 1] + borad[x - 1][y + 1] - 8 * '0');
}

//判断输赢
void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	//循环控制条件
	int count = row * col - Easy_Mine;
	while (count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		//判断输入坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//此坐标是雷
			if (mine_borad[x][y] == '1')
			{
				printf("嘭!你被炸死了!\n");
				//打印放置雷的二维数组
				DisplayBorad(mine_borad, ROW, COL);
				break;
			}
			//此坐标不是雷
			else if (mine_borad[x][y] == '0' && show_board[x][y] != ' ');
			{
				//函数调用返回雷的个数
				int ret = GetMineCount(mine_borad, x, y);
				//将向玩家展示的二维数组的对应坐标更改为雷的个数(将整型数1~9加一个字符0就可转换成字符1~9)
				show_board[x][y] = ret + '0';
				//打印
				DisplayBorad(show_board, ROW, COL);
				//更正循环控制条件
				count--;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	//游戏胜利判定
	if (count == 0)
	{
		printf("恭喜你,你赢了!\n");
		DisplayBorad(mine_borad, row, col);

	}
}

运行展示:

改进判断模块: 

上述判断模块跟扫雷游戏还是有些实质差异,在扫雷游戏中,当一个坐标周围一圈都没有雷时,就会为空,再对他周围的坐标的周围进行判断......因此需要对其进行改进,总体思想不变,仅需对判断坐标周围一圈雷数的子模块以及循环控制条件进行修改即可。当输入坐标周围一圈都没有雷时,将向玩家展示的二维数组的对应坐标置为空格,更改循环控制条件,并判断它周围坐标的周围是否有雷.....依此类推。这里通过循环和递归思想实现此功能。

//改进判断法

//递归实现扫雷的展开一片
void GetMineCount(char mine_borad[ROWS][COLS], char show_borad[ROWS][COLS], int x, int y, int* count)
{
	//递归限制条件 
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL && show_borad[x][y] == '*')
	{
		int i = x - 1;
		int j = y - 1;
		//此变量表示雷的个数 
		int sum = 0;
		//计算周围有几个雷
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				sum = sum +(mine_borad[i][j] - '0');
			}
		}
		//如果周围没有雷,将此坐标置为空格,递归查找周围的周围是否有雷...
		if (sum == 0)
		{
			show_borad[x][y] = ' ';
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					//更正循环次数
					(*count)--;
					//递归 
					GetMineCount(mine_borad, show_borad, i, j, count);
				}
			}
		}
		//如果周围有雷,将此坐标字符改为对应雷的个数的字符
		else
		{
			//更正循环次数
			(*count)--;
			show_borad[x][y] = sum + '0';
		}
	}
}

void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = row * col - Easy_Mine;
	//实现主体
	while (count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine_borad[x][y] == '1')
			{
				printf("嘭!你被炸死了!\n");
				DisplayBorad(mine_borad, ROW, COL);
				break;
			}
			else if (mine_borad[x][y] == '0' && show_board[x][y] == '*');
			{
				GetMineCount(mine_borad, show_board, x, y, &count);
				//count = count_number(show_board, row, col);
				//DisplayBorad(mine_borad, ROW, COL);
				DisplayBorad(show_board, ROW, COL);
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	if (count == 0)
	{
		printf("恭喜你,你赢了!\n");
		DisplayBorad(mine_borad, row, col);

	}
}

运行展示:

 

 

总结:

关于扫雷游戏的基本模块已经实现,可以开始游戏啦!当然,这个简易扫雷游戏还是可以继续优化的,比如增加标记功能等,这些模块的实现就需要大家自行去探索了,我就不过多阐述了。本期内容就到这里,如果帮到你的话,还请给个一键三连吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三个pdf工具和浏览软件(pdftk,muppdf,epdfview)

安装pdftk pdftk是一款功能强大的PDF处理工具&#xff0c;主要用于对PDF文件进行各种操作。它提供了丰富的功能&#xff0c;包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本&#xff0c;适用于不同的用户需求…

计算机网络(6) TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网协议套件中一种核心协议。它提供面向连接的、可靠的字节流传输服务&#xff0c;确保数据从一端正确无误地传输到另一端。TCP的主要特点包括&#xff1a; 可靠性&#xff1a;TCP使用…

AIGC绘画设计:Midjourney V6 来袭,该版本有哪些新功能?

Midjourney V6 支持更自然的语言输入&#xff0c;可以处理更自然地对话式&#xff08;以前的版本是以关键字为中心的&#xff09;提示&#xff0c;对复杂提示有了更好的解释能力。大幅增加了每个 /image 的内存&#xff0c;可以处理更长、更详细的提示&#xff08;从40 直接提升…

一文理清sshc包的使用场景和掌握两种连接方式及异常场景

一文理清sshc、ssh包的使用场景和两种连接方式 SSH协议SSH&#xff08;Secure Shell&#xff09;协议支持通过多种编程语言实现客户端和服务端的功能&#xff0c;包括Go、Python、Java、C#等。 GO语言 sshc包的使用建立连接1.DialWithKey2.DialWithPasswd 运行命令异常场景思维…

北斗车载终端TD30助力户外出行现代化、信息化——保障无信号区域通信、实时精准定位

据官方统计&#xff0c;截至2023年9月底&#xff0c;全国机动车保有量达4.3亿辆&#xff0c;其中汽车3.3亿辆&#xff0c;新能源汽车1821万辆&#xff1b;机动车驾驶人5.2亿人&#xff0c;其中汽车驾驶人4.8亿人。车辆持有率的上升也带来车辆安全的考量&#xff0c;再者交通运输…

【linux】给net/socket.c部分接口添加pr_info后运行情况

net/socket.c 合入文件及代码&#xff1a; https://gitee.com/r77683962/linux-6.9.0/commit/d9aca07352311a9c185cbc2d3c39894e02f10df3 开机后dmesg命令运行效果&#xff1a; 这也是一部分&#xff0c;不过从这里看出来&#xff0c;添加打印日志的地方不太好&#xff0c;另…

CTFshow-web sql注入

Web171 1 在题目中可以看到查询语句为 "select username,password from user where username !flag and id ".$_GET[id]." limit 1;"; 直接使用万能密码 查到了所有用户 获得flag Web172 0 可以看到返回逻辑显示 如果返回的查询数据中username不等于fl…

随着Midjourney越来越成熟,它将给现实世界带来哪些影响?

Midjourney使用的过程中&#xff0c;你是不是会遇到这样的情况&#xff1f; 生成出来的图片压根不是自己想要的&#xff1f; 想要的风格根本不知道怎么写提示词&#xff1f; 不用担心&#xff0c;今天白白给大家带来了280种酷炫动作咒语&#xff0c;拿去&#xff0c;都能生成…

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…

Web3失败下互联网的未来转型之路

互联网的消亡已不再是夸大其词的说法。在大型科技巨头和生成式AI的推动下&#xff0c;网络的死亡螺旋正在加速&#xff0c;就像希腊神话中的蛇怪&#xff0c;象征着自我吞噬与永生。互联网已经开始自我喂养&#xff0c;并吐出最糟糕的部分供我们消费。 没有价值 Web3未能提供…

GPT-4搞不定的图推理,港科大7B模型搞定|KDD2024

大模型执行图推理任务&#xff0c;我们是希望大模型仅仅给出结果&#xff0c;还是在给出准确答案的同时&#xff0c;输出详细的推理过程&#xff1f; 先来看GPT-4的表现&#xff1a; 给出了一个非常简短且错误的答案&#xff08;判断该图中没有环&#xff09;&#xff0c;这可…

53.Python-web框架-Django开始第一个应用的多语言

针对上一篇的功能&#xff0c;本次仅对页面做了多语言&#xff0c;大家可以看看效果。 51.Python-web框架-Django开始第一个应用的增删改查-CSDN博客 目录 部门列表 新增部门 编辑部门 部门列表 源码 <!DOCTYPE html> {% load static %} {% load i18n %} <html …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍓OJ题目截图 📎在线评测链接 团队派遣(100分) 🌍 评测功能需要订阅专栏…

集成学习 #数据挖掘 #Python

集成学习是一种机器学习方法&#xff0c;它通过结合多个模型的预测结果来提高整体性能和稳定性。这种方法的主要思想是“集合智慧”&#xff0c;通过将多个模型&#xff08;比如决策树、随机森林、梯度提升机等&#xff09;的预测集成起来&#xff0c;可以减少单个模型的过拟合…

如何发挥物联网电能表的优势

发挥物联网电能表的优势&#xff0c;对于提升电力系统的智能化水平、优化电力资源配置、提高用电效率以及促进环保发展等方面都具有重要意义。 一、实时监测与数据分析 物联网电能表的核心优势在于其能够实时监测电力使用情况&#xff0c;并通过无线网络将数据传输到云平台。…

【云岚到家】-day03-2-门户缓存实现实战

【云岚到家】-day03-2-门户缓存实现实战 5 缓存实现5.2 定时任务更新缓存5.2.1 分布式调度平台5.2.1.1 jdk提供的Timer定时器5.2.1.2 使用第三方Quartz方式5.2.1.3 使用分布式调度平台XXL-JOB 5.2.2 XXL-JOB5.2.2.1 介绍5.2.2.2 部署调度中心5.2.2.3 执行器 5.2.2 定义缓存更新…

laravel版本≥ 8.1

laravel10 php ≥ 8.1 且 ≤ 8.3&#xff1f; 8.1 < php < 8.3PHP版本要求在 8.1 到 8.3 之间&#xff0c;包括这两个版本。具体来说&#xff1a;"≥ 8.1" 表示 PHP 的版本至少是 8.1&#xff0c;也就是说 8.1 及以上的版本都可以。 "≤ 8.3" 表示 P…

2024年【广东省安全员A证第四批(主要负责人)】找解析及广东省安全员A证第四批(主要负责人)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批&#xff08;主要负责人&#xff09;找解析根据新广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将广东省安全员A证第四批&#xff…

光储充一体化,开启绿色出行新篇章

一、追光逐梦&#xff0c;绿色能源点亮未来 在蔚蓝的天空下&#xff0c;光伏发电板如同一片片金色的叶子&#xff0c;静静地捕捉着太阳的光芒。它们不仅为大地带来光明&#xff0c;更是绿色出行的强大后盾。光储充一体化充电站&#xff0c;以光伏为源&#xff0c;储能为桥&…