SimpleCG小游戏开发系列(1)--扫雷

一、前言

        前面我们学习了SimpleCG的游戏开发框架,从本篇开始,我们用一系列小游戏的开发来加深对框架的了解.我们先以windows的经典游戏--扫雷,作为首个例子。游戏预览如下

二、框架搭建

        因为游戏程序的大体框架差不多,所以我们可以搭建一个通用的主程序。如下所示:

// GameMine.cpp : 定义控制台应用程序的入口点。
//#include "../import/include/SimpleCG.h"#define C_IMAGE_WIDTH			640
#define C_IMAGE_HEIGHT			480#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
#endifLRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam);//绘制游戏
void RenderGame()
{}
//更新游戏状态
void UpdateGame( UINT nElapse )
{static int s_nLastTick = 0;if( ( nElapse - s_nLastTick )<120 )return;s_nLastTick = nElapse;}
//按键消息响应函数
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{switch( wParam ){case VK_SPACE:break;case VK_UP:break;case VK_DOWN:break;case VK_LEFT:break;case VK_RIGHT:break;}return 0;
}
LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{return false;
}
LRESULT OnLButtonUp( HWND hWnd, WPARAM wParam, int nX, int nY )
{return false;
}
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{return false;
}
LRESULT OnRButtonUp( HWND hWnd, WPARAM wParam, int nX, int nY )
{return false;
}
LRESULT OnMouseMove( HWND hWnd, WPARAM wParam, int nX, int nY )
{return false;
}
//初始化游戏
void InitGame(HWND hWnd)
{int i=0;int j=0;srand(GetTickCount());GetKeyboardInput()->onKeyDown		= OnKeyDown;GetMouseInput()->onMouseDownLeft	= OnLButtonDown;GetMouseInput()->onMouseDownRight	= OnRButtonDown;GetMouseInput()->onMouseUpLeft		= OnLButtonUp;GetMouseInput()->onMouseUpRight		= OnRButtonUp;GetMouseInput()->onMouseMove		= OnMouseMove;
}int _tmain(int argc, _TCHAR* argv[])
{SCG_GameLoopInfo info;info.nFPS				= 60;info.nHeight			= C_IMAGE_BLOCK*g_nMapHeight+C_IMAGE_BLOCK;//C_IMAGE_HEIGHT;info.nWidth				= C_IMAGE_BLOCK*g_nMapWidth;//C_IMAGE_WIDTH;info.pFunDrawProcess	= RenderGame;info.pFunFrameUpdate	= UpdateGame;info.pFunInitGame		= InitGame;info.pFunInput			= NULL;if( !StartGameLoopEx( &info ))return 1;return 0;
}

        这个框架基本上就是前面文章所介绍的游戏开发框架。然后有了这个主框架,我们根据我们要开发的扫雷游戏,我们分别建立游戏逻辑的实现文件mine.cpp,以及头文件mine.h文件。在这两个文件中我们实现扫雷的相关逻辑,然后再把相关代码接入主程序即可。

三、游戏逻辑实现mine.cpp及mine.h文件

mine.h头文件


#ifndef _MINE_H
#define _MINE_H#include "../import/include/SimpleCG.h"
#define C_IMAGE_BLOCK			20
enum ENUM_MAPTYPE
{enumMAPTYPE_BACK, enumMAPTYPE_OPEN, enumMAPTYPE_BACKLIGHT, enumMAPTYPE_BACKDOWN
};
enum ENUM_MAPFLAG
{enumMAPFLAG_NULL, enumMAPFLAG_FLAG, enumMAPFLAG_QUESTION
};
enum ENUM_MAPTEXT
{enumMAPTEXT_NULL, enumMAPTEXT_NUMBER1, enumMAPTEXT_NUMBER2, enumMAPTEXT_NUMBER3, enumMAPTEXT_NUMBER4, enumMAPTEXT_NUMBER5, enumMAPTEXT_NUMBER6, enumMAPTEXT_NUMBER7, enumMAPTEXT_NUMBER8, enumMAPTEXT_NUMBER9, enumMAPTEXT_BOMB
};extern int g_nMapWidth;
extern int g_nMapHeight;
//绘制内容
void Init( int nBomb, int nX, int nY  );
//计算炸弹数量
int CalBoombCount( int nX, int nY );
//绘制内容
void DrawMap( );
//绘制界面
void DrawUI(  );
//绘制单个方块,绝对坐标
void DrawBlockPos( int nX, int nY, int nType );
//绘制单个方块
void DrawBlock( int nX, int nY, int nType );
//是否在地图上
bool IsOnMap( int nX, int nY );
//坐标转化
int ScreenToMapX( int nX );
int ScreenToMapY( int nY );
//鼠标消息
LRESULT MapOnLButtonDown( WPARAM wParam, int nX, int nY );
LRESULT MapOnLButtonUp( WPARAM wParam, int nX, int nY );
LRESULT MapOnRButtonDown( WPARAM wParam, int nX, int nY );
LRESULT MapOnRButtonUp( WPARAM wParam, int nX, int nY );
LRESULT MapOnMouseMove( WPARAM wParam, int nX, int nY );
//打开操作
void DoOpen( int nX, int nY );
//设置标记
void SetFlag( int nX, int nY, int nFlag );
//设置标记
void AddFlag( int nX, int nY );
#endif

mine.cpp实现文件

/*===========================================================*\
|简介:	扫雷
|功能:	扫雷
|作者:	Bill
|主页:	http://simplecg.qqpet.com
|博客:	https://blog.csdn.net/b2b160
|贴吧:	https://tieba.baidu.com/f?kw=simplecg
|日期:	2023-09-15
\*===========================================================*/
#include "Mine.h"int g_nMapWidth = 9;
int g_nMapHeight = 9;
int g_nMap[ 10 * 10] = {0};
int g_nMapText[ 10 * 10] = {0};
int g_nXMapPos = 0;
int g_nYMapPos = C_IMAGE_BLOCK;
int g_nBomb = 10;
int g_nLeftBomb = g_nBomb;int g_nCurX = -1;
int g_nCurY = -1;int g_nCurDownX = -1;
int g_nCurDownY = -1;
int g_nOpended = 0;
UINT g_nStartTime = 0;
UINT g_nGameRunning = 0;
//绘制内容
void Init( int nBomb, int nX, int nY )
{int i=0;int j=0;memset(g_nMap,0, sizeof(g_nMapText));memset(g_nMapText,0, sizeof(g_nMapText));int nTotal = nX*nY;if( nBomb>nTotal )nBomb = nTotal;g_nBomb = nBomb;g_nLeftBomb = g_nBomb;g_nMapWidth = nX;g_nMapHeight = nY;g_nOpended = 0;for(i=0;i<nBomb;++i){int nBombIndex = rand() % (nX*nY);if( g_nMapText[nBombIndex]!=enumMAPTEXT_BOMB){g_nMapText[nBombIndex]=enumMAPTEXT_BOMB;}else{int nStop = nBombIndex++;while( nBombIndex != nStop  ){if( g_nMapText[nBombIndex]!=enumMAPTEXT_BOMB ){g_nMapText[nBombIndex]=enumMAPTEXT_BOMB;break;}++nBombIndex;if(nBombIndex>=nTotal )nBombIndex = 0;}}}for(j=0;j<g_nMapHeight;++j){for(i=0;i<g_nMapWidth;++i){g_nMap[j*g_nMapWidth+i]=enumMAPTYPE_BACK;if(g_nMapText[j*g_nMapWidth+i] != enumMAPTEXT_BOMB )g_nMapText[j*g_nMapWidth+i]=CalBoombCount(i,j);}}g_nStartTime = GetTickCount();g_nGameRunning = TRUE;
}
//计算炸弹数量
int IsBoomb( int nX, int nY )
{if( nX<0 || nX>=g_nMapWidth )return 0;if( nY<0 || nY>=g_nMapHeight )return 0;if( g_nMapText[nY*g_nMapWidth+nX]==enumMAPTEXT_BOMB )return 1;return 0;
}
//计算炸弹数量
int CalBoombCount( int nX, int nY )
{int nCount = 0;if( IsBoomb(nX-1,nY-1 ) )++nCount;if( IsBoomb(nX,nY-1 ) )++nCount;if( IsBoomb(nX+1,nY-1 ) )++nCount;if( IsBoomb(nX-1,nY ) )++nCount;if( IsBoomb(nX+1,nY ) )++nCount;if( IsBoomb(nX-1,nY+1 ) )++nCount;if( IsBoomb(nX,nY+1 ) )++nCount;if( IsBoomb(nX+1,nY+1 ) )++nCount;return nCount;
}
//绘制内容
void DrawOpen( int nX, int nY )
{static COLORREF s_nColor[3]={RGB(200,0x0,0x0),RGB(0x0,0x0,200),RGB(22,122,11)};int nXPos = g_nXMapPos + nX*C_IMAGE_BLOCK;int nYPos = g_nYMapPos + nY*C_IMAGE_BLOCK;settextcolor(s_nColor[g_nMapText[nY*g_nMapWidth+nX]%3]);if( g_nMapText[nY*g_nMapWidth+nX]==enumMAPTEXT_BOMB)printfRectEx( nXPos, nYPos, C_IMAGE_BLOCK, C_IMAGE_BLOCK, DT_CENTER, _T("X"));else if(g_nMapText[nY*g_nMapWidth+nX]>0)printfRectEx( nXPos, nYPos, C_IMAGE_BLOCK, C_IMAGE_BLOCK, DT_CENTER, _T("%d"), g_nMapText[nY*g_nMapWidth+nX]);
}
//绘制内容
void DrawMap(  )
{int i=0;int j=0;for(j=0;j<g_nMapHeight;++j){for(i=0;i<g_nMapWidth;++i){switch( g_nMap[j*g_nMapWidth+i] & 0xFFFF ){case enumMAPTYPE_OPEN:DrawBlock( i, j, g_nMap[j*g_nMapWidth+i] );DrawOpen( i, j );break;case enumMAPTYPE_BACK:if( g_nCurDownX==i && g_nCurDownY==j )DrawBlock( i, j, enumMAPTYPE_BACKDOWN);else if( g_nCurX==i && g_nCurY==j )DrawBlock( i, j, enumMAPTYPE_BACKLIGHT | (g_nMap[j*g_nMapWidth+i]&0xFFFF0000) );elseDrawBlock( i, j, g_nMap[j*g_nMapWidth+i] );break;}}}
}
//绘制界面
void DrawUI(  )
{int nOld;if( FALSE == g_nGameRunning )return;UINT nTime = GetTickCount()-g_nStartTime;clearrectangle(g_nXMapPos, g_nYMapPos-C_IMAGE_BLOCK, g_nXMapPos + C_IMAGE_BLOCK*g_nMapWidth, g_nYMapPos);nOld = settextcolor(SCG_RGB(0,0,0xFF));printfRectEx( g_nXMapPos, g_nYMapPos-C_IMAGE_BLOCK, C_IMAGE_BLOCK*g_nMapWidth, C_IMAGE_BLOCK, DT_VCENTER, _T("时间:%d.%d"), nTime/1000,nTime%1000);printfRectEx( g_nXMapPos, g_nYMapPos-C_IMAGE_BLOCK, C_IMAGE_BLOCK*g_nMapWidth, C_IMAGE_BLOCK, DT_RIGHT|DT_VCENTER, _T("炸:%d"), g_nLeftBomb);settextcolor(nOld);
}
//绘制单个方块,绝对坐标
void DrawBlockPos( int nX, int nY, int nType )
{int nFlag = (nType>>16) & 0xFFFF;switch( nType & 0xFFFF ){case enumMAPTYPE_OPEN:setlinewidth(1);setfillcolor(RGB(194,194,194));setlinecolor(RGB(125,125,125));fillrectangle( nX, nY, nX + C_IMAGE_BLOCK, nY + C_IMAGE_BLOCK);break;case enumMAPTYPE_BACK:setlinewidth(3);setfillcolor(RGB(194,194,194));setlinecolor(RGB(125,125,125));fillrectangle( nX+1, nY+1, nX + C_IMAGE_BLOCK-1, nY + C_IMAGE_BLOCK-1);setlinecolor(RGB(231,231,231));line(nX+2, nY+1, nX-3 + C_IMAGE_BLOCK,nY+1);line(nX+1, nY+2, nX+1,nY-3 + C_IMAGE_BLOCK);break;case enumMAPTYPE_BACKDOWN:setlinewidth(1);setfillcolor(RGB(194,194,194));setlinecolor(RGB(125,125,125));fillrectangle( nX, nY, nX + C_IMAGE_BLOCK, nY + C_IMAGE_BLOCK);break;case enumMAPTYPE_BACKLIGHT:setlinewidth(3);setfillcolor(RGB(221,221,221));setlinecolor(RGB(125,125,125));fillrectangle( nX+1, nY+1, nX + C_IMAGE_BLOCK-1, nY + C_IMAGE_BLOCK-1);setlinecolor(RGB(231,231,231));line(nX+2, nY+1, nX-3 + C_IMAGE_BLOCK,nY+1);line(nX+1, nY+2, nX+1,nY-3 + C_IMAGE_BLOCK);break;}if( nFlag ){switch( nFlag ){case enumMAPFLAG_FLAG:{POINT pt[]={{nX+14,nY+2},{nX+6,nY+12},{nX+14,nY+12}};setlinewidth(1);setfillcolor(RGB(255,0,0));solidpolygon( pt, sizeof(pt)/sizeof(pt[0]) );setfillcolor(0);solidrectangle( nX+13, nY+4, nX + 16, nY + C_IMAGE_BLOCK-1);}break;case enumMAPFLAG_QUESTION:settextcolor(0);printfRectEx( nX, nY, C_IMAGE_BLOCK, C_IMAGE_BLOCK, DT_CENTER, _T("?"));break;}}
}
//绘制单个方块,地图坐标
void DrawBlock( int nX, int nY, int nType )
{int nXPos = g_nXMapPos + nX*C_IMAGE_BLOCK;int nYPos = g_nYMapPos + nY*C_IMAGE_BLOCK;DrawBlockPos(nXPos, nYPos, nType);
}
//是否在地图上
bool IsOnMap( int nX, int nY )
{if(nX>=g_nXMapPos && nX<g_nXMapPos + g_nMapWidth*C_IMAGE_BLOCK && nY>=g_nYMapPos && nY<g_nYMapPos + g_nMapHeight*C_IMAGE_BLOCK )return true;return false;
}
//坐标转化
int ScreenToMapX( int nX )
{int nRet = -1;if(nX>=g_nXMapPos && nX<g_nXMapPos + g_nMapWidth*C_IMAGE_BLOCK ){nRet =( nX-g_nXMapPos)/C_IMAGE_BLOCK;}return nRet;
}
int ScreenToMapY( int nY )
{int nRet = -1;if(nY>=g_nYMapPos && nY<g_nYMapPos + g_nMapHeight*C_IMAGE_BLOCK ){nRet =( nY-g_nYMapPos)/C_IMAGE_BLOCK;}return nRet;
}
//鼠标消息
LRESULT MapOnLButtonDown( WPARAM wParam, int nX, int nY )
{int nMapX = ScreenToMapX(nX);int nMapY = ScreenToMapY(nY);if( g_nCurDownX != nMapX || g_nCurDownY != nMapY ){ g_nCurDownX = nMapX;g_nCurDownY = nMapY;return true;}return false;
}
LRESULT MapOnLButtonUp( WPARAM wParam, int nX, int nY )
{if( g_nCurDownX >=0 && g_nCurDownX<g_nMapWidth && g_nCurDownY >=0 && g_nCurDownY<g_nMapHeight){DoOpen( g_nCurDownX, g_nCurDownY );g_nCurDownX = -1;g_nCurDownY = -1;return true;}return false;
}
LRESULT MapOnRButtonDown( WPARAM wParam, int nX, int nY )
{return false;
}
LRESULT MapOnRButtonUp( WPARAM wParam, int nX, int nY )
{int nMapX = ScreenToMapX(nX);int nMapY = ScreenToMapY(nY);AddFlag( nMapX, nMapY );return false;
}
LRESULT MapOnMouseMove( WPARAM wParam, int nX, int nY )
{int nMapX = ScreenToMapX(nX);int nMapY = ScreenToMapY(nY);if( g_nCurX != nMapX || g_nCurY != nMapY ){g_nCurX = nMapX;g_nCurY = nMapY;return true;}return false;
}
void MarkOpen(int nX, int nY)
{g_nMap[nY*g_nMapWidth+nX] = enumMAPTYPE_OPEN;++g_nOpended;if(g_nOpended>=g_nMapWidth*g_nMapHeight-g_nBomb){TCHAR pText[256];UINT nTime = GetTickCount()-g_nStartTime;wsprintf(pText, _T("You Win!用时%d.%d秒!是否重新开始?"), nTime/1000,nTime%1000);if( MessageBox(NULL,pText,_T(""),MB_YESNO) == IDYES )Init(g_nBomb, g_nMapWidth, g_nMapHeight);elseg_nGameRunning = FALSE;}
}
//打开操作
void DoOpenLoop( int nX, int nY )
{if(g_nMap[nY*g_nMapWidth+nX] == enumMAPTYPE_OPEN)return;MarkOpen(nX, nY);int i=0;int j=0;for(j=-1;j<=1;++j){for(i=-1;i<=1;++i){if((i+nX)<0||(i+nX)>=g_nMapWidth)continue;if((j+nY)<0||(j+nY)>=g_nMapHeight)continue;if(g_nMap[(j+nY)*g_nMapWidth+(i+nX)] == enumMAPTYPE_BACK){if(g_nMapText[(j+nY)*g_nMapWidth+(i+nX)] == enumMAPTEXT_NULL){DoOpenLoop( i+nX, j+nY );}else if(g_nMapText[(j+nY)*g_nMapWidth+(i+nX)] != enumMAPTEXT_BOMB){MarkOpen(i+nX, (j+nY));}}}}
}
void DoOpen( int nX, int nY )
{if(g_nMapText[nY*g_nMapWidth+nX] == enumMAPTEXT_BOMB ){g_nMap[nY*g_nMapWidth+nX] = enumMAPTYPE_OPEN;if( MessageBox(NULL,_T("游戏结束,是否重新开始?"),_T(""),MB_YESNO) == IDYES ){Init(g_nBomb, g_nMapWidth, g_nMapHeight);return;}else{g_nGameRunning = FALSE;return;}}else if(g_nMapText[nY*g_nMapWidth+nX] == enumMAPTEXT_NULL){DoOpenLoop( nX, nY );}if(g_nMap[nY*g_nMapWidth+nX] != enumMAPTYPE_OPEN ){MarkOpen(nX, nY);}
}
//设置标记
void SetFlag( int nX, int nY, int nFlag )
{int nOld = g_nMap[nY*g_nMapWidth+nX];g_nMap[nY*g_nMapWidth+nX] = (nOld & 0xFFFF) | (nFlag<<16);
}
//设置标记
void AddFlag( int nX, int nY )
{if((g_nMap[nY*g_nMapWidth+nX] &0xFFFF)==enumMAPTYPE_OPEN)return;int nOld = g_nMap[nY*g_nMapWidth+nX];int nOldFlag = (nOld>>16)&0xFFFF;++nOldFlag;if(nOldFlag == enumMAPFLAG_FLAG )--g_nLeftBomb;else if(nOldFlag == enumMAPFLAG_QUESTION )++g_nLeftBomb;if(nOldFlag>enumMAPFLAG_QUESTION){nOldFlag = 0;}g_nMap[nY*g_nMapWidth+nX] = (nOld & 0xFFFF) | (nOldFlag<<16);
}

四、逻辑接入主程序

在主程序中做以下几个修改,就将扫雷的逻辑接入主程序并将画面展现出来,同时接收用户的输入操作并反应。首先当然是包含逻辑头文件Mine.h

#include "Mine.h"

然后绘制画面

//绘制游戏
void RenderGame()
{setbackmode(enumBKM_TRANSPARENT);DrawMap();setbackmode(enumBKM_OPAQUE);//绘制界面DrawUI(  );
}

我们没有在更新函数中做任何更新,所以不需要改变UpdateGame

然后在鼠标输入操作中,我们需要判断是否在地图上并根据输入进行状态改变


LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( IsOnMap(nX,nY))return MapOnLButtonDown( wParam, nX, nY );return false;
}
LRESULT OnLButtonUp( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( IsOnMap(nX,nY))return MapOnLButtonUp( wParam, nX, nY );return false;
}
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( IsOnMap(nX,nY))return MapOnRButtonDown( wParam, nX, nY );return false;
}
LRESULT OnRButtonUp( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( IsOnMap(nX,nY))return MapOnRButtonUp( wParam, nX, nY );return false;
}
LRESULT OnMouseMove( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( IsOnMap(nX,nY))return MapOnMouseMove( wParam, nX, nY );return false;
}

最后在初始化阶段进行游戏初始化即可,此处初始化10个炸弹,9x9地图

Init( 10, 9, 9 );

四、代码下载

所有代码可在以下地址察看或下载,

gamemine · master · b2b160 / SimpleCG_Demo · GitCode

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

SimpleCG库安装方法

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

扫雷exe压缩文件

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

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

相关文章

导致Facebook广告投放不成功的原因

Facebook是全球最大的社交媒体平台之一&#xff0c;也是众多跨境卖家选择广告投放的首选平台&#xff0c;但也还是会有很多跨境卖家在Facebook上推广效果不佳。那么本文小编讲一下导致Facebook广告投放不成功的原因以及相应解决方法。 1、受众群体太少 Facebook有个要求就是广告…

Java之顺序栈实现数制转换问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道中等编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完成功&#xff0c;会…

数字人担任展会虚拟主持人,如何释放大会新活力?

近日&#xff0c;虚拟主持人谷小雨解锁新身份&#xff0c;作为第二届全球数字贸易博览会的“数字新闻官”为大众播报展会的热门新闻话题&#xff0c;带领大众探索未来数字贸易的无限可能。 *图片源于网络 随着元宇宙的概念更多地深入各领域&#xff0c;数字人多次以虚拟主持人或…

iframe内存泄露问题

场景 左边导航栏&#xff0c;顶部tab标签&#xff0c;下面的iframe是点击导航菜单生成的&#xff0c;顶部的tab标签对应每一个打开的菜单名称&#xff0c;可以点击关闭 问题 内存泄漏 解决 const delIframeDom document.getElementById(menuId);if (delIframeDom) {delI…

MySQL双主双从数据库集群搭建

1 引言 在之前的文章中提到过相关搭建方法&#xff0c;具体请参考《MySQL主从数据库搭建》这篇文章&#xff0c;本文主要讲述双主双从&#xff0c;双主多从集群的搭建方式。 这里要问一个问题&#xff0c;为什么MySQL要搭建数据库集群呢&#xff1f;我想应该有以下几点原因&…

面试题:Spring 中获取 Bean 的方式有哪些?

文章目录 前言1、在初始化时保存ApplicationContext对象2、通过Spring提供的工具类获取ApplicationContext对象3、实现接口ApplicationContextAware&#xff08;推荐&#xff09;4、继承自抽象类ApplicationObjectSupport5、继承自抽象类WebApplicationObjectSupport6、使用Bea…

【Python深度学习第二版】学习笔记之——什么是深度学习

机器学习是将输入&#xff08;比如图像&#xff09;映射到目标&#xff08;比如标签“猫”&#xff09;的过程。 这一过程是通过观察许多输入和目标的示例来完成的。 深度神经网络通过一系列简单的数据变换&#xff08;层&#xff09;来实现这种输入到目标的映射&#xff0c;这…

日期对象与节点操作

1.日期对象 1.1实例化 // 实例化const date new Date()console.log(date);// 返回指定时间const date1 new Date(2022-5-1 08:30:00)console.log(date1);1.2日期对象方法 1.3时间戳 三种获取时间戳的方法 const date new Date()console.log(date.getTime());console.log(ne…

MaskDINO环境搭建与模型测试

1、环境搭建 1、构建虚拟环境安装torch conda create -n mmdetsam python3.8 -y conda activate mmdetsampip install torch1.10.0cu102 torchvision0.11.0cu102 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://mirrors.aliyun.com/pypi…

【计算机网络学习之路】序列化,反序列化和初识协议

文章目录 前言一. 序列化和反序列化1.自己实现2. JSON 二. 初识协议结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇博文讲解应用层的序列化和反序列化&#xff0c;还有见一…

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先&#xff0c;uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的&#xff0c;在官方提供的案例当中&#xff0c;核心代码是这一部分&#xff1a; 但如果将其封装为组件&#xff0c;并在一个页面当中引用多次来生成多个charts图标&#xff0c;那么这个时…

大地测量乙级资质申请条件

整理一期关于测绘资质大地测量乙级资质的申请要求 测绘资质是由测绘资质主管部门自然资源部制定的 想要了解标准、正规的申请条件&#xff0c;可以到当地省份的政务网搜索测绘资质办理相关标准&#xff08;例如下图&#xff09; 1、通用标准 http://gi.mnr.gov.cn/202106/P02…

java 鸿鹄云商 SAAS云产品概述 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城免费搭建

【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营…

一秒开挂!纯 Python 开发 Web 应用

你好&#xff0c;我是 EarlGrey&#xff0c;喜欢翻译点东西&#xff0c;偶尔写写代码。 点击下方卡片关注我&#xff0c;一起向上进击&#xff0c;提升自我。后台回复关键词“电子书”&#xff0c;送你一份我收藏的电子书合集。 PyWebIO 是一个用于构建交互式 Web 应用程序的 P…

API网关

API网关的作用 下图显示了详细信息。 步骤 1 - 客户端向 API 网关发送 HTTP 请求。 步骤 2 - API 网关解析并验证 HTTP 请求中的属性。 步骤 3 - API 网关执行允许列表/拒绝列表检查。 步骤 4 - API 网关与身份提供商对话以进行身份​​验证和授权。 步骤 5 - 将速率限制规…

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接&#xff1a;https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒&#xff0c;毫…

浅析linux中的信号

人们往往将信号称为“软件中断”&#xff0c;它提供了异步事件的处理机制&#xff0c;这些事件可以来自系统外部&#xff08;如用户按下ctrlc产生中断符&#xff09;&#xff0c;也可能来自程序或者内核内部的执行动作&#xff08;如进程除零操作&#xff09;。进程收到信号&am…

AcWing 2816. 判断子序列

文章目录 AcWing 2816. 判断子序列我的思路CODE 欣赏大神代码给点思考 AcWing 2816. 判断子序列 题目链接&#xff1a;https://www.acwing.com/activity/content/problem/content/2981/ 我的思路 直接硬套模版&#xff0c;把两个指针两层循环写上如果匹配&#xff0c;记录数组…

汽车内饰灯不亮问题修复

车内饰灯不亮问题修复 最近换后座阅读灯火光闪了一下&#xff0c;保险丝短路&#xff0c;导致车内所有灯光&#xff0c;包括前后座阅读灯、后备箱灯都不亮了。 因为是所有灯都不亮&#xff0c;所以排除灯泡问题&#xff0c;网上查了下大概率是保险丝烧了。于是查了自己更换保…

idea下载与安装,以及创建一个项目写HelloWorld

1.idea下载 Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) Ultimate为旗舰版&#xff0c;功能全面&#xff0c;插件丰富&#xff0c;按年收费。 Community为社区版&#xff0c;免费试用&#xff0c;功能相对而言不是很丰富&#xff0c;但是不影…