C语言实现游戏2048(超详细!!!超易懂!!!)

news2024/9/20 18:33:51

2048是众所周知的一款经典游戏,在曾经没有智能电脑和手机的年代,也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~

一、游戏2048的思路

2048游戏的玩法是在初始的时候,给玩家一个4*4格子的,其中内容全为空的棋盘。每过一回合,棋盘上就会在随机位置生成一个数字2,而2就是2048游戏中最小的数字。在每一回合中玩家需要输入W,S,A,D移动棋盘中现有的数字。(W代表上移,S代表下移,A代表左移,D代表右移)。而在数字的移动过程中,如果有两个数字大小相同,并且在移动过程中发生了碰撞,那么就会将两个数字合成为一个值为两数之和的数字当棋盘中所有格子都被装满时,则游戏结束

以上就是游戏2048的规则啦,那么让我们把这些规则一条条理清顺序,再对各个规则逐一击破吧~

1.打印游戏菜单

首先我们需要创造一个可以选择开始游戏和退出游戏的菜单。打印游戏菜单就没什么过多的要求,符合自己的审美,自己喜欢就好啦~

2.将4*4格内数据初始化

想要在每一个格子中填充数据,需要对每一个格子内的值进行初始化

3.在棋盘随机位置生成一个2

想要游戏正常运行,通过使用生成随机数的rand()函数,使棋盘每一回合生成一个2是不可或缺的条件。

4.打印游戏棋盘

我们需要创造一个能够容纳4*4格子内所有数值,并且又不失美观的棋盘。

5.实现WSAD移动数字功能

我们需要构建一个能够使输入WSAD时,使棋盘中的数字进行相应的移动

6.判断游戏是否结束

创造一个判断游戏结束的函数。

二、游戏2048的文件

实现游戏2048,需要分成头文件game.h源文件game.c源文件test.c三个文件。

他们的作用分别是:

  • game.h:作为头文件,它用来存放创造游戏所需要的各种类型的全局变量,并且也用来实现编写代码使所必需的函数说明
  • game.c: 存放各种实现游戏功能所需要的函数。
  • test.c:作为编译的主程序,存放主函数,编写实现游戏功能的主要思想。

三、实现游戏的各种函数

①打印游戏菜单

void GameInte()
{
	printf("**********************************\n");
	printf("--**--**- 游 戏  2 0 4 8 -**--**--\n");
	printf("**********************************\n");
	printf("***-*-*-*-*   1.play   *-*-*-*-***\n");
	printf("***-*-*-*-*   0.quit   *-*-*-*-***\n");
	printf("************----------************\n");
	printf("是否游玩?请输入>:");
}

我们需要将菜单函数GameInte在源文件game.c中进行创建和定义,然后再在头文件game.h中对函数进行声明。就像这个样子:

(给大家看一下game.h头文件中宏定义的数值和定义的全局变量,这样方便后期对数值修改,并且修改代码时也比较方便)

②棋盘的数据初始化

因为是4*4的数据,所以我们在上面定义了一个全局变量board[Row][Col]用来存放这4*4个的数值定义成int型方便后续接收整形数据也方便数值的打印。在这里我们将棋盘数据的初始值都设置成0

void BoardCreate(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = 0;
		}
	}
}

③打印游戏棋盘

因为在上面我们定义的,用于记录数据的二维数组中存放的数据为int型所以没办法像创造其他棋盘一样也用'  '来代表'空格子' ,所以在打印游戏棋盘的时候,我们可以使用一个if...else选择语句,使当格子中数值为0时,不打印格子中的数据。

void PrintBoard(int board[Row][Col], int row, int col)
{
	system("CLS");//清空上一回合的屏幕
	printf("\n");
	int i = 0;
	int j = 0;
	printf(" ----------2048 游戏----------\n");
	printf("-*-*-*-*-*- 0->exit -*-*-*-*-*- \n");
	printf("   +-----+-----+-----+-----+\n");
	for (i = 0; i < row; i++)
	{
		printf("   |");
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == 0)
				printf("     |");
			else
				printf("%4d |", board[i][j]);
		}
		printf("\n   +-----+-----+-----+-----+\n");
	}
	printf("w->up s->down a->left d->right\n");
	printf(" ----------2048 游戏----------\n");
}

游戏棋盘可以按照自己的意愿随意更改,我这只是一个参考,打印出来是这个样子的:

④在棋盘随机位置生成一个2

在棋盘的随机位置生成2就需要用到生成随机数的函数rand(),和使rand()变成"真正随机数"的srand()了。我们需要在test.c文件的主函数中输入srand((unsigned int)time(NULL))其作用是使生成随机数的rand()随时间变化而时刻变化。然后我们再在生成随机数的函数中,使用int a = rand() % row; int b = rand() % col来创造两个随机的坐标,再将对应坐标中的值改变为2。(如果坐标已经有数字,则使用goto语句跳转回去,重新生成坐标)

void TwoFind(int board[Row][Col], int row, int col)
{
	again:
	int a = rand() % row;
	int b = rand() % col;
	if (board[a][b] == 0)
	{
		board[a][b] = 2;
	}
	else
		goto again;
}

我们调试两次代码可以发现2生成的位置并不相同,这就代表功能的实现成功了。

⑤实现通过WSAD选择上下左右

我们通过使用for循环嵌套的方式,来遍历数组中的全部元素,通过W,S,A,D对应的上下左右移动,判断要移动的元素的上,下,左,右是否为0如果为0,则将元素向着对应的位置移动如果不为0则判断两元素是否相等,如果两元素相等,则将靠近此次移动方向的元素加倍,另一个元素则减少成0,如果两元素不相等则不对两元素进行移动处理

1.实现按W向上移动
void Wup(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = row - 1; i > 0; i--)
	{
		for (j = col - 1; j >= 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动
		{
			while (board[i][j] != 0 && board[i - 1][j] == 0)
			{
				board[i - 1][j] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = row - 1; i > 0; i--)
	{
		for (j = col - 1; j >= 0; j--)
		{
			while (board[i][j] == board[i - 1][j]&&board[i][j]!=0&&board[i-1][j]!=0)
			{
				board[i - 1][j] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}

或许有人会问,为什么for循环的遍历要逆向遍历呢?其实我最开始也是按照从头到尾的顺序遍历的,但是写完代码却发现每一次只能够将元素移动一个格子,后来我才发现:

比如,此时我们想把第三行的元素挪到第一行,如果是从前往后依次遍历数组,当我们把第三行的挪到第二行之后,紧接着就去遍历第四行了,不能再找到已经上移的元素所以就只能够实现一次移动。但如果我逆向遍历的话,当我将第三行的元素挪到了第二行,紧接着我就会遍历第二行,然后找到这个元素,再把它挪到第一行,这样就实现了按W上移的功能了。

通过这两张图来进行解释,可能会更加的一目了然。

之后我们进行W,S,A,D四种方向的移动时,也需要对照遍历的四种方向来选取正序遍历和逆序遍历。看了这两张图你应该就能明白我的意思啦~那么接下来让我们看看是否成功实现了W向上移动的功能:看来成功实现了移动的功能~再让我们看看将元素数值合并,和不相同的元素堆叠的功能是否实现吧!:看来也成功实现啦~

2.实现按S向下移动

和上面Wup的代码其实大同小异,只是向上移动时是当前元素与头顶的元素进行判断是否为0和比较大小,而向下移动则是当前元素与下方的元素进行判断是否为0和比较大小。

通过刚才的两张图,想必大家应该知道实现按S向下移动是正序遍历还是逆序遍历了吧~没错!就是正序遍历:

void Sdown(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row - 1; i++)//必须设置成<row - 1,防止while循环中越界访问
	{
		for (j = 0; j < col; j++)
		{
			while (board[i][j] != 0 && board[i + 1][j] == 0)
			{
				board[i + 1][j] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = 0; i < row - 1; i++)
	{
		for (j = 0; j < col; j++)
		{
			while (board[i][j] == board[i + 1][j] && board[i][j] != 0 && board[i + 1][j] != 0)
			{
				board[i + 1][j] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}

看来向下移动功能也实现啦~

3.实现按A向左移动

接下来的按A向左移动和按D向右移动跟上面的W向上移动和S向下移动,基本上是相同的东西,只要懂了上面两个代码,这两个自然也就懂了。那么我就不多废话,直接将代码奉上啦~

void Aleft(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = row - 1; i >= 0; i--)
	{
		for (j = col - 1; j > 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动
		{
			while (board[i][j] != 0 && board[i][j - 1] == 0)
			{
				board[i][j - 1] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = row - 1; i >= 0; i--)
	{
		for (j = col - 1; j > 0; j--)
		{
			while (board[i][j] == board[i][j - 1] && board[i][j] != 0 && board[i][j - 1] != 0)
			{
				board[i][j - 1] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}
4.实现按D向右移动
void Dright(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			while (board[i][j] != 0 && board[i][j + 1] == 0)
			{
				board[i][j + 1] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			while (board[i][j] == board[i][j + 1] && board[i][j] != 0 && board[i][j + 1] != 0)
			{
				board[i][j + 1] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}
5.选择上下左右

这个函数就是我们前四个函数的总和,我们需要利用switch语句来判断键盘上输入的W,S,A,D从而来通过case充当下一步函数的调用的过程。(在switch语句中可以添加一些其他的功能,比如说你想退出游戏,就加一个case 0的按键,然后写出对应功能的代码就可以啦,这里我只适配了退出游戏的case 0,其余的就交给小伙伴们自行探索啦~)

void ChooseMove(int board[Row][Col], int row, int col)
{
	again:
	char a = getch();
	switch(a)
	{
	case 'W':
	case 'w':
		Wup(board, Row, Col);
		break;
	case 'S':
	case 's':
		Sdown(board, Row, Col);
		break;
	case 'A':
	case 'a':
		Aleft(board, Row, Col);
		break;
	case 'D':
	case 'd':
		Dright(board, Row, Col);
		break;
	case '0':
	{
		printf("你确定要退出游戏吗?\n");
		printf("如果退出请输入0,继续游戏请按任意键\n");
		int choose;
		scanf("%d", &choose);
		if (choose == 0)
		{
			printf("退出游戏\n");
			exit(0);//程序正常结束执行
		}
		else
		{
			printf("返回游戏:\n");
			goto again;
		}
		break;
	}
	}
}

到了这里,我们的2048游戏基本上就能够进行游玩啦~

⑥判断游戏是否结束

判断游戏结束,我们只需要创造一个计数器,统计4*4棋盘中非零元素的数量,当非零元素的数量正好等于4*4时,那么游戏也就结束啦。

void over(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	int sum = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] != 0)
				sum++;
		}
	}
	if (sum == row * col)
	{
		PrintBoard(board, Row, Col);
		printf("对不起,格子已满,游戏到此为止了!!!\n");
		exit(0);
	}
}

好啦~至此我们的C语言游戏2048就基本完成啦~这个也是比较初阶版,适合刚入门的小伙伴们来刷题用~那么废话不多说,这就将完整代码双手奉上!

四、游戏2048完整代码

1.game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
#define Row 4
#define Col 4
int board[Row][Col];
//游戏菜单
void GameInte();

//4*4格内数据初始化
void BoardCreate(char board[Row][Col], int row, int col);

//在棋盘随机位置生成一个2
void TwoFind(char board[Row][Col], int row, int col);

//打印游戏界面
void PrintBoard(char board[Row][Col], int row, int col);

//实现按W键向上移动
void Wup(char board[Row][Col], int row, int col);

//实现按S键向下移动
void Sdown(int board[Row][Col], int row, int col);

//实现按A键向左移动
void Aleft(int board[Row][Col], int row, int col);

//实现按D键向右移动
void Dright(int board[Row][Col], int row, int col);

//实现通过WSAD选择上下左右
void ChooseMove(int board[Row][Col], int row, int col);

//判断游戏是否结束
void over(int board[Row][Col], int row, int col);

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"


void GameInte()
{
	printf("**********************************\n");
	printf("--**--**- 游 戏  2 0 4 8 -**--**--\n");
	printf("**********************************\n");
	printf("***-*-*-*-*   1.play   *-*-*-*-***\n");
	printf("***-*-*-*-*   0.quit   *-*-*-*-***\n");
	printf("************----------************\n");
	printf("是否游玩?请输入>:");
}
void BoardCreate(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = 0;
		}
	}
}

void TwoFind(int board[Row][Col], int row, int col)
{
	again:
	int a = rand() % row;
	int b = rand() % col;
	if (board[a][b] == 0)
	{
		board[a][b] = 2;
	}
	else
		goto again;
}

void PrintBoard(int board[Row][Col], int row, int col)
{
	system("CLS");//清屏上一次的棋盘
	printf("\n");
	int i = 0;
	int j = 0;
	printf(" ----------2048 游戏----------\n");
	printf("-*-*-*-*-*- 0->exit -*-*-*-*-*- \n");
	printf("   +-----+-----+-----+-----+\n");
	for (i = 0; i < row; i++)
	{
		printf("   |");
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == 0)
				printf("     |");
			else
				printf("%4d |", board[i][j]);
		}
		printf("\n   +-----+-----+-----+-----+\n");
	}
	printf("w->up s->down a->left d->right\n");
	printf(" ----------2048 游戏----------\n");
}

void Wup(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = row - 1; i > 0; i--)
	{
		for (j = col - 1; j >= 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动
		{
			while (board[i][j] != 0 && board[i - 1][j] == 0)
			{
				board[i - 1][j] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = row - 1; i > 0; i--)
	{
		for (j = col - 1; j >= 0; j--)
		{
			while (board[i][j] == board[i - 1][j]&&board[i][j]!=0&&board[i-1][j]!=0)
			{
				board[i - 1][j] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}

void Sdown(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row - 1; i++)//必须设置成<row - 1,防止while循环中越界访问
	{
		for (j = 0; j < col; j++)
		{
			while (board[i][j] != 0 && board[i + 1][j] == 0)
			{
				board[i + 1][j] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = 0; i < row - 1; i++)
	{
		for (j = 0; j < col; j++)
		{
			while (board[i][j] == board[i + 1][j] && board[i][j] != 0 && board[i + 1][j] != 0)
			{
				board[i + 1][j] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}

void Aleft(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = row - 1; i >= 0; i--)
	{
		for (j = col - 1; j > 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动
		{
			while (board[i][j] != 0 && board[i][j - 1] == 0)
			{
				board[i][j - 1] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = row - 1; i >= 0; i--)
	{
		for (j = col - 1; j > 0; j--)
		{
			while (board[i][j] == board[i][j - 1] && board[i][j] != 0 && board[i][j - 1] != 0)
			{
				board[i][j - 1] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}

void Dright(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			while (board[i][j] != 0 && board[i][j + 1] == 0)
			{
				board[i][j + 1] = board[i][j];
				board[i][j] = 0;
			}
		}
	}
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			while (board[i][j] == board[i][j + 1] && board[i][j] != 0 && board[i][j + 1] != 0)
			{
				board[i][j + 1] *= 2;
				board[i][j] = 0;
			}
		}
	}
	PrintBoard(board, Row, Col);
}

void ChooseMove(int board[Row][Col], int row, int col)
{
	again:
	char a = getch();
	switch(a)
	{
	case 'W':
	case 'w':
		Wup(board, Row, Col);
		break;
	case 'S':
	case 's':
		Sdown(board, Row, Col);
		break;
	case 'A':
	case 'a':
		Aleft(board, Row, Col);
		break;
	case 'D':
	case 'd':
		Dright(board, Row, Col);
		break;
	case '0':
	{
		printf("你确定要退出游戏吗?\n");
		printf("如果退出请输入0,继续游戏请按任意键\n");
		int choose;
		scanf("%d", &choose);
		if (choose == 0)
		{
			printf("退出游戏\n");
			exit(0);
		}
		else
		{
			printf("返回游戏:\n");
			goto again;
		}
		break;
	}
	}
}

void over(int board[Row][Col], int row, int col)
{
	int i = 0;
	int j = 0;
	int sum = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] != 0)
				sum++;
		}
	}
	if (sum == row * col)
	{
		PrintBoard(board, Row, Col);
		printf("对不起,格子已满,游戏到此为止了!!!\n");
		exit(0);
	}
}

3.test.c

#include"game.h"
void game()
{
	//初始化4*4格子内数据
	//BoardCreate(board, Row, Col);
	//打印游戏界面
	PrintBoard(board, Row, Col);
	//实现按W键向上移动
	//Wup(board, Row, Col);
	//实现按S键向下移动
	//Sdown(board,Row,Col);
	//实现按A键向左移动
	//Aleft(board, Row, Col);
	//实现按D键向右移动
	//Dright(board,Row,Col);
	//实现通过WSAD选择上下左右
	ChooseMove(board, Row, Col);
	//在棋盘随机位置生成一个2
	TwoFind(board, Row, Col);
	over(board, Row, Col);
}
int main()
{
	srand((unsigned int)time(NULL));
	GameInte();
	BoardCreate(board, Row, Col);
	int a = 0;
	do
	{
		scanf("%d", &a);
		if (a == 1)
		{
			game();
		}
		else if (a == 0)
		{
			printf("退出游戏\n");
			break;
		}
		else
		{
			printf("输入错误,重新输入:\n");
		}
	} while (a);
	return 0;
}

那么关于用C语言来实现游戏2048就讲解到这里啦~如果有说的不够充分或者有错误的地方,还希望各位能在评论区积极指出,我也会积极学习的!我们下期再见啦ヾ(•ω•`)o

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

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

相关文章

基于SpringBoot+Vue的供应商管理系统(带1w+文档)

基于SpringBootVue的供应商管理系统(带1w文档) 基于SpringBootVue的供应商管理系统(带1w文档) 现今&#xff0c;互联网在我们的日常生活占据着日益重要的地位&#xff0c;我们也越来越离不开对移动设备、电脑等上网设备的使用。传统的供应商管理系统模式主要依靠管理人员纯手工…

PyQt6简易案例代码GUI界面小工具——实现二维码生成器+自定义前后背景色(练手正合适)

目录 专栏导读PyQt6的介绍PyQt6的主要特点包括&#xff1a;使用PyQt6开发应用程序的一般步骤&#xff1a; 库的安装1、初始化与界面设计2、设置前景色、背景色功能完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双…

IP地址的构成

1. IPv4地址 IPv4地址是最早且目前仍然广泛使用的IP地址版本。由32位二进制数构成&#xff0c;应为32为二进制数太长了&#xff0c;所以我们通常用四个十进制数字来表示&#xff0c;每个数字之间用”.”分隔。这些数字的范围是0到255。IPv4地址的格式为&#xff1a; “A.B.C.…

2024世界机器人大会将于8月21日至25日在京举行

2024年的世界机器人大会预定于8月21日至25日&#xff0c;在北京经济技术开发区的北人亦创国际会展中心隆重举办。 本届大会以“共育新质生产力 共享智能新未来”为核心主题&#xff0c;将汇聚来自全球超过300位的机器人行业专家、国际组织代表、杰出科学家以及企业家&#xff0…

再启新征程——灵川县“灵秀山川”区域公共品牌发布会顺利举办

灵川县&#xff0c;自古便享有“楚越通衢&#xff0c;风气之先”的美誉&#xff0c;见证了无数文化的交流与融合。这里&#xff0c;土地肥沃&#xff0c;资源丰富&#xff0c;如同大自然的无尽宝库&#xff0c;孕育了琳琅满目的优质农特产品。立足于本地优势资源&#xff0c;灵…

Python | Leetcode Python题解之第329题矩阵中的最长递增路径

题目&#xff1a; 题解&#xff1a; class Solution:DIRS [(-1, 0), (1, 0), (0, -1), (0, 1)]def longestIncreasingPath(self, matrix: List[List[int]]) -> int:if not matrix:return 0rows, columns len(matrix), len(matrix[0])outdegrees [[0] * columns for _ in…

数字人直播间搭建教程比较:哪种方案更可行?

当前&#xff0c;数字人直播的应用潜力不断显现&#xff0c;各大中小型企业对其关注度和接受度持续上升&#xff0c;连带着各种数字人直播间搭建教程的阅读量也日益上涨。而不少创业者也因此发现了它所蕴含的市场需求和收益空间&#xff0c;并有了通过为企业搭建数字人直播间以…

三防平板定制化:驱动产业高效化发展的新动能

在数字化转型的浪潮中&#xff0c;三防平板作为一种坚固耐用、功能强大的移动设备&#xff0c;正逐渐成为各行各业提升效率、优化管理的关键工具。通过硬件和软件的定制化服务&#xff0c;三防平板不仅能满足特定行业的需求&#xff0c;更能在复杂的工作环境中展现出卓越的性能…

haproxy实验

目录 为什么要用haproxy&#xff1f; haproxy的基本部署实验&#xff1a; 环境准备&#xff1a; 详细步骤&#xff1a; haproxy-多进程与多线程实验&#xff1a; haproxy的全局global配置实验&#xff1a; 为什么要用haproxy&#xff1f; LVS&#xff1a;没有后端检测&a…

Linux学习笔记:Linux基础知识汇总(kill 进程-vi编辑检索-查看当前文件夹的大小-修复硬盘等)

常见指令 Linux 的 find 命令可以用于在指定目录下查找符合条件的文件或目录。find 命令的基本语法为&#xff1a; find [path] [expression]其中&#xff0c;path 指定要查找的目录路径&#xff0c;expression 指定查找条件。下面是一些常用的 find 命令用法和示例&#xff…

代理IP在社媒营销中的重要作用

伴随着互联网的发展&#xff0c;社交媒体成了人们日常生活中不可或缺的一部分。用户在社交媒体中的活跃度和对内容的分享促进信息内容在短期内迅速传播&#xff0c;使得社交媒体变成了店家推广与销售的重要途径。 随着社交媒体用户基数的不断扩大和社交平台功能的日益丰富&…

煤炭行业信息化运维方案:基于一体化监控管理平台的探讨

随着煤炭行业信息化和智能化进程的加速&#xff0c;煤炭企业面临着前所未有的运维挑战。如何在复杂多变的IT环境中确保系统的稳定运行&#xff0c;提高运维效率&#xff0c;降低运营成本&#xff0c;成为煤炭企业亟待解决的问题。本文将以煤炭行业信息化运维现状为背景&#xf…

C#如何将自己封装的nuget包引入到项目中

问题 自己封装好了一个nuget包&#xff0c;但是不想上传到外网&#xff0c;想局域网使用&#xff0c;有两种方案 搭建私有nuget仓库放到离线文件夹中直接使用 第一种方式请请参考proget安装 下面主要是第二种方式 准备 新建类库项目 using System;namespace ClassLibrary…

怎样才算精通 Excel?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 高赞回答很系统&#xff0c;但普通人这么学&#xff0c;没等精通先学废了&#xff01; 4年前&#xff0c;我为了学数据分析&#…

关于低代码这一技术的杂谈

一、探讨低代码的定义 “Low-Code”是什么&#xff1f;身为技术人员听到这种技术名词&#xff0c;咱们第一反应就是翻看维基百科 或者其他相关技术论文&#xff0c;咱们想看维基百科的英文介绍&#xff1a; A low-code development platform (LCDP) provides a development e…

Angiopep-2;脑靶向多肽;TFFYGGSRGKRNNFKTEEY;CAS:906480-05-5

【Angiopep-2简介】 Angiopep-2是一种由19个氨基酸组成的多肽&#xff0c;它能够与低密度脂蛋白受体相关蛋白1&#xff08;LRP1&#xff09;特异性结合&#xff0c;通过内吞方式进入脑组织。这种多肽因其与LRP1的亲和力以及对血脑屏障的穿透能力而受到广泛关注&#xff0c;被认…

IF=12.5!孟德尔随机化,GWAS玩出花 | 孟德尔随机化周报(7.25-7.31)

孟德尔随机化,Mendelian Randomization&#xff0c;简写为MR&#xff0c;是一种在流行病学领域应用广泛的一种实验设计方法&#xff0c;利用公开数据库就能轻装上阵写文章&#xff0c;甚至是高质量的论文。 孟德尔随机化通过引入一个称之为工具变量的中间变量&#xff0c;来分析…

【C++】vector习题

一、杨辉三角 class Solution { public:vector<vector<int>> generate(int numRows) {} }; 这里给你一个vector<vector<int>>类型 也就是说vector中的各个数据&#xff0c;存的是各个不同的vector 思路&#xff1a;先给vector开空间&#xff0c;然后…

嘉德立为您解析任务调度控制台的核心功能

在当今高度信息化与自动化的时代背景下&#xff0c;任务调度控制台作为系统管理与运维的核心工具&#xff0c;正日益成为提升企业运营效率、保障业务连续性的关键所在。任务调度控制台&#xff0c;顾名思义&#xff0c;是一个集中管理、监控与调度各类任务的平台&#xff0c;它…

智能爬虫ScrapeGraphAI尝鲜

ScrapeGraphAI是一个创新的Python库&#xff0c;它融合了大型语言模型&#xff08;LLM&#xff09;和直接图逻辑&#xff0c;为用户提供了一种高效的方法&#xff0c;用于构建针对网站、文档和XML文件的爬虫流水线。以下是关于ScrapeGraphAI的详细介绍&#xff1a; 一、核心特…