C语言初阶之扫雷代码详解(含递归展开)

news2024/11/17 7:47:16

在这里插入图片描述

扫雷代码详解

  • 扫雷代码思路
  • 头文件解析
  • 主函数解析
  • 函数文件解析
    • ①初始化函数(InitBoard)
    • ②打印函数
    • ③难易选项函数(Select)
    • ④布雷(SetMine)
    • ⑤获取周边雷数(GetMine)
    • ⑥展开函数(Expand)
    • 判定胜负函数(is_win)
    • 找雷函数(FindMine)
  • 全部代码
    • game.h
    • game.c
    • test.c
  • 结语

扫雷代码思路

主要分为下面几个过程:
1、建立棋盘
2、初始化棋盘
3、设置棋盘雷数
4、打印棋盘
5、玩家找雷
6、判定胜负

头文件解析

文件名:game.h
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9//展示的雷区棋盘行数
#define COL 9//展示的雷区棋盘列数

#define ROWS ROW+2//实际的雷区棋盘行数
#define COLS COL+2//实际的雷区棋盘列数



void InitBoard(char board[ROWS][COLS],char ret);//初始化棋盘


int Select();//难易选项函数


void SetMine(char board[ROWS][COLS], int num);//布雷


void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int num);//找雷

在game头文件中,首先包含会使用到的库头文件,这里的ROW以及COL是雷区的行和列大小,也就是说这是玩家实际能看到的行数及列数,而ROWS及COLS是实际棋盘大小,这样做的目的是为了方便后面对找到周围雷数函数的编写,剩下的函数声明是在test文件需要调用的函数声明,也就是说,在test文件中需要调用什么函数,在头文件中就声明什么函数,比如,在代码调试过程中,如果需要使用打印函数,则需要在此文件中写声明,否则就调用不了,因为每个人的写法不一样,作者的打印函数都是被找雷函数调用,所以声明中并没有添加,如果需要使用,小伙伴记得自己添加哦!!!

主函数解析

首先先看主函数test.c文件
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("*******************************************************************\n");
	printf("********       1.玩游戏               2.退出游戏          *********\n");
	printf("*******************************************************************\n");
	printf("请输入你的选项:");
}
void game()
{


	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };

	InitBoard(mine, '0');
	InitBoard(show, '*');

	int num = Select();
	SetMine(mine, num);
	
	FindMine(mine, show, num);

}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			game();
			printf("再来一局吗?\n");
			printf("1.再来一局   2. 退出游戏\n");
			int again = 0;
			scanf("%d", &again);
			if (again == 1)
			{
				break;
			}
			else
				n = 0;
			break;
		case 2:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (n);
}

第一个menu是菜单函数,其目的为引导玩家选择选项,这里作者没有做这么多花里胡哨的菜单界面,简单一点,重点放在后面
第二个game是游戏函数,其中包括建立棋盘,初始化棋盘、布雷、找雷的函数调用以及难易选项函数的调用;这里使用num记录难易值,也就是雷数,然后再进行布雷和找雷的传参,至于打印棋盘,作者放在找雷函数中,后面会提到
第三个为主函数,首先设立了一个随机数种子,类似之前的三子棋,同样的,这里我们使用一个do…while循环,首先调用菜单打印,再让玩家输入菜单选项,case1进入游戏,case2退出游戏,default重新选;需要注意的是,在game函数结束时,会再次提示玩家是否进入游戏,输入1则再玩一把,其他数字则退出。
菜单效果:
在这里插入图片描述

函数文件解析

①初始化函数(InitBoard)

代码如下:

void InitBoard(char board[ROWS][COLS],char ret)
{
	int i = 0, j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			board[i][j] = ret;
		}
	}
}

这个函数的作用是将棋盘数组的值利用一个嵌套循环初始化为传过来的值。

②打印函数

这个棋盘的打印可以有多种设计,以下有两个版本,一个是简易版的,另一个是稍微优化的,你也可以发动自己的想象力,设计出更美观的棋盘。
简易版代码如下:

void DisplayBoard(char board[ROWS][COLS])
{
	printf("--------扫雷游戏--------\n");
	int i = 0, j = 0;
	for (i = 0; i <= COL; i++)//打印列标
	{
		printf("%2d", i);
	}
	printf("\n");
	for (i = 1; i <= ROW; i++)
	{
		printf("%2d", i);
		for (j = 1; j <= COL; j++)
		{
			printf("%2c", board[i][j]);
		}
		printf("\n");//打印一行后换行
	}
	printf("\n");
}

效果如下:
在这里插入图片描述

优化版代码如下:

void DisplayBoard(char board[ROWS][COLS])
{
	printf("   --------------扫雷游戏--------------\n");
	int i = 0, j = 0;
	printf("   ");
	for (i = 1; i <= COL; i++)
	{
		printf("%3d ", i);
	}
	printf("\n");
	printf("   +");
	for (i = 0; i < COL; i++)
	{
		printf("---+");
	}
	printf("\n");
	for (i = 1; i <= ROW; i++)
	{
		printf("%2d", i);
		printf(" |");
		for (j = 1; j <= COL; j++)
		{
			printf(" %c |", board[i][j]);
		}
		printf("\n");
		printf("   +");
		for (j = 0; j < COL; j++)
		{
			printf("---+");
		}
		printf("\n");
	}

}

效果图如下:
在这里插入图片描述
其实具体的代码实现并不复杂,看你自己的需要,可以不断调试这个排版。

③难易选项函数(Select)

代码如下:

int Select()
{
	system("cls");//清空屏幕
	int num = 0;
	while (1)
	{
		printf("请新选择难度:\n");
		printf("1.简单模式:5个雷	2.中等模式:10个雷	3.困难模式:15个雷	4.自定义难度(自由输入雷的个数)\n ");
		int select = 0;
		getchar();
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			printf("简单模式:5个雷\n");
			num = 5;
			return num;
		case 2:
			printf("中等模式:10个雷\n");
			num = 15;
			return num;
		case 3:
			printf("困难模式:15个雷\n");
			num = 30;
			return num;
		case 4:
			printf("自定义难度:");
			printf("请输入布置雷的个数:\n");
			getchar();
			int intput = 0;
			scanf("%d", &intput);
			num = intput;
			return num;
		default:
			printf("输入错误,请重新选择:\n");
			break;
		}
	}
	
}

这段代码主要目的是通过玩家选择这四个选项进而返回雷值,然后就可以作为布雷和找雷的雷参数,主要有简易5个雷、中等10个雷、困难15个雷、自定义雷4中。
效果如下:
在这里插入图片描述

④布雷(SetMine)

代码如下:

void SetMine(char board[ROWS][COLS], int num)
{
	int x = 0, y = 0;
	int count = 0;
	while(count < num)
	{
		x = 1 + rand() % ROW;//1-9随机值
		y = 1 + rand() % COL;//1-9随机值
		if (board[x][y] == '0')
		{
			board[x][y] = '1';//布置雷点
			count++;
		}
	}
}

这里使用了随机数1-9来生成雷的位置,设置为字符0才能布雷即可,字符1为雷。
效果如下:
简单模式
在这里插入图片描述
中等模式
在这里插入图片描述
困难模式
在这里插入图片描述
自定义模式
在这里插入图片描述

⑤获取周边雷数(GetMine)

代码如下:

int GetMine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
			+ mine[x][y - 1] + mine[x][y + 1]+ mine[x + 1][y - 1] 
			+ mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}

这里我们看下面这个图:
在这里插入图片描述
这是该点位相对位置的表示,而且棋盘表示的是字符型数组所以这里返回的是周围8个点位元素值相加再减去8乘上字符0⃣️的ascii码值,即为周围雷个数的雷数的字符ascii码值。
比如下面这个标识的位置周围有1个雷:
在这里插入图片描述

⑥展开函数(Expand)

代码如下:

Expand(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{

	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//防止越界
	{
		int count = GetMine(mine, x, y);//获取该位置周围雷数
		if (count == 0)//周围没雷
		{
			show[x][y] = ' ';//赋值为空字符
			int i = 0, j = 0;
			for (i = x - 1; i <= x + 1; i++)//限制行
			{
				for (j = y - 1; j <= y + 1; j++)//限制列
				{
					if (show[i][j] == '*' && (i != x || j != y))//防止重复访问
					{
						Expand(mine, show, i, j);//递归调用
					}

				}
			}
		}
		else
		{
			show[x][y] = count + '0';//显示雷数
		}
	}
}

展开函数的作用是为了达到周围没雷时直接展开周围所有空间,利用递归不断向外展开,直至周围有雷为止
效果如下:
在这里插入图片描述

判定胜负函数(is_win)

代码如下:

int is_win(char show[ROWS][COLS])
{
	int count1 = 0;
	int i = 0, j = 0;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			if (show[i][j] != '*')
			{
				count1++;
			}
		}
	}
	return count1;
}

此函数是用于每次玩家输入坐标后,调用此函数返回不等于字符*的值,以此判定胜负。

找雷函数(FindMine)

代码如下:

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int num)
{
	system("cls");//清空屏幕
	DisplayBoard(show);//打印展示的棋盘
	int x = 0, y = 0;
	int win = 0;
	while (win < (ROW * COL - num))//条件为win值是否到达界限值
	{
		printf("请输入排查雷的坐标:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//防止越界
		{
			if (mine[x][y] == '1')//踩雷
			{
				system("cls");
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine);//打印布雷棋盘
				break;
			}
			else//不是雷
			{

				Expand(mine, show, x, y);//展开周围
				system("cls");//清空屏幕
				win = is_win(show);//更新win值
				DisplayBoard(show);//打印玩家棋盘
			}
		}
		else
		{

			printf("坐标非法,请重新输入:\n");//越界重新输入
		}
	}
	if (win == (ROW * COL - num))//判定win值是否到达界限值
	{
		system("cls");//清空屏幕
		printf("恭喜你排雷成功\n");
		DisplayBoard(show);//打印玩家棋盘
	}
}

这里的找雷函数包含了游戏结束的判定,解析已在备注中
效果图如下:
简单模式
在这里插入图片描述
自定义模式
在这里插入图片描述

全部代码

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>//清屏函数的头文件
#include <time.h>//srand函数的头文件

#define ROW 9//方便修改棋盘大小
#define COL 9

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


//声明初始化雷盘函数
void InitBoard(char board[ROWS][COLS],char ret);


int Select();

//声明布置雷函数
void SetMine(char board[ROWS][COLS], int num);

//声明排查雷的函数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int num);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"


void InitBoard(char board[ROWS][COLS],char ret)
{
	int i = 0, j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			board[i][j] = ret;
		}
	}
}
//void DisplayBoard(char board[ROWS][COLS])
//{
//	printf("--------扫雷游戏--------\n");
//	int i = 0, j = 0;
//	for (i = 0; i <= COL; i++)//打印列标
//	{
//		printf("%2d", i);
//	}
//	printf("\n");
//	for (i = 1; i <= ROW; i++)
//	{
//		printf("%2d", i);
//		for (j = 1; j <= COL; j++)
//		{
//			printf("%2c", board[i][j]);
//		}
//		printf("\n");//打印一行后换行
//	}
//	printf("\n");
//}


void DisplayBoard(char board[ROWS][COLS])
{
	printf("   --------------扫雷游戏--------------\n");
	int i = 0, j = 0;
	printf("   ");
	for (i = 1; i <= COL; i++)
	{
		printf("%3d ", i);
	}
	printf("\n");
	printf("   +");
	for (i = 0; i < COL; i++)
	{
		printf("---+");
	}
	printf("\n");
	for (i = 1; i <= ROW; i++)
	{
		printf("%2d", i);
		printf(" |");
		for (j = 1; j <= COL; j++)
		{
			printf(" %c |", board[i][j]);
		}
		printf("\n");
		printf("   +");
		for (j = 0; j < COL; j++)
		{
			printf("---+");
		}
		printf("\n");
	}

}


int Select()
{
	system("cls");
	int num = 0;
	while (1)
	{
		printf("请新选择难度:\n");
		printf("1.简单模式:5个雷	2.中等模式:10个雷	3.困难模式:15个雷	4.自定义难度(自由输入雷的个数)\n ");
		int select = 0;
		getchar();
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			printf("简单模式:5个雷\n");
			num = 5;
			return num;
		case 2:
			printf("中等模式:10个雷\n");
			num = 15;
			return num;
		case 3:
			printf("困难模式:15个雷\n");
			num = 30;
			return num;
		case 4:
			printf("自定义难度:");
			printf("请输入布置雷的个数:\n");
			getchar();//清楚缓存区
			int intput = 0;
			scanf("%d", &intput);
			num = intput;
			return num;
		default:
			printf("输入错误,请重新选择:\n");
			break;
		}
	}
	
}


void SetMine(char board[ROWS][COLS], int num)
{
	int x = 0, y = 0;
	int count = 0;
	while(count < num)
	{
		x = 1 + rand() % ROW;
		y = 1 + rand() % COL;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count++;
		}
	}
}



int GetMine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
			+ mine[x][y - 1] + mine[x][y + 1]+ mine[x + 1][y - 1] 
			+ mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}


Expand(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{

	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
	{
		int count = GetMine(mine, x, y);
		if (count == 0)
		{
			show[x][y] = ' ';
			int i = 0, j = 0;
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (show[i][j] == '*' && (i != x || j != y))
					{
						Expand(mine, show, i, j);
					}

				}
			}
		}
		else
		{
			show[x][y] = count + '0';
		}
	}
}


int is_win(char show[ROWS][COLS])
{
	int count1 = 0;
	int i = 0, j = 0;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			if (show[i][j] != '*')
			{
				count1++;
			}
		}
	}
	return count1;
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int num)
{
	system("cls");
	DisplayBoard(show);
	int x = 0, y = 0;
	int win = 0;
	while (win < (ROW * COL - num))
	{
		printf("请输入排查雷的坐标:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (mine[x][y] == '1')
			{
				system("cls");
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine);
				break;
			}
			else
			{

				Expand(mine, show, x, y);
				system("cls");
				win = is_win(show);
				DisplayBoard(show);
			}
		}
		else
		{

			printf("坐标非法,请重新输入:\n");
		}
	}
	if (win == (ROW * COL - num))
	{
		system("cls");
		printf("恭喜你排雷成功\n");
		DisplayBoard(show);
	}
}


test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("*******************************************************************\n");
	printf("********       1.玩游戏               2.退出游戏          *********\n");
	printf("*******************************************************************\n");
	printf("请输入你的选项:");
}
void game()
{


	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };


	InitBoard(mine, '0');
	InitBoard(show, '*');




	int num = Select();
	SetMine(mine, num);


	FindMine(mine, show, num);

}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			game();
			printf("再来一局吗?\n");
			printf("1.再来一局   2. 退出游戏\n");
			int again = 0;
			scanf("%d", &again);
			if (again == 1)
			{
				break;
			}
			else
				n = 0;
			break;
		case 2:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (n);
}


结语

近期更新大量C语言的博客,希望大家多支持!!!

有兴趣的小伙伴可以关注作者,如果觉得内容不错,请给个一键三连吧,蟹蟹你哟!!!
制作不易,如有不正之处敬请指出
感谢大家的来访,UU们的观看是我坚持下去的动力
在时间的催化剂下,让我们彼此都成为更优秀的人吧!!!
在这里插入图片描述

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

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

相关文章

从零开始,轻松打造Web自动化测试框架:Python+Selenium实战指南

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

广州虚拟动力亮相2023世界元宇宙生态博览会,邀您解锁元宇宙商机

2023年5月10-12日 2023第2届世界元宇宙生态博览会 在广州广交会展馆正式举办&#xff01; 广州虚拟动力携虚拟数字人全栈式解决方案参展 诚邀您莅临3.2馆A109-A110展位参观交流 2022年全国多个地方出台元宇宙政策文件&#xff0c;各地方政府的元宇宙产业扶持政策也在逐渐细…

webshell及工具

目录 一&#xff0c;Webshell的概念 二&#xff0c;eval函数的定义和用法 三&#xff0c;连接工具菜刀 3.1文件管理 3.2 虚拟终端 3.3 菜刀与burpsuite联动 四&#xff0c;哥斯拉的使用 五&#xff0c;冰蝎 六&#xff0c;webshell分类 七&#xff0c;webshell如何连接 …

哪个牌子的电视盒子好用?罗鹏数码盘点2023电视盒子排名

电视机资源少、卡顿&#xff0c;配置不足的时候只需要安装一台电视盒子就可以解决这些问题&#xff0c;不需要花费大价钱更换电视机。那么&#xff0c;你知道哪个牌子的电视盒子好用吗&#xff1f;今天罗鹏就来详细聊聊这个话题&#xff0c;分享2023最新电视盒子排名。 一&…

在家经济性雾视训练

如何使用睛延宝进行雾视训练&#xff0c;才能缩轴控度&#xff1f; 雾视的相关概念 首先大家要知道什么是雾视? 顾名思义&#xff0c;雾视就是眼睛看目标物时有点模糊&#xff0c;好像有层雾。 雾视的效果:放松睫状肌&#xff0c;拉薄晶状体&#xff0c;增厚脉络膜。 原理就…

如何与劳氏 Lowe‘s 建立EDI连接?

劳氏Lowes&#xff08;以下简称&#xff1a;Lowes&#xff09;是专门从事家庭装修的美国零售公司&#xff0c;而 EDI 则是电子数据交换的缩写&#xff0c;是指通过计算机网络进行企业间电子数据交换的一种标准化方式。 通过 EDI&#xff0c;企业与Lowes之间可以直接交换各种商…

【Java笔试强训 35】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;年会抽奖…

六、FM1288调试方案-调试过程及细节

本篇文章,主要讲述实际调试操作:具体到需要调节哪些寄存器,调节完后,会有什么样的变化。但是整体效果不能达到我们期望的绝对感觉,所以我先把我们调试的结果放在前面,如果觉得不理想,也可以不看后面的内容了。 文章目录 1. 调试准备1.1 建立与FM1288芯片通信1.2 Uart结…

IPv6有哪些优势?

现有的互联网是在IPv4协议的基础上运行的。IPv6是下一版本的互联网协议&#xff0c;也可以说是下一代互联网的协议&#xff0c;它的提出最初是因为随着互联网的迅速发展&#xff0c;IPv4定义的有限地址空间将被耗尽&#xff0c;而地址空间的不足必将妨碍互联网的进一步发展。 为…

1.100ASK-V853-PRO编译烧写

100ASK_V853-PRO 环境配置及编译烧写 0.前言 本章主要介绍关于100ASK_V853-PRO开发板的Tina SDK包的下载和编译打包生成镜像&#xff0c;并将镜像烧录到100ASK_V853-PRO开发板上。在进行100ASK_V853-PRO开发板的环境配置前需要获取配置虚拟机系统&#xff0c;可以参考&#x…

【HA】HomeAssistant 添加 小米温湿度计2代

本方法只是被动的获取小米温湿度计广播出的温度和湿度数据&#xff0c;并没有其他更多功能。 0. 本人配置 树莓派3B Debian 11 (Bullseye) 64 位 Supervisor 2023.05.dev0901 HomeAssistant 已安装 HACS 1. 安装 打开侧边栏中的HACS&#xff0c;点击“集成” 右下角找到“…

ACM - DP - 提高2 (状态机 + 状态压缩 + 区间 + 树形 + 数位 + 单调队列优化 + 斜率优化)

DP 类型题二 【跳转DP 类型题一 &#xff08;模型&#xff1a;数字三角形最长上升子序列背包】一、状态机模型1、AcWing 1057. 股票买卖 IV &#xff1a;两个状态转换2、AcWing 1058. 股票买卖 V &#xff1a;三个状态转换3、AcWing 1052. 设计密码 &#xff1a;T 维状态转换 …

IDEA创建接口类和接口实现类

IDEA创建接口类和接口实现类 IDEA创建接口类IDEA创建接口实现类 以创建Dao包下的代码为例。 IDEA创建接口类 选中要创建接口类的package&#xff0c;右键菜单依次选择New——Java Class。 在弹出的界面中&#xff0c;将创建的对象类型由Class改为Interface&#xff0c;如下图…

Jmeter接口测试流程详解

1、jmeter简介 Jmeter是由Apache公司开发的java开源项目&#xff0c;所以想要使用它必须基于java环境才可以&#xff1b; Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独立的线程对不同的功能同时取样。 2、jmeter安装 首先需要安装jdk&#xff08;最好是最…

“锻造”微生物组以帮助我们长寿和繁荣

谷禾健康 衰老通常伴随着心血管、神经和免疫系统等一系列疾病的风险增加。 虽然在理解微生物组导致与衰老相关的个别疾病的细胞和分子机制方面取得了显著进展&#xff0c;我们在之前的文章也有这方面的阐述&#xff1a; 肠道微生物群与健康长寿 肠道微生物群的老化及其对宿主免…

二、Linux入门| shell运行原理及Linux权限的理解

一、Linux 软件包管理器 - yum centos7的安装方式 1、源码安装&#xff08;较复杂&#xff09; 2、rpm包安装&#xff08;较复杂&#xff0c;未解决依赖关系&#xff09; 3、yum安装&#xff08;不用编译源码&#xff0c;不用解决软件的依赖关系&#xff0c;门槛较低&#xff…

LeetCode4. 寻找两个正序数组的中位数

写在前面&#xff1a; 题目链接&#xff1a;LeetCode4. 寻找两个正序数组的中位数 编程语言&#xff1a;C 题目难度&#xff1a;困难 一、题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中…

英文论文润色哪家好用比较好,有值得推荐的吗

英文论文润色 推荐 英文论文润色对于写作者来说是一项十分重要的任务&#xff0c;它可以帮助我们修改文章中的语法、标点和排版等问题&#xff0c;使论文更加准确和易读。在众多的英文润色软件中&#xff0c;147chatgpt改写润色软件是一款值得推荐的全自动批量图文润色、自动纠…

SSM框架学习-核心容器小结

1. 容器相关 Spring核心容器中的容器是指容器对象&#xff0c;用于管理和装配Bean。它主要包含以下四个容器&#xff1a; BeanFactory容器&#xff1a;是最简单的容器&#xff0c;提供实例化、配置和管理对象的基本功能&#xff0c;但不提供AOP、事务管理等高级功能。 Applica…

三分钟,带你了解零代码开发

企业数字化转型如火如荼的进行&#xff0c;五花八门的零代码、低代码工具正如雨后春笋一般出现&#xff0c;那么零代码开发是什么&#xff1f; 阅读本文您将了解&#xff1a; 零代码开发是什么零代码与企业数字化转型零代码开发带来的效益简道云零代码平台应用实例 一、零代…