SimpleCG小游戏开发系列(2)--贪吃蛇

news2024/11/23 1:12:01

一、前言

        在之前的C语言小游戏开发系列我们已经介绍了扫雷游戏的开发,本篇我们继续此系列第二篇,同样是比较简单但好玩的一个游戏--贪吃蛇。因为有了之前的游戏框架,我们只需要直接搬来原来的框架即可,可以省去不少活。

先看看游戏效果预览

下面进行详细的逻辑介绍。

二、玩法介绍

        贪吃蛇是一款经典的游戏,玩家需要控制一条蛇在屏幕上移动,不断吃掉食物并成长,同时要避免碰到墙壁或自己的身体。蛇在移动过程中会遇到食物,玩家需要让蛇的头部碰到食物,蛇就会自动将食物吞下,并且蛇的长度会相应增加。碰到墙壁或自己的身体就游戏结束。

三、主要逻辑及难点说明

        贪吃蛇游戏的核心逻辑在于蛇的移动和食物的生成。蛇的移动需要精确控制,避免蛇的头部碰到自己的身体或者墙壁,食物的生成需要有一定的随机性,使得游戏有一定的变化性。

        我们首先将游戏分三个场景进行绘制,分别是开始前的菜单显示、游戏进行中的场景显示、以及游戏结束界面的显示。我们可以直接用一个全局整型变量g_nGameState来区分场景。在游戏进行时我们主要绘制蛇行走的地图,这个在前面扫雷游戏中有所介绍,大同小异,主要就是一个一维数组实现的二维平面。

int		g_nMap[ C_MAP_WIDTH * C_MAP_HEIGHT]		= {0};

然后是蛇的表示,我们用一个坐标数组来表示蛇身体所处地图位置。

POINT	g_ptSnake[C_SNAKE_MAXLEN];

 地图绘制就是根据地图表示的地形绘制出相应内容

for(j=0;j<C_MAP_HEIGHT;++j)
	{
		for(i=0;i<C_MAP_WIDTH;++i)
		{
			switch( g_nMap[j*C_MAP_WIDTH+i] )
			{
			case enumMAPTYPE_STONE:
				solidrectangle( i*C_IMAGE_BLOCK, j*C_IMAGE_BLOCK, i*C_IMAGE_BLOCK+C_IMAGE_BLOCK, j*C_IMAGE_BLOCK+C_IMAGE_BLOCK);
				break;
			case enumMAPTYPE_FOOD:
				setfillcolor(RGB(0xAA,0x0,0x0));
				solidcircle( i*C_IMAGE_BLOCK+10, j*C_IMAGE_BLOCK+10, 5);
				setfillcolor(RGB(0xAA,0xAA,0xAA));
				break;
			}
			
		}
	}

蛇的行走就只需要根据当前方向进行坐标移动就可以了

switch( g_nSnakDir )
	{
	case enumDIR_LEFT:
		SnakeMoveTo(g_ptSnake[0].x-1,g_ptSnake[0].y);
		break;
	case enumDIR_RIGHT:
		SnakeMoveTo(g_ptSnake[0].x+1,g_ptSnake[0].y);
		break;
	case enumDIR_UP:
		SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y-1);
		break;
	case enumDIR_DOWN:
		SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y+1);
		break;
	}

以上就是贪吃蛇涉及的主要设计难点,都比较容易理解,就不展开讨论了。

 四、主体逻辑的所有源代码

        以下就是贪吃蛇的全部主要代码,只是示例程序,所以只设置了一关、有兴趣的同学可以自行扩展代码。

// GameSnake.cpp : 定义控制台应用程序的入口点。
//

#include "../import/include/SimpleCG.h"
#include "GameUI.h"


#ifdef _DEBUG
#pragma comment(lib,"../import/lib/SimpleCG_MDd.lib")
#else
#ifdef _WIN64
#pragma comment(lib,"../import/lib/x64/MTRelease/SimpleCG_MT64.lib")
#else
#pragma comment(lib,"../import/lib/SimpleCG_MT.lib")
#endif
#endif


#define C_SNAK_VERSION			1001

#define C_IMAGE_WIDTH			640
#define C_IMAGE_HEIGHT			480
#define C_IMAGE_BLOCK			20
#define C_MAP_WIDTH				C_IMAGE_WIDTH/C_IMAGE_BLOCK
#define C_MAP_HEIGHT			C_IMAGE_HEIGHT/C_IMAGE_BLOCK
#define C_SNAKE_MAXLEN			50
enum ENUM_GAMESTATE
{
	  enumGS_MENU
	, enumGS_RUNNING
	, enumGS_GAMEOVER
};
enum ENUM_MAPTYPE
{
	  enumMAPTYPE_NULL
	, enumMAPTYPE_STONE
	, enumMAPTYPE_FOOD
};
enum ENUM_DIRECTION
{
	  enumDIR_LEFT
	, enumDIR_RIGHT
	, enumDIR_UP
	, enumDIR_DOWN
};
int		g_nMap[ C_MAP_WIDTH * C_MAP_HEIGHT]		= {0};
int		g_nSnakDir								= enumDIR_LEFT;
POINT	g_ptSnake[C_SNAKE_MAXLEN];
int		g_nSnakLen								= 2;
int		g_nGameState							= enumGS_MENU;
char	g_nTitle[] = { 0x4f,0x49,0x49,0x79,0x0,0x7f,0xe,0x30,0x7f,0x0,0x7e,0x9,0x9,0x7e,0x0,0x7f,0x8,0x14,0x63,0x0,0x7f,0x49,0x49,0x49 };
char	g_pGame[] = { 0x7f,0x41,0x5d,0x49,0x7b,0x0,0x7c,0x12,0x11,0x12,0x7c,0x0,0x7f,0x2,0x4,0x2,0x7f,0x0,0x7f,0x49,0x49,0x49,0x49 };
char	g_pOver[] = { 0x7f,0x41,0x41,0x41,0x7f,0x0,0x1f,0x20,0x40,0x20,0x1f,0x0,0x7f,0x49,0x49,0x49,0x49,0x0,0x7f,0x9,0x19,0x29,0x46 };
int		g_nMenu = 0;
int		g_nScore = 0;
int		g_nSpeed = 1;
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY );
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY );
LRESULT OnMouseMove( HWND hWnd, WPARAM wParam, int nX, int nY );
//绘制标题
void DrawTitle( int nX, int nY, char *pTitle, int nSize);
void MakeFood()
{
	bool bFoodSet = false;
	int nRand = 0;
	while(!bFoodSet)
	{
		nRand=rand()%(C_MAP_WIDTH*C_MAP_HEIGHT);
		if(g_nMap[nRand] == enumMAPTYPE_NULL )
		{
			g_nMap[nRand] = enumMAPTYPE_FOOD;
			bFoodSet = true;
		}
	}
}
//初始化游戏
void InitGame(HWND hWnd)
{
	int i=0;
	int j=0;
	for(j=0;j<C_MAP_HEIGHT;++j)
	{
		for(i=0;i<C_MAP_WIDTH;++i)
		{
			if(i==0||i==C_MAP_WIDTH-1||j==0||j==C_MAP_HEIGHT-1)
			{
				g_nMap[j*C_MAP_WIDTH+i] = enumMAPTYPE_STONE;
			}
			else
			{
				g_nMap[j*C_MAP_WIDTH+i] = enumMAPTYPE_NULL;
			}
			
		}
	}
	g_nSpeed = 1;
	g_nSnakLen = 2;
	g_ptSnake[0].x = 10;
	g_ptSnake[0].y = 10;
	g_ptSnake[1].x = 11;
	g_ptSnake[1].y = 10;
	g_nSnakDir = enumDIR_LEFT;
	srand(GetTickCount());
	MakeFood();
	//按键处理初始化
	//SetKeyboardProcess( enumINMSG_KEYDOWN, OnKeyDown );
	GetKeyboardInput()->onKeyDown		= OnKeyDown;
	GetMouseInput()->onMouseDownLeft	= OnLButtonDown;
	GetMouseInput()->onMouseDownRight	= OnRButtonDown;
	GetMouseInput()->onMouseMove		= OnMouseMove;
	g_nGameState = enumGS_MENU;
}
//移动蛇
void SnakeMoveTo(int x, int y)
{
	int i=0;
	if(x<0 || y<0 || x>=C_MAP_WIDTH || y>=C_MAP_HEIGHT )
		return;
	//GetFood
	if(g_nMap[y*C_MAP_WIDTH+x]==enumMAPTYPE_FOOD)
	{
		g_nMap[y*C_MAP_WIDTH+x]=enumMAPTYPE_NULL;
		g_ptSnake[g_nSnakLen].x = g_ptSnake[g_nSnakLen-1].x;
		g_ptSnake[g_nSnakLen].y = g_ptSnake[g_nSnakLen-1].y;
		if( g_nSnakLen<C_SNAKE_MAXLEN-1)
			g_nSnakLen++;

		g_nScore += 10 * g_nSpeed;
		g_nSpeed = g_nSnakLen / 5 + 1;
		MakeFood();
	}
	else if(g_nMap[y*C_MAP_WIDTH+x]==enumMAPTYPE_STONE )//dead
	{
		g_nGameState = enumGS_GAMEOVER;
		return;
	}
	for(i=g_nSnakLen-1;i>0;--i)
	{
		if( g_ptSnake[i].x==x && g_ptSnake[i].y==y )
		{
			g_nGameState = enumGS_GAMEOVER;
			return;
		}
		g_ptSnake[i].x = g_ptSnake[i-1].x;
		g_ptSnake[i].y = g_ptSnake[i-1].y;
	}
	g_ptSnake[0].x = x;
	g_ptSnake[0].y = y;
}
//按方向移动
void MoveFoward()
{
	switch( g_nSnakDir )
	{
	case enumDIR_LEFT:
		SnakeMoveTo(g_ptSnake[0].x-1,g_ptSnake[0].y);
		break;
	case enumDIR_RIGHT:
		SnakeMoveTo(g_ptSnake[0].x+1,g_ptSnake[0].y);
		break;
	case enumDIR_UP:
		SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y-1);
		break;
	case enumDIR_DOWN:
		SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y+1);
		break;
	}
}
//更新游戏状态
void UpdateGame( UINT nElapse )
{
	static int s_nLastTick = 0;
	int nWait = 9-g_nSpeed;
	if(nWait<0)
		nWait = 1;
	if( ( nElapse - s_nLastTick )<nWait*50 )
		return;
	switch(g_nGameState)
	{
	case enumGS_MENU:
		break;
	case enumGS_RUNNING:
		s_nLastTick = nElapse;
		MoveFoward();
		break;
	case enumGS_GAMEOVER:
		break;
	}
	
}
//绘制地图
void DrawMap()
{
	int i=0;
	int j=0;
	setfillcolor(RGB(0xAA,0xAA,0xAA));
	for(j=0;j<C_MAP_HEIGHT;++j)
	{
		for(i=0;i<C_MAP_WIDTH;++i)
		{
			switch( g_nMap[j*C_MAP_WIDTH+i] )
			{
			case enumMAPTYPE_STONE:
				solidrectangle( i*C_IMAGE_BLOCK, j*C_IMAGE_BLOCK, i*C_IMAGE_BLOCK+C_IMAGE_BLOCK, j*C_IMAGE_BLOCK+C_IMAGE_BLOCK);
				break;
			case enumMAPTYPE_FOOD:
				setfillcolor(RGB(0xAA,0x0,0x0));
				solidcircle( i*C_IMAGE_BLOCK+10, j*C_IMAGE_BLOCK+10, 5);
				setfillcolor(RGB(0xAA,0xAA,0xAA));
				break;
			}
			
		}
	}
}
//绘制标题
void DrawTitle( int nX, int nY, char *pTitle, int nSize)
{
	int i=0;
	int j=0;
	for(i=0;i<nSize;++i)
	{
		int nNum = pTitle[i];
		for(j=0;j<8;++j)
		{
			if(nNum&0x1)
			{
				solidrectangle( nX+i*C_IMAGE_BLOCK, nY+j*C_IMAGE_BLOCK, nX+i*C_IMAGE_BLOCK+C_IMAGE_BLOCK, nY+j*C_IMAGE_BLOCK+C_IMAGE_BLOCK);
				
			}
			nNum>>=1;
		}
	}                                                                                                                                                                               
}
//绘制蛇
void DrawSnake()
{
	int i=0;
	setfillcolor(RGB(0x0,0xAA,0x0));
	for(i=0; i<g_nSnakLen; ++i)
	{
		solidrectangle( g_ptSnake[i].x*C_IMAGE_BLOCK, g_ptSnake[i].y*C_IMAGE_BLOCK, g_ptSnake[i].x*C_IMAGE_BLOCK+C_IMAGE_BLOCK, g_ptSnake[i].y*C_IMAGE_BLOCK+C_IMAGE_BLOCK);
	}
}
void DrawMenu()
{
	setfillcolor(RGB(0x0,0xAA,0x0));
	DrawTitle( 60, 60, g_nTitle, sizeof(g_nTitle)/sizeof(g_nTitle[0]));
	
	DrawButton( 200, 260, 120, 30, RGB(0x0,0xDD,0x0), 0, _T("开始游戏"));
	DrawButton( 200, 300, 120, 30, RGB(0x0,0xDD,0x0), 0, _T("退出游戏"));
	setlinecolor(0);
	fillcircle( 180, g_nMenu * 40 + 260 + 15, 10 );
}
//绘制游戏
void RenderGame()
{
	clearrectangle(0,0,C_IMAGE_WIDTH, C_IMAGE_HEIGHT);
	switch(g_nGameState)
	{
	case enumGS_MENU:
		DrawMenu();
		break;
	case enumGS_RUNNING:
		DrawMap();
		DrawSnake();
		RenderUI();
		break;
	case enumGS_GAMEOVER:
		DrawTitle( 100, 60, g_pGame, sizeof(g_pGame)/sizeof(g_pGame[0]));
		DrawTitle( 100, 220, g_pOver, sizeof(g_pOver)/sizeof(g_pOver[0]));
		
		settextcolor(0);
		printfRectEx( 0, 380, C_IMAGE_WIDTH, 20, SCG_TEXT_MIDDLE, _T("分数: %d"), g_nScore );
		//outtextRectEx( 0, 400, C_IMAGE_WIDTH, 100, _T("Press any key to continue..."), SCG_TEXT_MIDDLE);
		outtextRectEx( 0, 400, C_IMAGE_WIDTH, 100, _T("按任意键继续..."), SCG_TEXT_MIDDLE);
		break;
	}
}
//按键消息响应函数
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
	switch( g_nGameState )
	{
	case enumGS_MENU:
		switch( wParam )
		{
		case VK_DOWN:
			if( g_nMenu<1 )
				++g_nMenu;
			break;
		case VK_UP:
			if( g_nMenu> 0 )
				--g_nMenu;
			break;
		case VK_SPACE:
		case VK_RETURN:
			if( g_nMenu == 1)
				PostQuitMessage(0);
			else
				g_nGameState = enumGS_RUNNING;
			break;
		}
		break;
	case enumGS_RUNNING:
		switch( wParam )
		{
		case VK_DOWN:
			if(g_nSnakDir == enumDIR_LEFT || g_nSnakDir == enumDIR_RIGHT)
			{
				g_nSnakDir = enumDIR_DOWN;
				
				MoveFoward();
			}
			return 1;
			break;
		case VK_UP:
			if(g_nSnakDir == enumDIR_LEFT || g_nSnakDir == enumDIR_RIGHT)
			{
				g_nSnakDir = enumDIR_UP;
				
				MoveFoward();
			}
			return 1;
			break;
		case VK_LEFT:
			if(g_nSnakDir == enumDIR_UP || g_nSnakDir == enumDIR_DOWN)
			{
				g_nSnakDir = enumDIR_LEFT;
				
				MoveFoward();
			}
			return 1;
			break;
		case VK_RIGHT:
			if(g_nSnakDir == enumDIR_UP || g_nSnakDir == enumDIR_DOWN)
			{
				g_nSnakDir = enumDIR_RIGHT;
				
				MoveFoward();
			}
			return 1;
			break;
		}
		break;
	case enumGS_GAMEOVER:
		InitGame(NULL);
		break;
	}
	
	return 0;
}

LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{
	switch( g_nGameState )
	{
	case enumGS_MENU:
		if( g_nMenu == 1)
			PostQuitMessage(0);
		else
			g_nGameState = enumGS_RUNNING;
		break;
	case enumGS_RUNNING:
		switch(g_nSnakDir )
		{
		case enumDIR_LEFT:
			g_nSnakDir = enumDIR_DOWN;
			break;
		case enumDIR_RIGHT:
			g_nSnakDir = enumDIR_UP;
			break;
		case enumDIR_UP:
			g_nSnakDir = enumDIR_LEFT;
			break;
		case enumDIR_DOWN:
			g_nSnakDir = enumDIR_RIGHT;
			break;
		}
		break;
	case enumGS_GAMEOVER:
		InitGame(NULL);
		break;
	}
	return false;
}
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{
	if( g_nGameState == enumGS_RUNNING)
	{
		switch(g_nSnakDir )
		{
		case enumDIR_LEFT:
			g_nSnakDir = enumDIR_UP;
			break;
		case enumDIR_RIGHT:
			g_nSnakDir = enumDIR_DOWN;
			break;
		case enumDIR_UP:
			g_nSnakDir = enumDIR_RIGHT;
			break;
		case enumDIR_DOWN:
			g_nSnakDir = enumDIR_LEFT;
			break;
		}
	}
	return false;
}
LRESULT OnMouseMove( HWND hWnd, WPARAM wParam, int nX, int nY )
{
	if( g_nGameState == enumGS_MENU)
	{
		if( nY>=300)
			g_nMenu = 1;
		else
			g_nMenu = 0;
	}
	return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
	SCG_GameLoopInfo info;
	info.nFPS				= 60;
	info.nHeight			= C_IMAGE_HEIGHT;
	info.nWidth				= C_IMAGE_WIDTH;
	info.pFunDrawProcess	= RenderGame;
	info.pFunFrameUpdate	= UpdateGame;
	info.pFunInitGame		= InitGame;
	info.pFunInput			= NULL;

	if( !StartGameLoopEx( &info ))
		return 1;
	return 0;
}

五、代码及相关图形库下载

贪吃蛇完整VS2010工程可在以下地址下载。

gamesnake · master · b2b160 / SimpleCG_Demo · GitCode

编译此程序需安装SimpleCG库,安装方法如下: 

SimpleCG库安装方法

如果只想执行程序可在如下地址下载 

贪吃蛇执行程序

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

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

相关文章

命令行创建Vue项目

Vue项目创建 1. 打开UI界面 在命令行中&#xff0c;执行如下指令&#xff1a; vue ui 2. 打开项目管理器 3. 创建项目 创建项目的过程&#xff0c;需要联网进行&#xff0c;这可能会耗时比较长的时间&#xff0c;请耐心等待。 windows的命令行&#xff0c;容易卡顿&#xff0c…

使用Node Exporter采集主机数据

安装 Node Exporter 在 Prometheus 的架构设计中&#xff0c;Prometheus Server 并不直接服务监控特定的目标&#xff0c;其主要任务负责数据的收集&#xff0c;存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西&#xff0c;如主机的 CPU 使用率&#xff0c;我们…

3D 渲染如何帮助电商促进销售?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 3D 渲染图像因其高转化率而成为亚马逊卖家的最新趋势。它是电子商务平…

Linux 线程安全 (1)

文章目录 线程互斥概念互斥实际使用互斥锁的原理死锁问题说明 线程互斥概念 执行流 执行流是指操作系统对进程或线程的调度和执行顺序。它决定了程序中的指令按照何种顺序被执行。 现阶段可以粗浅的理解为&#xff0c;执行流决定执行哪个线程或进程的代码(或者说执行流决定了…

MyBatis标签及其应用示例

MyBatis标签及其应用示例 1. select 1.1 标签属性 id唯一的标识符parameterType传给此语句的参数的全路径名或别名如&#xff1a;com.xxx.xxx.demo.entity.User或userresultType语句返回值类型或别名。如果是集合List&#xff0c;此处填写集合的泛型T&#xff0c;而不是集合…

人机交互中信息数量与质量

在人机交互中&#xff0c;信息的数量和质量都是非常重要的因素。 信息的数量指的是交互过程中传递的信息的多少。信息的数量直接影响到交互的效率和效果&#xff0c;如果交互中传递的信息量太少&#xff0c;可能导致交互过程中的信息不足&#xff0c;用户无法得到想要的结果或者…

js实时监听input输入框值的变化

实习日记之通过调用common chemistry的api接口实现输入keyword查找cas号和mw。做了一个简单的html网页&#xff0c;用到了ajax技术。比较简单&#xff0c;适合刚入门的宝学习参考。代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

面试算法78:合并排序链表

题目 输入k个排序的链表&#xff0c;请将它们合并成一个排序的链表。 分析&#xff1a;利用最小堆选取值最小的节点 用k个指针分别指向这k个链表的头节点&#xff0c;每次从这k个节点中选取值最小的节点。然后将指向值最小的节点的指针向后移动一步&#xff0c;再比较k个指…

cleanmymac这个软件怎么样?值不值得下载

cleanmymac是我必装的mac端清理软件&#xff0c;界面简洁好看&#xff0c;完美适配mac系统&#xff0c;文件清理的速度、精度都比较优秀&#xff0c;还是比较不错的呢。cleanmymac作为一款第三方清洁应用程序&#xff0c;具有专业完整的清理功能&#xff0c;包括释放内存、一键…

Halcon阈值处理的几种分割方法threshold/auto_threshold/binary_threshold/dyn_threshold

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…

FairyGUI-Cocos Creator官方Demo源码解读

博主在学习Cocos Creator的时候&#xff0c;发现了一款免费的UI编辑器FairyGUI。这款编辑器的能力十分强大&#xff0c;但是网上的学习资源比较少&#xff0c;坑比较多&#xff0c;主要学习方式就是阅读官方文档和练习官方Demo。这里博主进行官方Demo的解读。 从gitee上克隆项目…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(15)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;14&#xff09; 1.3 PCI总线的存储器读写总线事务 1.3.4 PCI读写主存储器 前文已提到&#xff0c;由于本节内容较长&#xff0c;因此将后一部分内容放在本文中。 为…

基于Python、Keras和OpenCV的实时人脸活体检测

你在互联网上找到的大多数人脸识别算法和研究论文都遭受照片攻击。这些方法在检测和识别来自网络摄像头的图像、视频和视频流中的人脸方面非常有效。然而&#xff0c;他们无法区分现实生活中的面孔和照片上的面孔。这种无法识别人脸的现象是由于这些算法在二维帧上工作。 现在…

【JS笔记】JavaScript语法 《基础+重点》 知识内容,快速上手(二)

数组 什么是数组&#xff1f; 字面理解就是 数字的组合 其实不太准确&#xff0c;准确的来说数组是一个 数据的集合 也就是我们把一些数据放在一个盒子里面&#xff0c;按照顺序排好 [1, 2, 3, hello, true, false]这个东西就是一个数组&#xff0c;存储着一些数据的集合 …

深度学习框架Keras与Pytorch对比

对于许多科学家、工程师和开发人员来说&#xff0c;TensorFlow是他们的第一个深度学习框架。TensorFlow 1.0于2017年2月发布&#xff0c;可以说&#xff0c;它对用户不太友好。 在过去的几年里&#xff0c;两个主要的深度学习库Keras和Pytorch获得了大量关注&#xff0c;主要是…

【Java EE初阶五】wait及notify关键字

1. wait和notify的概念 所谓的wait和notify其实就是等待、通知机制&#xff1b;该机制的作用域join类似&#xff1b;由于多个线程之间是随机调度的&#xff0c;引入wait和notify就是为了能够从应用层面上&#xff0c;干预到多个不同线程代码的执行顺序&#xff0c;此处的干预&a…

C# WPF上位机开发(Web API联调)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多时候&#xff0c;客户需要开发的不仅仅是一个上位机系统&#xff0c;它还有其他很多配套的系统或设备&#xff0c;比如物流小车、立库、数字孪…

web前端开发html/css求职简介/个人简介小白网页设计

效果图展示&#xff1a; html界面展示&#xff1a; html/css代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.…

Java IDEA JUnit 单元测试

JUnit是一个开源的 Java 单元测试框架&#xff0c;它使得组织和运行测试代码变得非常简单&#xff0c;利用JUnit可以轻松地编写和执行单元测试&#xff0c;并且可以清楚地看到哪些测试成功&#xff0c;哪些失败 JUnit 还提供了生成测试报告的功能&#xff0c;报告不仅包含测试…

VSCode + vite + vue3断点调试配置

没想到这个配置我搞了一上午&#xff0c;网上很多的配置方案都没有效果。总算搞定了&#xff0c;特此记录一下。 首先需要在.vscode文件夹下面创建launch.json配置文件。然后输入如下配置&#xff1a; {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。//…