C语言实现2048小游戏

news2024/12/26 23:16:50

大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌入式应用游戏部门的大佬设计的,适合于喜欢用C语言写一些简易的游戏的朋友,逻辑性很强。

一、2048游戏原理

在最初的游戏, 它始于一个空4 x 4游戏板。

1)在空位置的游戏板上,每一轮游戏产生一个“2”或“4”随机的数字。

2)接下来,玩家输入的上移,下移,左移或右移命令移动块。两个相邻块相同的号码,若是Q,可以组合成一个块数量2Q。

3)如果没有空间产生一个新的数字块,玩家则game over。

4)想赢得游戏,玩家需要产生一块2048数字块。

二、2048游戏文档

当然,这些游戏的逻辑不是大家闷着脑子就能空想出来的,它一定有很规范的说明文档,由专业的人来书写,最后软件工程师参考对应的文档编写自己的代码

篇幅有限,详细的下载链接:

链接:https://pan.baidu.com/s/1Daan58WN-A95BeYQcmSyDA
提取码:m6ie

当然也可以访问Github网站,这是一个开源的项目,后面各位牛逼的大佬经过移植后,运行在各个平台下,原版本链接如下:

http://gabrielecirulli.github.io/2048/

三、2048游戏源代码

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

//num
#define FALSE	0
#define TRUE	1

#define EMPTY_CELL     	0

#define GMAE_ROW	 	4
#define GMAE_COL		4

//GameState
#define STATE_SELECT   	0
#define STATE_PREPARE  	1
#define STATE_PALYING  	2
#define STATE_EXIT      3

//GameMode
#define MODE_NONE      	0
#define MODE_NORMAL    	1
#define MODE_DEBUG     	2

//Select Index
#define INDEX_MAXNUM    3
#define INDEX_NORMAL    0
#define INDEX_DEBUG     1
#define INDEX_EXIT      2

//Command
#define COM_LEFT		'a'
#define COM_RIGHT		'd'
#define COM_UP			'w'
#define COM_DOWN 		's'
#define COM_QUIT		'q'

//direction
#define DIR_HEAD        0xe0
#define KEY_UP			0xe048
#define KEY_DOWN 		0xe050
#define KEY_LEFT		0xe04b
#define KEY_RIGHT		0xe04d


#define ESC 			0x1B
#define ENTER			0x0D

//type
typedef unsigned int    Uint;
typedef unsigned short  Ushort;
typedef unsigned char   Uchar;

//declaration
static void GM_Init(void);
static void GM_End(void);

static Uint GM_SelectInit(void);
static Uint GM_SelectHandle(void);
static Uint GM_SelectEnd(void);

static Uint GM_PrepareInit(void);
static Uint GM_PrepareHandle(void);
static Uint GM_PrepareEnd(void);

static Uint GM_PlayingInit(void);
static Uint GM_PlayingHandle(void);
static Uint GM_PlayingEnd(void);


static Uint GM_SelectHandleEnter(void);
static Uint GM_SelectHandleEsc(void);
static void GM_PrintSelectMode(void);
static void GM_RandAddOneNum(void);
static Uchar GM_FromFileAddNum(void);
static Uchar GM_InputAddOneNum(void);
static Uchar GM_NotMoreMove(void);
static void GM_PrintBoard(void);

static Uchar GM_CheckWin2048(void);
static Uchar GM_PlayingPull(void);
static Uchar GM_CombineRight(Uint *array, int num);
static Uchar GM_CombineLeft(Uint *array, int num);
static Uchar GM_MoveRight(Uint *array, int num);
static Uchar GM_MoveLeft (Uint *array, int num);

//struct
typedef  struct gameinfo {
	Uint  Board[GMAE_ROW][GMAE_COL];
	
	Uchar GameState;
	Uchar GameMode;
	
	Uchar StateSelectIndex;
	
	Uint  PlayingCommand;
	
}GameInfo, *P_GameInfo;

GameInfo GM;

int main(void)
{
	GM_Init();

	while(1)
	{	
		switch(GM.GameState)
		{
			case STATE_SELECT:		
				GM_SelectHandle();	
				break;
			case STATE_PREPARE:
				GM_PrepareHandle();
				break;	
			case STATE_PALYING:
				GM_PlayingHandle();
				break;	
			case STATE_EXIT:
			    goto GAME_EXIT;
			default:
				break;	  	
		}	       	   
    }

GAME_EXIT:
    GM_End();
    return 0;	
}

static void GM_Init(void)
{
	memset(&GM, 0, sizeof(GameInfo));
	srand((int)time(NULL));
	
	GM_SelectInit();
}

static void GM_End(void)
{	
	memset(&GM, 0, sizeof(GameInfo));	
	
	fflush(stdin);	
	printf("\nCommand [q] can quit\n");
	while('q' != getch());
	
}

static Uint GM_SelectInit(void)
{
	GM.GameState = STATE_SELECT;
    GM.StateSelectIndex = INDEX_NORMAL;
	GM_PrintSelectMode();
}

static Uint GM_SelectHandle(void)
{	
	GM_PrintSelectMode();	
	
    fflush(stdin);
    Uchar  ch1 = getch();
	if( ENTER == ch1)
	{
		GM_SelectHandleEnter();	
	}
	else if( ESC == ch1 )
	{	
		GM_SelectEnd();
		GM.GameState = STATE_EXIT;
	}
	else if ( DIR_HEAD == ch1)
	{
		Uchar  ch2 = getch();
		Ushort Key = (ch1 << 8)&0xff00 | ch2;
		switch(Key)
		{	    
			case KEY_UP:
				GM.StateSelectIndex = (GM.StateSelectIndex + INDEX_MAXNUM - 1) % INDEX_MAXNUM;
				break;
			
			case KEY_DOWN:
				GM.StateSelectIndex = (GM.StateSelectIndex + 1) % INDEX_MAXNUM;
				break;

			default:
				break;	
		}
	}
}

static Uint GM_SelectEnd(void){}


static Uint GM_PrepareInit(void)
{
	Uchar OldState = GM.GameState;
    GM.GameState = STATE_PREPARE;
	
	//from STATE_SELECT -->  STATE_PREPARE
	if(STATE_SELECT == OldState)
	{
		if(MODE_NORMAL == GM.GameMode)
		{
			GM_RandAddOneNum();
			GM_RandAddOneNum();	
		}
		else
		{
			GM_FromFileAddNum();	
		}
	}	
	//from STATE_PALYING -->  STATE_PREPARE
	else
	{
		if(MODE_NORMAL == GM.GameMode)
		{
			GM_RandAddOneNum();
		}
		else
		{
			GM_PrintBoard();		
			while(FALSE == GM_InputAddOneNum());
		}	
	}
	GM_PrintBoard();
}

static Uint GM_PrepareHandle(void)
{
	if(TRUE != GM_NotMoreMove())
	{
	    GM_PrepareEnd();
		GM_PlayingInit();
	}
	else
	{
		printf("Game Over!\n");	
		GM.GameState = STATE_EXIT;	
	}	
	
}

static Uint GM_PrepareEnd(void){}

static Uint GM_PlayingInit(void)
{
	GM.GameState = STATE_PALYING;
	printf( "PULL: [a]LEFT [d]RIGHT [w]UP [s]DOWN [q]QUIT\n" );	
	printf( "Command: ");
    fflush(stdout);
}

static Uint GM_PlayingHandle(void)
{		
	fflush(stdin);
	GM.PlayingCommand = getch();

	
	switch(GM.PlayingCommand)
	{
		case COM_LEFT:
		case COM_RIGHT:
		case COM_UP:
		case COM_DOWN:
			if( FALSE == GM_PlayingPull())
			{	
				printf("[Error] invalid direction\n");		
				printf( "Command: ");	
			}
			else
			{
				if( TRUE == GM_CheckWin2048() )
				{
					GM_PrintBoard();
					printf("you win !\n");
					GM.GameState = STATE_EXIT;
				}
				else
				{
					GM_PlayingEnd();
					GM_PrepareInit();
				}
			}
			break;
		case COM_QUIT:
			printf("Bye !\n");	
			GM.GameState = STATE_EXIT;	
			break;
		default:
			printf("[Error] Command is a, d, w, s, q \n");
			printf( "Command: ");
			fflush(stdout);
			break;
	}
	//GM_PrintBoard();
}

static Uint GM_PlayingEnd(void)
{
	GM.PlayingCommand = 0;
}


static Uint GM_SelectHandleEnter(void)
{
	switch(GM.StateSelectIndex)
	{
		case INDEX_NORMAL:			
		case INDEX_DEBUG:
		    if(INDEX_NORMAL == GM.StateSelectIndex)
			{
				GM.GameMode = MODE_NORMAL;
			}
		    else
			{
				GM.GameMode = MODE_DEBUG;
			}
			GM_SelectEnd();
			GM_PrepareInit();
			break;
			
		case INDEX_EXIT:
			GM_SelectEnd();
			GM.GameState = STATE_EXIT;	
			break;
			
		default:
			printf("error\n");
			break;
	}					
		
}

static Uint GM_SelectHandleEsc(void){}


static void GM_PrintSelectMode(void)
{
	system("cls");
	printf("# -  -  -  -  -  -  -  - #\n");
	printf("#     welcome to 2048    #\n");	
	printf("# -  -  -  -  -  -  -  - #\n");		
	printf("      MODU  SELECT        \n");
	
	printf("\n      ");
	printf(GM.StateSelectIndex==INDEX_NORMAL?"-->NORMAL":"   NORMAL");	 
    printf("\n      ");	
	printf(GM.StateSelectIndex==INDEX_DEBUG? "-->DEBUG ":"   DEBUG ");
	printf("\n      ");	
	printf(GM.StateSelectIndex==INDEX_EXIT?  "-->EXIT  ":"   EXIT  ");
}


static void GM_RandAddOneNum(void)
{
	int row, col;
		
	while (1)
	{
		row = rand() % GMAE_ROW;
		col = rand() % GMAE_COL;
		if ( GM.Board[row][col] == EMPTY_CELL )
		{
			GM.Board[row][col] = ((rand() % 2) + 1) * 2;
			break;
		}
	}	
}

static Uchar GM_FromFileAddNum(void)
{
	FILE  *infp;
	Uchar tmp[6],tmp1;
	Uchar ret = 0;
	Uchar i,j;
	
	if(infp = fopen("map.txt", "rb"))
	{
	    for(i = 0; i < GMAE_ROW * GMAE_COL; i++)
		{
			j = 0;
			memset(tmp, 0, sizeof(tmp));
			while(1)
			{
				if(!fread(&tmp[j], 1, 1, infp))
					ret |= 0x02;
				
				if(tmp[j] == ' ' || tmp[j] == '\n' || tmp[j] == 0)
					break;
				
				j++;	
			}	
			*(&GM.Board[0][0]+i) =  atoi((const char *)tmp);		
		}
	}
	else
	{
		ret |= 0x01;
	}
	
	if(NULL != infp)
	{
		fclose(infp);
	}
	
	if(ret != 0)
	{
		printf("read map txt fail\n");
	}
	return ret;
				
}

static Uchar GM_InputAddOneNum(void)
{
	int row, col, value;
	int ret = TRUE;
	printf("please input add one num!\n");
	printf("Row,Col,Value :");
	fflush(stdout);
	fflush(stdin);
	scanf("%d,%d,%d", &row, &col, &value);
		
	if(row >= GMAE_ROW || row < 0)
	{
		printf("[Error] Row is between 0 and %d !\n", GMAE_ROW-1);
		ret = FALSE;
	}
	
	if(col >= GMAE_COL || col < 0)
	{
		printf("[Error] Col is between 0 and %d !\n", GMAE_COL-1);
		ret = FALSE;
	}	
	
	if(ret == TRUE && GM.Board[row][col] != 0)
	{
		printf("[Error] ( %d , %d ) is occupied!\n", row, col);
		ret = FALSE;
	}
	
	if(value != 2 && value != 4)
	{
		printf("[Error] Cell Value is either 2 or 4\n");
		ret = FALSE;
	}
	
	if(ret == TRUE)
	{
		GM.Board[row][col] = value;
	}
	return ret;
}

static Uchar GM_NotMoreMove(void)
{
	int NotMoreMove = TRUE;
	int row, col;
	for ( row = 0; row < GMAE_ROW; row++)
	{
		for ( col = 0; col < GMAE_COL; col++)
		{		
			if(GM.Board[row][col] == 0)
			{
				NotMoreMove = FALSE;
				break;	
			}
			
			if( col+1 < GMAE_COL && GM.Board[row][col] == GM.Board[row][col+1])
			{
				NotMoreMove = FALSE;
				break;
			}	
			
			if( row+1 < GMAE_ROW && GM.Board[row][col] == GM.Board[row+1][col])
			{
				NotMoreMove = FALSE;	
			    break;	
			}							
		}
		if(FALSE == NotMoreMove)
			break;
	}	
	return NotMoreMove;
}

static void GM_PrintBoard(void)
{
	int row, col;	
	system("cls");
	printf("# -  -  -  -  -  -  -  - #\n");
	printf("#     welcome to 2048    #\n");	
	printf("# -  -  -  -  -  -  -  - #\n");	
	for ( row = 0; row < GMAE_ROW; row++)
	{
		for ( col = 0; col < GMAE_COL; col++)
		{
			printf(" + - -", GM.Board[row][col]);
		}
		printf(" +\n");
		for ( col = 0; col < GMAE_COL; col++)
		{
			if(0 == GM.Board[row][col])
				printf(" |    ");
			else	
				printf(" |%4d", GM.Board[row][col]);
		}
		printf(" |\n");
	}
	printf(" + + + + + + + + + + + + + \n");	
	
}

static Uchar GM_CheckWin2048(void)
{
	int row,col;
	 
	for ( row = 0; row < GMAE_ROW; row++)
	{
		for ( col = 0; col < GMAE_COL; col++)
		{
			if( GM.Board[row][col] == 2048 )
			{
				return TRUE;	
			}			
		}
	}			
	return FALSE;
}

static Uchar GM_PlayingPull(void)
{
	//GMAE_ROW  行 4
	//GMAE_COL  列 4	
	
	int index;
	int col, row;
	Uchar PullFlag = FALSE;
	Uint array[GMAE_ROW > GMAE_COL? GMAE_ROW:GMAE_COL];

	//******************COM_LEFT*******************
	if( COM_LEFT == GM.PlayingCommand)	
	for ( row = 0; row < GMAE_ROW; row++)
	{
		PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );
		PullFlag |= GM_CombineLeft( (Uint *)GM.Board[row], GMAE_COL );
		PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );	
	}
		
	//******************COM_RIGHT******************	
	else if( COM_RIGHT == GM.PlayingCommand)	
	for ( row = 0; row < GMAE_ROW; row++)
	{	
		PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );
		PullFlag |= GM_CombineRight( (Uint *)GM.Board[row], GMAE_COL );
		PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );		
	}
		
	//******************COM_UP*********************
	else if( COM_UP == GM.PlayingCommand)			
	for ( col = 0; col < GMAE_COL; col++)
	{
		for ( row = 0; row < GMAE_ROW; row++)
		{
			array[row] = GM.Board[row][col];				
		}
		
		//a col move Left		
		PullFlag |= GM_MoveLeft( (Uint *)array, GMAE_ROW );
		PullFlag |= GM_CombineLeft( (Uint *)array, GMAE_ROW );
		PullFlag |=	GM_MoveLeft( (Uint *)array, GMAE_ROW );	
				
		//write a col
		for ( row = 0; row < GMAE_ROW; row++)
		{
			GM.Board[row][col] = array[row];				
		}			
	}		

	//******************COM_DOWN******************
	else if( COM_DOWN == GM.PlayingCommand)			
	for ( col = 0; col < GMAE_COL; col++)
	{	
		//read a col
		for ( row = 0; row < GMAE_ROW; row++)
		{
			array[row] = GM.Board[row][col];				
		}
		
		//a col move right		
		PullFlag |= GM_MoveRight( (Uint *)array, GMAE_ROW );
		PullFlag |= GM_CombineRight( (Uint *)array, GMAE_ROW );	
		PullFlag |=	GM_MoveRight( (Uint *)array, GMAE_ROW );
	
		//write a col
		for ( row = 0; row < GMAE_ROW; row++)
		{
			GM.Board[row][col] = array[row];				
		}									
	}		

	return 	PullFlag;	
}

static Uchar GM_CombineLeft(Uint *array, int num)
{
	int i;
	Uchar CombineFlag = FALSE;
	for ( i = 0; i < num-1; i++ )
	{
		if( array[i] != 0 && array[i] == array[i+1] )
		{
			array[i]  *= 2;
			array[i+1] = 0;
			CombineFlag = TRUE;
		}						
	}		
	return CombineFlag;
}


static Uchar GM_CombineRight(Uint *array, int num)
{
	int i;
	Uchar CombineFlag = FALSE;
	for ( i = num-1; i >= 1; i-- )
	{
		if( array[i] != 0 && array[i] == array[i-1] )
		{
			array[i]  *= 2;
			array[i-1] = 0;
			CombineFlag = TRUE;
		}						
	}		
	return CombineFlag;
}


static Uchar GM_MoveRight(Uint *array, int num)
{
	int i;
	int index = num - 1;
	Uchar moveflg = FALSE;
		
	for(i = num-1; i >= 0; i--)
	{
		
		if(array[i] != 0)
		{
			if(array[i] != array[index])
			{
				array[index] = array[i];							
				moveflg = TRUE;
			}	
			index--;			
		}		
	}
	
	while(index != -1)
	{
		array[index] = 0;
		index--;
	}
	
	return moveflg;
	
}


static Uchar GM_MoveLeft(Uint *array, int num)
{
	int i;
	int index = 0;
	Uchar moveflg = FALSE;
		
	for(i = 0; i < num; i++)
	{
		
		if(array[i] != 0)
		{
			if(array[i] != array[index])
			{
				array[index] = array[i];							
				moveflg = TRUE;
			}	
			index++;			
		}		
	}
	
	while(index != num)
	{
		array[index] = 0;
		index++;
	}
	
	return moveflg;
	
}
 

四、运行结果

游戏主菜单界面,通过方向键选择,分别有NORMAL(正常进行游戏)、DEBUG(调试模式)、EXIT(退出游戏)

按回车键进入对应的模式。

用字母a、d、w、s、q分别代替左右上下以及退出键。

如果最后游戏成功了,则会提示成功,如果失败则会退出程序。

详细的游戏逻辑可通过代码以及文档进行了解。

-- End --

 

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

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

相关文章

简单使用gateway,以及gateway所需要的依赖

先声明&#xff0c;使用gateway需要有一定的SpringCloud的基础&#xff0c;再来使用时会看的很明白&#xff0c;使用前需要先开nacos服务&#xff0c;&#xff0c;确定无误。 下面直接开始 首先我们需要两个原来通信的模块&#xff0c;这里分别是service-const与service-provid…

《导航帖》-全系列软考A计划

专栏分享 点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 文章目录 &#x1f449;关于作者&#x1f449;前提&#x1f449;链接追踪&#x1f449…

高通 Camera HAL3:项目开发技术点总结

做高通 Camera HAL3开发的一些技术点的总结、整理。 做个记录&#xff0c;方便后续查阅。 1.目录、so、配置文件 productName是项目名 out Target路径&#xff1a;\out\target\product\productName\chi-cdk&#xff1a;\vendor\qcom\proprietary\chi-cdk\ldc node&#xff1…

【Hive】安装配置及导入Hdfs数据

知识目录 一、写在前面&#x1f495;二、Hive的安装与配置✨2.1 Hive简介2.2 上传与解压2.3 拷贝MySQL驱动2.4 hive-site.xml文件2.5 启动hive 三、导入Hdfs数据到Hive✨3.1 修改Hadoop集群配置3.2 初始化3.3 创建表3.4 从Hdfs导入数据 四、总结撒花&#x1f60a; 一、写在前面…

【Leetcode】贪心 区间问题 | 用最小数量的箭引爆气球、无重叠区间、划分字母区间、合并区间

452 用最少数量的箭引爆气球 更像一个重叠区间问题&#xff0c;贪心策略&#xff1a;应该在重叠最多处射出。 按区间左端点递增序进行排序&#xff0c;左端点相同时&#xff0c;按右端点递增序排序。 现在欲射穿气球 i i i&#xff0c;当发现相邻的两个区间有重叠时&#xff…

[230604] 听力TPO66汇总·上篇| C1 L1 C2|10:20~12:00

目录​​​​​​​ Science Fiction And Sci-fi-C1 错题分析 C1-3 细节双选题 C1 精听练习 做题笔记 Financial Advice-C2 全对 C2 精听练习 Sleep-L1 错题分析 L1-4 细节题 L1-5 细节双选题 L1 精听练习 做题笔记 词汇&#xff1a;http://t.csdn.cn/Zhuws 两篇对…

编译型语言与解释型语言的区别

用比喻来明编译型语言和解释型语言的区别&#xff1a; 假设你要理解一本书&#xff08;源代码&#xff09;将转化为一篇演讲稿&#xff08;机器代码&#xff09;。 编译型语言类似于你将整本书翻译成一篇演讲稿。你需要在事先对整本书进行翻译&#xff0c;将其转化为一份完整…

chatgpt赋能python:Python如何使用while函数倒序输出数字?

Python如何使用while函数倒序输出数字&#xff1f; Python是一种高级编程语言&#xff0c;它易于学习、易于使用&#xff0c;这使得它成为了非常受欢迎的编程语言之一。Python在各种应用程序中都有着广泛的应用&#xff0c;从Web开发到数据分析&#xff0c;甚至是人工智能等领…

脑疾病患者福音,又一家脑机接口公司完成首次人体试验

近日&#xff0c;脑机接口公司Precision Neuroscience宣布完成其神经植入系统的首次人体临床试验&#xff0c;该公司设计的植入系统在1平方厘米的面积上有1024个微型电极&#xff0c;这些电极被嵌入到与大脑表面一致的柔性薄膜中。这种薄膜只有人类头发厚度的五分之一&#xff…

chatgpt赋能python:Python中如何倒着输出字符串

Python中如何倒着输出字符串 在Python编程中&#xff0c;字符串是一种不可避免的数据类型&#xff0c;我们往往需要对字符串进行各种操作。其中&#xff0c;倒着输出字符串是一项基本的操作&#xff0c;对于初学者来说&#xff0c;可能并不是很容易理解。本文将介绍如何使用Py…

【算法题001】面试题 01.01. 判定字符是否唯一

题目来源&#xff1a;《程序员面试金典&#xff08;第 6 版&#xff09;》 1、Problem: 面试题 01.01. 判定字符是否唯一 文章目录 面试题 01.01. 判定字符是否唯一一、题目描述二、解决方案&#xff08;一&#xff09;方案一1、解题思路2、解题方法3、复杂度4、代码实现 &…

二本4年Java经验,大佬五面阿里(定薪45K)

前段时间刚面试上岸&#xff0c;先后面试了各大小公司&#xff0c;拿了一些 offer&#xff0c;有阿里&#xff0c;滴滴&#xff0c;快手&#xff0c;达达&#xff0c;得物等公司。面试的公司大部分都能过&#xff0c;所以这里给大家分享下自己的经验&#xff0c;也给自己做个归…

地震勘探基础(十二)之地震偏移处理

地震偏移处理 地震数据常规处理主要包括地震反褶积&#xff0c;水平叠加和地震偏移成像三大类。地震反褶积通过压缩地震子波提高地震分辨率&#xff0c;水平叠加的目的是提高信噪比&#xff0c;地震偏移成像的目的是提高地震空间分辨率和地震保真度。 在20世纪50年代&#xf…

【1】Midjourney新手必读

Midjourney官网网站&#xff1a;https://www.midjourney.com/ 问题一&#xff1a;Midjourney是什么 Midjourney 是 AI 生成算图工具&#xff0c;输入文字就会自动产生图像&#xff0c;目前架设在Discord频道上。 问题二&#xff1a;Discord频道是什么 Discord是国外的一个社…

Matlab快速入门——数组

学习目标&#xff1a;学习关于数组的详细知识&#xff08;喜欢的别忘记点赞收藏呦&#xff09; clear all; A[] %空数组 B[5 6 5 4 1] %行向量 C[5,5,5,4,4] %行向量 D[3;3;3;3;5] %列向量 EC %对行向量转置得到列向量 clear all…

实验篇(7.2) 09. 通过安全隧道走对方宽带上网 (FortiClient-IPsec) ❀ 远程访问

【简介】要想所有的流量都走安全隧道&#xff0c;就需要禁用隧道分割。这样上网流量也会通过隧道到达远端防火墙&#xff0c;再通过远端防火墙的宽带接口去到互联网。我们来看看FortiClient客户端用IPsec VPN是如何实现的。 实验要求与环境 OldMei集团深圳总部防火墙有两条宽带…

006:vue中el-tree 添加右键菜单的方法

第006个 查看专栏目录: 按照VUE知识点 ------ 按照element UI知识点 echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏…

document.URL与document.documentURI

document.URL与document.documentURI document.URL document.URL 返回当前文档的 URL 地址 该属性的值和DOM Level 0 中的document.location.href 属性的值是相等的。然而 document.location.href 是可写的&#xff0c;document.URL 是只读的。 document.documentURI 也返回…

【Linux】动态库与静态库,如何打包库,如何使用第三方库

文章目录 回顾基础学会打包自己的库并使用静态库打包库第三方库的使用 动态库打包库第三方库的使用 动态库加载以及周边问题 回顾基础 这篇文章主要对动静态库进行进一步的学习&#xff0c;关于动静态库的一些基础知识&#xff0c;请点击这篇文章的链接&#xff1a;【Linux】初…

【Docker】如何实现Docker 命令自动补全

前言 Docker 命令可以使用 tab 键补全。在命令行输入 Docker 命令时&#xff0c;只需输入前几个字符&#xff0c;然后按 Tab 键即可自动补全为正确的命令或参数。 例如&#xff0c;在命令行输入 docker r&#xff0c;然后按 Tab 键&#xff0c;就会自动补全为 docker run 命令…