(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

植物大战僵尸游戏开发教程专栏地址icon-default.png?t=N7T8http://t.csdnimg.cn/xjvbb 


一、类介绍

游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到LoadingScene场景中,首先会创建该场景,会调用init函数,在该函数中调用自己定义的方法实现指定功能。

代码文件的位置如下图所示。

LoadingScene.h

/**
 *Copyright (c) 2019 LZ. All Right Reserved
 *Author : LZ
 *Date: 2019.7.15
 *Emal: 2117610943@qq.com
 */
#pragma once
#include "cocos2d.h"
#include "Scenes/MainMenuScene/MainMenu.h"
#include "ui/CocosGUI.h"
#include "Based/GlobalVariable.h"
#include "network/CCDownloader.h"
#include "Based/UserData.h"

using namespace cocos2d;
using namespace cocos2d::ui;
using namespace cocos2d::experimental;

class LoadingScene :public Scene
{
public:
	CREATE_FUNC(LoadingScene); 
	static Scene* createLaodingScene();
	static void loadUserFileData();
	static void caveUserFileData();

CC_CONSTRUCTOR_ACCESS:
	LoadingScene();
	~LoadingScene();
	virtual bool init() override; 

private:
	void update(float Time) override;                 /* 定时器 */
	void setSystem();                                 /* 设置系统参数 */
	void calculateFileNumbers();                      /* 计算文件总数 */
	void setRunFirstTime();                           /* 获取第一次运行时间 */

	void loadUserData();                              /* 加载用户数据 */
	void loadingText();                               /* 加载文字 */
	void loadingImage();                              /* 加载图片 */
	void loadingMusic();                              /* 加载音乐 */
	void loadingAnimation();                          /* 加载动画 */

	void showLoadingBackGround();                     /* 展示背景 */
	void showTileAndLoadingBar();                     /* 展示进度条 */
	void showLoadingBarFlower(const int &ID);         /* 展示进度条上的花 */
	void beginLoadingImageAndMusic();                 /* 开始加载图片与音乐 */

	void runLoGoCallBack(Node* node,const int &ID);   /* 展示logo回调 */
	void loadingTextCallBack();                       /* 加载文字回调 */
	void loadingAnimationCallBack();                  /* 加载动画回调 */
	void beginGameCallBack(Ref* pSender);             /* 开始游戏回调 */

	int openResourcesPath(map<string, string>& Path, const std::string& xml, bool IsEncryption = false);  /* 打开资源路径 */

	void throwException();
	void checkEdition();
	void changeFiles();

private:
	int _textNumbers;                                 // 文本数
	int _loadFileNumbers;                             // 文件加载数
	int _allFileNumbers;                              // 文件总数(图片,音乐,动画,文本)
	bool _flowerVisible[5] = { false };               // 加载花朵是否可见 
	float _loadingPrecent;                            // 加载进度 
	Sprite* _sprite[8];                               // 精灵图片 
	MenuItemLabel* _label;                            // 文字标签 
	LoadingBar* _loadingBar;                          // 进度条 
	EventListenerTouchOneByOne* _listener;            // 加载监听 
	Global* _global;                                  // 全局变量单例
	Director* _director;                              // 导演单例 
	FileUtils* _files;                                // 文件单例 
	UserData* _userData;
	std::unique_ptr<network::Downloader> _downloader;
};

LoadingScene.cpp 

由于cpp文件中的代码数量太多,所以就不全部放到这里了。

/**
 *Copyright (c) 2019 LZ.All Right Reserved
 *Author : LZ
 *Date: 2019.7.15
 *Emal: 2117610943@qq.com
 */

#include "LoadingScene.h"
#include "tinyxml2/tinyxml2.h"
#include "Based/LevelData.h"
#include "Based/UserInformation.h"
#include "Based/PlayMusic.h"
#include "AudioEngine.h"

#define MYDEBUG 1

LoadingScene::LoadingScene() :
	_loadFileNumbers(0),
	_textNumbers(0),
	_allFileNumbers(0),
	_loadingPrecent(0),
	_label(nullptr),
	_loadingBar(nullptr),
	_listener(nullptr),
	_global(Global::getInstance()),
	_director(Director::getInstance()),
	_files(FileUtils::getInstance()),
	_userData(UserData::getInstance())
{
	_downloader.reset(new network::Downloader());
}

LoadingScene::~LoadingScene()
{
	SpriteFrameCache::getInstance()->removeSpriteFramesFromFile("resources/images/LoadingScene/LoadingScene.plist");
}

Scene* LoadingScene::createLaodingScene()
{
	return LoadingScene::create();
}

bool LoadingScene::init()
{
	if (!Scene::init())return false;

#if MYRELEASE
#   if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
	checkEdition();          /* 检查版本 */
#   endif
#endif
	setRunFirstTime();       /* 获取第一次运行时间 */
	calculateFileNumbers();  /* 计算文件总数 */
	setSystem();             /* 设置系统参数 */
	loadUserData();          /* 加载用户信息 */
	showLoadingBackGround(); /* 展示加载界面 */

	return true;
}

//... 省略,代码数量太多,请到github/gitee仓库中查看

二、函数讲解

init()函数

bool LoadingScene::init()
{
	if (!Scene::init())return false;

#if MYRELEASE
#   if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
	checkEdition();          /* 检查版本 */
#   endif
#endif
	setRunFirstTime();       /* 获取第一次运行时间 */
	calculateFileNumbers();  /* 计算文件总数 */
	setSystem();             /* 设置系统参数 */
	loadUserData();          /* 加载用户信息 */
	showLoadingBackGround(); /* 展示加载界面 */

	return true;
}

 LoadingScene中的init函数重写父类Scene中的init函数。在该函数中首先调用父类init函数,如果父类init函数初始化失败,表示场景创建失败,所以直接返回false,退出场景。否则继续向下执行。

#if MYRELEASE
#   if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
	checkEdition();          /* 检查版本 */
#   endif
#endif

上述代码使用了条件编译,如果是release发布的版本,并且平台是windows,则会执行版本更新检查函数。否则不会编译这段代码。在debug版本中不会进行版本更新检查。

之后init函数会继续往下执行以下函数。如果全部执行成功,最后返回true,表示场景创成功。

setRunFirstTime();       /* 获取第一次运行时间 */
calculateFileNumbers();  /* 计算文件总数 */
setSystem();             /* 设置系统参数 */
loadUserData();          /* 加载用户信息 */
showLoadingBackGround(); /* 展示加载界面 */

setRunFirstTime()函数

void LoadingScene::setRunFirstTime()
{
	time_t tt;
	struct tm* nowtime;
	time(&tt);
	nowtime = localtime(&tt);

	if (UserDefault::getInstance()->getStringForKey("FIRSTRUNTIME").size() == 0)
	{
		UserDefault::getInstance()->setStringForKey("FIRSTRUNTIME", to_string(nowtime->tm_year + 1900) + "年 " +
			to_string(nowtime->tm_mon) + "月 " + to_string(nowtime->tm_mday) + "日 星期" + to_string(nowtime->tm_wday) + " " +
			to_string(nowtime->tm_hour) + "时 " + to_string(nowtime->tm_min) + "分 " + to_string(nowtime->tm_sec) + "秒");
	}

	UserDefault::getInstance()->setIntegerForKey("BEGINDAY", nowtime->tm_mday);
	UserDefault::getInstance()->setIntegerForKey("BEGINHOUR", nowtime->tm_hour);
	UserDefault::getInstance()->setIntegerForKey("BEGINMIN", nowtime->tm_min);
	UserDefault::getInstance()->setIntegerForKey("BEGINSEC", nowtime->tm_sec);
}

在该函数中首先获取系统时间,然后判断是否是第一次执行,如果是的话就会记录当前执行的时间。

Cocos2d-x中使用UserDefault类来存储游戏信息,它存储的格式是html格式,使用键值对的方式存储信息。其中它的key值是唯一的,value值可以是字符串,整数,浮点数等类型。下面这行代码如果返回为空则表示第一次运行,然后更新该key(FIRSTRUNTIME),后续再次运行返回值就不为空,表示不是第一次运行。

UserDefault::getInstance()->getStringForKey("FIRSTRUNTIME")

calculateFileNumbers()函数

由于在加载文件的过程中需要计算加载进度,所有首先要统计需要加载文件的总数。才能根据此时加载文件数量和文件总数来计算加载的进度。

void LoadingScene::calculateFileNumbers()
{
#if MYDEBUG
	/* 文件总数 = 文本数 + 图片数 + 音乐数 + 动画数 */
	_allFileNumbers =
		openResourcesPath(_global->userInformation->getTextPath(), "resources/Text/TextPath.reanim.compiled", true) +
		openResourcesPath(_global->userInformation->getImagePath(), "resources/Text/ImagePath.reanim.compiled", true) +
		openResourcesPath(_global->userInformation->getMusicPath(), "resources/Text/MusicPath.reanim.compiled", true) +
		openResourcesPath(_global->userInformation->getAnimationPath(), "resources/Text/AnimationPath.reanim.compiled", true);
#else
	_allFileNumbers =
		openResourcesPath(_global->userInformation->getTextPath(), "resources/Text/TextPath.xml", false) +
		openResourcesPath(_global->userInformation->getImagePath(), "resources/Text/ImagePath.xml", false) +
		openResourcesPath(_global->userInformation->getMusicPath(), "resources/Text/MusicPath.xml", false) +
		openResourcesPath(_global->userInformation->getAnimationPath(), "resources/Text/AnimationPath.xml", false);
#endif
}

openResourcesPath函数用来统计文件数量,资源文件总共被分为四种,分别是文本、图片、音乐以及动画。


openResourcesPath()函数

该函数用于统计文件数量,函数有三个参数,第一个参数是用于保存文件信息,使用C++中的map存储,第二个参数表示存储资源文件目录的文件的地址,该文件存储了游戏中所用到的某一类资源文件的目录。第三个参数是表示打开参数二中的文件是否需要解密,如果参数二中的文件是加密的,则需要将该参数设置为true

int LoadingScene::openResourcesPath(map<string, string>& Path, const std::string& xml, bool IsEncryption)
{
	tinyxml2::XMLDocument* doc = new tinyxml2::XMLDocument();

	if (IsEncryption)
	{
		std::string textpath = _files->getStringFromFile(xml);
		char* passWords = (char*)malloc(sizeof(char) * textpath.size());

		OpenLevelData::getInstance()->decrypt(textpath, passWords);

		/* 打开资源路径 */
		doc->Parse(passWords);
	}
	else
	{
		/* 打开资源路径 */
		doc->Parse(_files->getStringFromFile(xml).c_str());
	}

	auto root = doc->RootElement();
	for (auto e = root->FirstChildElement(); e; e = e->NextSiblingElement())
	{
		for (auto at = e->FirstAttribute(); at; at = at->Next())
		{
			Path.insert(pair<string, string>(at->Name(), at->Value()));
		}
	}
	delete doc;
	return Path.size();
}

该函数首先打开参数二中的文件,如果加密则先解密,然后读取遍历读取该文件,并将信息保存到map中,然后返回文件数量。


setSystem()函数

该函数用于设置鼠标样式以及图标样式。

void LoadingScene::setSystem()
{
	/* 设置光标 */
	_director->getOpenGLView()->setCursor("resources/images/System/cursor.png", Point::ANCHOR_TOP_LEFT);

	/* 设置图标 */
	_director->getOpenGLView()->setIcon("resources/images/System/PlantsVsZombies.png");
}

loadUserData()函数

该函数用于加载用户存档信息,并根据信息初始化游戏。

游戏最多支持8个用户存档,遍历读取存档。然后初始化游戏设置,比如游戏帧率,是否拉升显示、是否垂直同步、是否隐藏鼠标等设置。这些设置都之前用户的个性化设置信息,加载游戏时自动读取恢复设置,无需用户再次手动设置。

void LoadingScene::loadUserData()
{
	auto userdefault = UserDefault::getInstance();

	/* 读取用户存档名称 */
	for (int i = 0; i < 8; i++)
	{
		if (!userdefault->getStringForKey(_global->userInformation->getUserCaveFileNameKey(i).c_str()).size())
		{
			_global->userInformation->setUserCaveFileName(i, "未命名存档");
		}
		else
		{
			_global->userInformation->setUserCaveFileName(i, userdefault->getStringForKey(_global->userInformation->getUserCaveFileNameKey(i).c_str()));
		}
	}

	_userData->createNewUserDataDocument();
	loadUserFileData();

	/* 用户名称 */
	_global->userInformation->setUserName(_global->userInformation->getUserCaveFileName(_global->userInformation->getUserCaveFileNumber()));
	_global->userInformation->setIsUpdate(true);

	/* 显示信息 */
	switch (userdefault->getBoolForKey("SHOWINFORMATION"))
	{
	case true:
		_director->setDisplayStats(true);
		_global->userInformation->setIsShowInformation(cocos2d::ui::CheckBox::EventType::SELECTED);
		break;
	case false:
		_director->setDisplayStats(false);
		_global->userInformation->setIsShowInformation(cocos2d::ui::CheckBox::EventType::UNSELECTED);
		break;
	}

	/* 是否高帧率 */
	switch (userdefault->getBoolForKey("SHOWHIGHFPS"))
	{
	case true:
		_director->setAnimationInterval(1.0f / UserInformation::getScreenDisplayFrequency());
		_global->userInformation->setIsSelectHighFPS(cocos2d::ui::CheckBox::EventType::SELECTED);
		break;
	case false:
		_director->setAnimationInterval(1.0f / 30);
		_global->userInformation->setIsSelectHighFPS(cocos2d::ui::CheckBox::EventType::UNSELECTED);
		break;
	}

	/* 是否全屏 */
	switch (userdefault->getBoolForKey("SHOWFULLSCREEN"))
	{
	case true:
		((GLViewImpl*)_director->getOpenGLView())->setFullscreen();
		_global->userInformation->setIsSelectFullScreen(cocos2d::ui::CheckBox::EventType::SELECTED);
		break;
	case false:
		((GLViewImpl*)_director->getOpenGLView())->setWindowed(1280, 720);
		_global->userInformation->setIsSelectFullScreen(cocos2d::ui::CheckBox::EventType::UNSELECTED);
		break;
	}

	/* 是否拉伸显示 */
	switch (userdefault->getBoolForKey("STRETCHINGSHOW"))
	{
	case true:
		_global->userInformation->setIsSelectStretchingShow(cocos2d::ui::CheckBox::EventType::SELECTED);
		_director->getOpenGLView()->setDesignResolutionSize(_director->getWinSize().width, _director->getWinSize().height, ResolutionPolicy::EXACT_FIT);
		break;
	case false:
		_global->userInformation->setIsSelectStretchingShow(cocos2d::ui::CheckBox::EventType::UNSELECTED);
		_director->getOpenGLView()->setDesignResolutionSize(_director->getWinSize().width, _director->getWinSize().height, ResolutionPolicy::SHOW_ALL);
		break;
	}

	/* 是否垂直同步 */
	switch (userdefault->getBoolForKey("VERTICALSYNCHRONIZATION"))
	{
	case true:
		wglSwapIntervalEXT(1);
		_global->userInformation->setIsVerticalSynchronization(CheckBox::EventType::SELECTED);
		break;
	case false:
		_global->userInformation->setIsVerticalSynchronization(CheckBox::EventType::UNSELECTED);
		wglSwapIntervalEXT(0);
		break;
	}

	/* 是否隐藏鼠标 */
	_global->userInformation->setIsSelectCursorNotHide(_userData->openBoolUserData("CURSORHIDE") ?
		cocos2d::ui::CheckBox::EventType::SELECTED : cocos2d::ui::CheckBox::EventType::UNSELECTED);

	/* 是否显示缓入动画 */
	_global->userInformation->setIsEaseAnimation(_userData->openBoolUserData("EASEANIMATION") ?
		cocos2d::ui::CheckBox::EventType::SELECTED : cocos2d::ui::CheckBox::EventType::UNSELECTED);

	if (!userdefault->getBoolForKey("UPDATE0619"))
	{
		changeFiles();
		userdefault->setBoolForKey("UPDATE0619", true);
	}
}

update()函数

设置定时器函数scheduleUpdate后,每一帧都会调用update函数。根据不同的加载进度来播放不同的加载动画。

void LoadingScene::update(float Time)
{
	if (_loadingPrecent <= 100)
	{
		_loadingBar->setPercent(_loadingPrecent);              /* 设置加载进度 */
		_sprite[5]->setScale(1 - _loadingPrecent / 170);       /* 设置精灵大小 */
		_sprite[5]->setRotation(9 * _loadingPrecent);          /* 设置精旋转度数 */
		_sprite[5]->setPosition(Vec2(10 + 290 / 100.0 * _loadingPrecent, 100 - _sprite[5]->getContentSize().height / 400 * _loadingPrecent));

		if (_loadingPrecent >= 20)  showLoadingBarFlower(0);
		if (_loadingPrecent >= 40)  showLoadingBarFlower(1);
		if (_loadingPrecent >= 60)  showLoadingBarFlower(2);
		if (_loadingPrecent >= 80)  showLoadingBarFlower(3);
		if (_loadingPrecent >= 100) showLoadingBarFlower(4);

	}
	if (_loadingPrecent >= 100) /* 如果加载完成 */
	{
		_label->setString(_global->userInformation->getGameText().find("点击开始")->second);  /* 重新设置标签文字内容 */
		auto action = TintBy::create(0.5f, 0, 255, 255);
		_label->runAction(RepeatForever::create(Sequence::create(action, action->reverse(), nullptr)));
		_sprite[5]->setVisible(false);  /* 设置精灵5为不可见 */
		_label->setEnabled(true);       /* 设置触摸可行 */
	}
}

loadingText()/loadingMusic()/loadingImage()/loadingAnimation()

循环遍历文件,逐个进行加载。Cocos2d-x中文件加载是异步加载方式,会创建新的线程进行文件加载,与渲染线程是同时进行的。如果不使用异步加载方式,在文件加载的过程中会导致游戏卡顿。

void LoadingScene::loadingText()
{
	/* 循环加载文本 */
	for (auto& i : _global->userInformation->getTextPath())
	{
		ValueVector Text = _files->getValueVectorFromFile(i.second);
		for (auto& file : Text)
		{
			auto file_map = file.asValueMap();
			_global->userInformation->getGameText().insert(pair<string, string>(file_map.at("id").asString(), file_map.at("info").asString()));
		}
		/* 加载回调 */
		this->loadingTextCallBack();
	}
}

void LoadingScene::loadingImage()
{
	/* 循环加载图片 */
	for (auto& i : _global->userInformation->getImagePath())
	{
		_director->getTextureCache()->addImageAsync(i.second + "pvr.ccz", [=](Texture2D* texture)
			{
				SpriteFrameCache::getInstance()->addSpriteFramesWithFile(i.second + "plist", texture);
				_loadFileNumbers++;     /* 文件数加一 */
				_loadingPrecent = ((_loadFileNumbers * 1.0f) / _allFileNumbers) * 100;  /* 计算加载的百分比 */
			});
	}
}

void LoadingScene::loadingMusic()
{
	/* 循环加载音乐 */
	for (auto& i : _global->userInformation->getMusicPath())
	{
		AudioEngine::preload(i.second, [=](bool isSucceed)
			{
				if (isSucceed)/* 如果加载成功 */
				{
					_loadFileNumbers++;     /* 文件数加一 */
					_loadingPrecent = ((_loadFileNumbers * 1.0f) / _allFileNumbers) * 100;  /* 计算加载的百分比 */
				}
			});
	}
}

void LoadingScene::loadingAnimation()
{
	/* 循环加载动画 */
	for (auto& i : _global->userInformation->getAnimationPath())
	{
		/* 临时存储文件名字 */
		char JsonName[128], AtlasName[128];

		/* 转换 */
		snprintf(JsonName, 128, "resources/Animations/compiled/%s.compiled", (i.second).c_str());
		snprintf(AtlasName, 128, "resources/Animations/reanim/%s.reanim", (i.second).c_str());

		/* 加载 */
		spSkeletonJson* json = spSkeletonJson_createWithLoader((spAttachmentLoader*)Cocos2dAttachmentLoader_create(spAtlas_createFromFile(AtlasName, nullptr)));
		auto skeletonData = spSkeletonJson_readSkeletonDataFile(json, JsonName);
		spSkeletonJson_dispose(json);

		/* 把加载到的动画放入map中*/
		_global->userInformation->getAnimationData().insert(pair<string, spSkeletonData*>(i.second, skeletonData));

		/* 进行回调 */
		this->loadingAnimationCallBack();
	}
}

void LoadingScene::loadingTextCallBack()
{
	_loadFileNumbers++;     /* 文件数加一 */
	_loadingPrecent = ((_loadFileNumbers * 1.0f) / _allFileNumbers) * 100;  /* 计算加载的百分比 */
}

void LoadingScene::loadingAnimationCallBack()
{
	_loadFileNumbers++;     /* 文件数加一 */
	_loadingPrecent = ((_loadFileNumbers * 1.0f) / _allFileNumbers) * 100;  /* 计算加载的百分比 */
}

其他函数

还有很多函数这里就不一一列举了,代码比较简单,可以自行调试理解。

三、后续

下一篇会详细讲解游戏关卡文件的结构组成以及游戏读取关卡信息的代码细节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mathorcup 甲骨文识别

本资源主要包含第2-4问&#xff0c;第一问直接使用传统图像处理即可&#xff0c;需要有很多步骤&#xff0c;这一步大家自己写就行。 2 第2问&#xff0c;甲骨文识别 2.1 先处理源文件 原文件有jpg和json文件&#xff0c;都在一个文件夹下&#xff0c;需要对json文件进行处理…

大数据存储解决方案和处理流程——解读大数据架构(四)

文章目录 前言数据存储解决方案数据集市运营数据存储&#xff08;Operational Data Store&#xff09;数据中心 数据处理数据虚拟化和数据联合虚拟化作为 ETL 或数据移动的替代品数据目录数据市场 前言 在数字时代&#xff0c;数据已成为公司的命脉。但是&#xff0c;仅仅拥有…

读《AI营销画布》品牌企业成长的逻辑(四)

前言 曾几何时&#xff0c;为了销售和品牌这两个扯的一世不可开交&#xff0c;也因为这个在企业里&#xff0c;形成了二个主张派&#xff0c;一派是以为销售为目标&#xff1b;一派是以品牌为目标。最后&#xff0c;&#xff0c;&#xff0c;&#xff0c;也就形成了不同的意见&…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

学习JavaEE的日子 Day38 网络编程

Day38 网络编程(了解即可) 1. 计算机网络 2. 网络编程 实现多台计算机之间实现数据的共享和传递&#xff0c;网络应用程序主要组成为&#xff1a;网络编程IO流多线程 3. 网络模型 两台计算机之间的通信是根据什么规则来走的(OSI & TCP/IP) 此处简单了解该模型就行《TCP/IP…

Windows瘦客户机系统默认英文?一招改成中文界面

前言 最近发现有很多小伙伴给电脑安装了Windows瘦客户机系统&#xff0c;但开机之后发现系统是英文的&#xff0c;看都看不懂。 今天就给小伙伴们带来更改Windows Thin系统语言的办法。 首先&#xff0c;咱们都知道&#xff0c;更改系统显示语言基本上都是在系统设置或者控制…

Java——类和对象

目录 一.类定义和使用 1.简单认识类 2.类的定义格式 3.注意事项 二.课堂练习 1.定义一个狗类 2.定义一个学生类 3.注意事项&#xff1a; 三.类的实例化 1.什么是实例化 2.注意事项 3.类和对象的说明 四.this引用 1.为什么要有this引用 2.什么是this引用 五.对…

第16章 数据管理组织与角色期望知识点梳理

第16章 数据管理组织与角色期望知识点梳理&#xff08;附带页码&#xff09; ◼ 数据管理和数据治理组织需要足够灵活&#xff0c;才能在不断发展的环境中有效地工作。意识、所有权和问责制度是激励和吸引人们参加数据管理积极性、政策和流程的关键。P432 ◼ 如何了解组织的企…

【Docker】docker原理及使用-1

Docker目录 1️⃣概念2️⃣使用容器的好处2️⃣docker和普通软件启动方式的区别2️⃣docker和传统虚拟机的区别 1️⃣下载安装2️⃣安装步骤 1️⃣必须要掌握的核心概念1️⃣命令2️⃣例子2️⃣练习题目2️⃣进入一下python环境(简洁) 1️⃣解释一下 redis1️⃣docker底层隔离机…

AI大模型探索之路-应用篇12:AI大模型应用之向量数据库选型

目录 前言 一、什么是向量数据库&#xff1f; 二、向量数据库的应用场景 1. 图像检索 2. 推荐系统 3. 自然语言处理 三、向量数据库在AI大模型中的应用 1. 训练数据的索引和检索 2. 特征存储和管理 3. 模型中间结果的存储 4. 长上下文的记录和检索 5. 本地知识库的构…

基于springboot实现购物推荐网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现购物推荐网站系统演示 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了东大每日推购物推荐网站的开发全过程。通过分析企业对于东大每日推购物推荐网站的需求&#xff0c;创建了一个计算机管…

Python求利率

要求 编写程序计算在给定利率、指定年数的情况下投资的未来值。这个计算公式如下。 使用文本域输入投资额、年份和利率。当用户单击“calculate”按钮时&#xff0c;在文本域中显示未来的投资值&#xff0c;如图所示。 代码实现 import tkinter as tkdef calculate():amou…

Spring Batch

Spring是一个开放源代码的J2EE应用程序框架&#xff0c;由Rod Johnson发起&#xff0c;是针对bean的生命周期进行管理的轻量级容器&#xff08;lightweight container&#xff09;。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题&#xff0c;提供了功能强大IOC、AOP及W…

使用Python爬虫代理IP快速增加博客阅读量

目录 前言 二、Python爬虫代理IP技术简介 1.什么是爬虫&#xff1f; 2.什么是代理IP&#xff1f; 3.为什么使用代理IP&#xff1f; 三、使用Python爬虫代理IP增加博客阅读量的步骤 1.获取代理IP地址 2.模拟多次访问 3.定时任务 四、注意事项 五、总结 前言 随着互联…

金融机构与金融市场监管

金融机构与金融市场监管 中国的金融监管机构银行业监管的必要性银行业监管的基本目标银行业监管的基本内容商业银行的设立审批制度银行业日常监督管理流动性要求资产质量监管合理的内部控制制度风险集中和风险暴漏的监管银行资本风险资本的计算资本充足率的计算 中国的金融监管…

Mobile Tools v2.0 + Example Game

重要提示!如果您已经拥有我们的资产之一,您可以升级到此资产,根据资产的不同,您将获得15%至40%的折扣。 主要功能 包含一个完整游戏,已集成所有功能(广告、成就、排行榜、应用内购买、评价游戏弹出窗口、本地化、每日奖励、交叉促销和通知)。 包括以下独立资产(170美元…

探索数据结构:顺序串与链式串的深入理解

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 串的定义 串是一种特殊的顺序表&#xff0c;即每一个元素都是单独一…

关于机器学习/深度学习的一些事-答知乎问(四)

如何评估和量化深度学习的可解释性问题&#xff1f; 针对深度学习模型&#xff0c;评估指标能够全面衡量模型是否满足可解释性。与分类的评估指标&#xff08;准确度、精确度和召回率&#xff09;一样&#xff0c;模型可解释性的评估指标应能从特定角度证明模型的性能。但是&a…

AI服务平台replicate

Replicate是一个提供优秀AI模型和工具的平台&#xff0c;旨在帮助用户实现各种人工智能任务。该平台汇集了来自各个领域的顶尖模型&#xff0c;涵盖了文本到图像生成、语言模型、图像编辑、超分辨率等多个领域。用户可以通过Replicate平台快速获取和应用先进的模型&#xff0c;…

基于Springboot的毕业生信息招聘平台

基于SpringbootVue的毕业生信息招聘平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 空中宣讲会 招聘岗位 求职信息 论坛信息 招聘咨询 …