Devc++ Easyx 实现 瓦片地图编辑数据导入游戏
导出的DLC 直接放入 exe 同文件夹下即可自动读取。
// 程序:DLC 自动读取加载框架示例
// 作者:民用级脑的研发记录
// 邮箱:1309602336@qq.com
// 编译环境:Devc++/VC 2010/Visual Studio 2022,EasyX_20220901/Easyx_2023 大暑版
// 编写日期:2024-2-22
//
#undef UNICODE
#undef _UNICODE
#pragma warning(disable : 4996) // VS2022 对某些函数警告,但是为了方便移植,就无视这些警告,这样 Devc++ VS2022 都能跑
#include <graphics.h>
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <direct.h>
// 初始化地图
int** initmap(int wide, int high);
// 从默认文件夹中读取自定义图片
void loadfile(char* DLC, IMAGE*** pentablev2);
// 加载自定义图片
void loadfile_scanf(char* dirname, char* next, char* kind, IMAGE** pentablev2);
// 导入游戏地图贴图数据
void loadgamemap(int** map, int* gamemapi, int* gamemapj, IMAGE* pentable, IMAGE*** pentablev2, int* pixnum, int* imagenum);
// 刷新网格缓冲区
inline void freshmesh(IMAGE* bkmesh, int** map, IMAGE* pentable, IMAGE*** pentablev2, int bkmeshmapi, int bkmeshmapj, int tilenum, int pixnum);
// 在屏幕上显示缓冲区
inline void showbkmesh(IMAGE* bkmesh, int bkmeshdeskx, int bkmeshdesky);
// 在纹理映射函数中产生的图片中截图,但此为演示参数作用,此处并未优化。
inline void freshbk(IMAGE* bk, IMAGE* bkmesh, int gamex, int gamey, int bkmeshmapi, int bkmeshmapj, int tilenum, int pixnum);
// 在屏幕显示截图
inline void showbk(IMAGE* bk, int bkdeskx, int bkdesky);
// 检查边界
inline void checkboundary(int* bkgameleft, int* bkgametop, int gamelimitright, int gamelimitbuttom, int* bkmeshgameleft, int* bkmeshgametop, int* meshlimitright, int* meshlimitbuttom, int move, int size);
// 实时渐变色小动画
inline void animation(int chararcterflag, int bkgameleft, int bkgametop, int bkmeshgameleft, int bkmeshgametop, int bkmeshdeskleft, int bkmeshdesktop);
int main()
{initgraph(1600, 800);setbkcolor(GREEN);cleardevice();IMAGE* bk; // 背景图片寄存区bk = new IMAGE(270, 270);IMAGE* bkmesh; // 背景图片采样区bkmesh = new IMAGE(270 * 3, 270 * 3);int** map; // 游戏大地图数组,记录着整个游戏背景的贴图信息,而在运行过程中,选取部分区域的数字,对照序号与贴图,实现游戏背景绘制。其余没有选中的区域就是压缩的空间。int pixnum; // 一个正方形瓦片的边长。单位:像素int bkgameleft; // 背景图片寄存区左上角坐标,是在游戏里的像素坐标。(0,0)可以理解为游戏大地图的左上角顶点。int bkgametop;int bkmeshgameleft; // 背景图片采样区左上角坐标,是在游戏里的像素坐标。int bkmeshgametop;int bkmeshmapi; // 背景图片采样区左上角所对应的 map 数组序号。从 map[0][0]开始,按照 map[i][j],其中 bkmeshmapi=bkmeshtop/pixnumint bkmeshmapj;int bkdeskleft; // 规定在屏幕上显示游戏背景寄存区,此处记录其左上角在屏幕上的像素坐标int bkdesktop;int bkmeshdeskleft; // 规定在屏幕上显示游戏背景采样区,此处记录其左上角在屏幕上的像素坐标int bkmeshdesktop;pixnum = 30; // 进行初始化,规定各位置具体数字bkdeskleft = 200; // 游戏背景左上角将会在屏幕的(200,200) 处bkdesktop = 200;bkgameleft = 0; // 由于 bkgame 控制 mesh 坐标移动,(0,0)则游戏背景完全在当前采样区移动bkgametop = 0;bkmeshdeskleft = 700; // 游戏背景缓冲区左上角将会在屏幕的(700,0)处bkmeshdesktop = 0;bkmeshgameleft = 0;bkmeshgametop = 0;int meshlimitright; // 使用变量暂存边界,不用每次来回计算边界int meshlimitbuttom;meshlimitright = 270; // 和寄存区一样大,把寄存区限制在一个九宫格中心,如果越出九宫格,九宫格整体平移meshlimitbuttom = 270;bkmeshmapi = bkmeshgametop / pixnum;bkmeshmapj = bkmeshgameleft / pixnum;int mapi; // 读取 DLC 文件,需要变量记录循环次数,单位 瓦片贴图个数int mapj;int safemapi; // 一个安全的贴图范围,避免阅读超过 10000 导致的越界闪退问题。int safemapj;int gamelimitright; // 用于减少比较时的计算,存储边界范围int gamelimitbuttom;safemapi = 70; // 注意导出的是左上角开始的 100*100 部分,如果绘制出界,保存不了,需要改这一行和下一行的数字safemapj = 70;gamelimitright = pixnum * safemapi;gamelimitbuttom = pixnum * safemapj;mapi = 300;mapj = 300;int imagenum; // 调色板数量上限,用于文件读取控制循环次数IMAGE* pentable; // 调色板其实就是贴图数组imagenum = 10;int pentablev2high; // 自定义贴图的容量大小int pentablev2wide;pentablev2high = 10;pentablev2wide = 4;IMAGE*** pentablev2;map = initmap(mapi, mapj);pentable = new IMAGE[imagenum];for (int i = 0; i < imagenum; i++){pentable[i] = IMAGE(30, 30);SetWorkingImage(&pentable[i]); // 给调色板绘制颜色setfillcolor(RGB(i * 20, i * 20, i * 20)); // 这里初始化调色盘的颜色fillrectangle(-1, -1, pixnum, pixnum); // 在调色板上绘制颜色(纹理)要从 -1,-1 开始绘制,把边框画到外部,不保留边框。}pentablev2 = new IMAGE * *[pentablev2wide];for (int i = 0; i < pentablev2wide; i++)pentablev2[i] = new IMAGE * [pentablev2high];for (int i = 0; i < pentablev2wide; i++)for (int j = 0; j < pentablev2high; j++)pentablev2[i][j] = NULL;loadgamemap(map, &safemapi, &safemapj, pentable, pentablev2, &pixnum, &imagenum); // 加载游戏freshmesh(bkmesh, map, pentable, pentablev2, bkmeshmapi, bkmeshmapj, 27, pixnum);showbkmesh(bkmesh, bkmeshdeskleft, bkmeshdesktop);freshbk(bk, bkmesh, bkgameleft, bkgametop, bkmeshmapi, bkmeshmapj, 9, pixnum);showbk(bk, bkdeskleft, bkdesktop);int moveflag; // 是否键盘控制移动int flag_x; // 记录位移int flag_y;int speed; // 键盘控制视口的移动速度speed = 5;flag_x = 0;flag_y = 0;moveflag = 0;int oldbkmeshgamex; // 判断是否需要刷新 bkmesh 网格int oldbkmeshgamey;oldbkmeshgamex = -1;oldbkmeshgamey = -1;int characterflag; // 用于按键时游戏小人的颜色变化characterflag = 5;ExMessage m;while (1){while (peekmessage(&m, EX_KEY | EX_MOUSE)){switch (m.message){case WM_KEYDOWN:switch (m.vkcode) // 键盘移动控制{case 0x41: // Aif (flag_x - speed > -10) // 限制范围,减少内存读写flag_x -= speed;characterflag = 1;break;case 0x57: // Wif (flag_y - speed > -10)flag_y -= speed;characterflag = 2;break;case 0x44: // Dif (flag_x + speed < 10)flag_x += speed;characterflag = 3;break;case 0x53: // Smoveflag = 1;if (flag_y + speed < 10)flag_y += speed;characterflag = 4;break;}break;case WM_KEYUP:switch (m.vkcode){case 0x41: // Aflag_x = 0;break;case 0x57: // Wflag_y = 0;break;case 0x44: // Dflag_x = 0;break;case 0x53: // Sflag_y = 0;break;}if (flag_x == 0 && flag_y == 0)characterflag = 5;break;}}if (flag_x != 0 || flag_y != 0){moveflag = 1;bkgameleft += flag_x;bkgametop += flag_y;}else{moveflag = 0;}if (moveflag == 1){checkboundary(&bkgameleft, &bkgametop, gamelimitright, gamelimitbuttom, &bkmeshgameleft, &bkmeshgametop, &meshlimitright, &meshlimitbuttom, 270, 540);bkmeshmapi = bkmeshgametop / pixnum;bkmeshmapj = bkmeshgameleft / pixnum;if (oldbkmeshgamex != bkmeshgameleft || oldbkmeshgamey != bkmeshgametop) // 判断是否更新采样区{freshmesh(bkmesh, map, pentable, pentablev2, bkmeshmapi, bkmeshmapj, 27, 30);oldbkmeshgamex = bkmeshgameleft;oldbkmeshgamey = bkmeshgametop;showbkmesh(bkmesh, bkmeshdeskleft, bkmeshdesktop);}freshbk(bk, bkmesh, bkgameleft, bkgametop, bkmeshmapi, bkmeshmapj, 9, 30);showbk(bk, bkdeskleft, bkdesktop);}animation(characterflag, bkgameleft, bkgametop, bkmeshgameleft, bkmeshgametop, bkmeshdeskleft, bkmeshdesktop); // 小方块动画Sleep(1);}return 0;
}
// 初始化游戏地图
int** initmap(int wide, int high)
{int** map = new int* [high]; // 二维数组动态初始化,先给二级指针挂上一个长度为 10 的指针数组for (int i = 0; i < high; i++){map[i] = new int[wide]; // 然后数组里的每个指针都挂上一个长度为 10 的 int 类型数组}for (int i = 0; i < high; i++){for (int j = 0; j < wide; j++){map[i][j] = -1; // 初始化游戏大地图 map 的参数,参数 1 默认黑色}}return map;
}
// 读取 DLC 继续开发
void loadgamemap(int** map, int* gamemapi, int* gamemapj, IMAGE* pentable, IMAGE*** pentablev2, int* pixnum, int* imagenum)
{FILE* fp;int i = 0;int j = 0;char dirpath[400] = { '\0' };char filepath[400] = { '\0' };for (i = 0; i < 100; i++){sprintf(dirpath, "DLC%d", i);if (access(dirpath, 0) == 0) // 检查 DLC 是否存在,存在为 0{break;}}if (i == 100) // 100 次查找失败,则返回,不再读取return;char filename[400] = "gamemap.txt";const char* next = "./";strcat(filepath, dirpath);strcat(filepath, next);strcat(filepath, filename);fp = fopen(filepath, "r"); // 读取 .txt 文件fscanf(fp, "注意此导出的游戏文件为按键 F1 后自动生成 修改汉语字符或者英文字符 或导致该 .txt 文件不可读取\n");fscanf(fp, "warning this saved gamefile is automatically create after F1 pressed change Chinesse character or English character lead to read failed");fscanf(fp, "pixnum %d\n", pixnum); // 正方形瓦片贴图边长信息:单位:像素fscanf(fp, "imagenum %d\n", imagenum); // 瓦片个数char imageindix[400] = { '\0' };char imagepath[400] = { '\0' };for (i = 0; i < *imagenum; i++){fscanf(fp, "%s\n", imageindix);strcpy(imagepath, dirpath);strcat(imagepath, next);strcat(imagepath, imageindix);loadimage(&pentable[i], imagepath, *pixnum, *pixnum, false); // 批量导入贴图}fscanf(fp, "gamemapi %d gamemapj %d\n", gamemapi, gamemapj);for (i = 0; i < *gamemapi; i++){fscanf(fp, "%d", &map[i][j]);for (j = 0; j < *gamemapj; j++){fscanf(fp, " %d", &map[i][j]);}fscanf(fp, "\n");}fclose(fp);printf("导入 map 部分正常\n");loadfile(dirpath, pentablev2);
}
// 从默认文件夹中读取自定义图片
void loadfile(char* DLC, IMAGE*** pentablev2)
{char brick[100] = "aa_birck_6_family";char ground[100] = "ab_ground_7_family";char change[100] = "ac_change_8_family";char trick[100] = "ad_trick_9_family";char next[100] = "./";char png[100] = "*.png";char dirpath[100] = {};strcpy(dirpath, DLC);strcat(dirpath, next);strcat(dirpath, brick);loadfile_scanf(dirpath, next, png, pentablev2[0]); // 加载用于当砖头类型的图片strcpy(dirpath, DLC);strcat(dirpath, next);strcat(dirpath, ground);loadfile_scanf(dirpath, next, png, pentablev2[1]);strcpy(dirpath, DLC);strcat(dirpath, next);strcat(dirpath, change);loadfile_scanf(dirpath, next, png, pentablev2[2]);strcpy(dirpath, DLC);strcat(dirpath, next);strcat(dirpath, trick);loadfile_scanf(dirpath, next, png, pentablev2[3]);
}
// 加载自定义图片
void loadfile_scanf(char* dirname, char* next, char* kind, IMAGE** pentablev2)
{// 文件存储信息结构体struct _finddata_t fileinfo;// 保存文件句柄long fHandle;// 文件数记录器char dirpath[100];strcpy(dirpath, dirname);if (access(dirpath, 0) == -1) // 检查文件夹是否存在,不存在为 -1{return;}else{int i = -1; // 记录文件数量char kindpath[100];strcpy(kindpath, dirpath);strcat(kindpath, next);strcat(kindpath, kind);if ((fHandle = _findfirst(kindpath, &fileinfo)) == -1L) // *是通配符,默认在当前文件夹内查找文件,这里查找 .png 文件{printf("当前目录: %s 下没有所需文件\n", dirname);return;}else{char path[100];do{i++;printf("在%s 下找到文件:%s,文件大小:%d bit\n", dirname, fileinfo.name, fileinfo.size);strcpy(path, dirname);strcat(path, next);strcat(path, fileinfo.name);while (pentablev2[i] != NULL){i++;}pentablev2[i] = new IMAGE(30, 30);loadimage(pentablev2[i], path, 30, 30); // 根据名称读取文件} while (_findnext(fHandle, &fileinfo) == 0);}// 关闭文件_findclose(fHandle);printf("文件数量:%d\n", i + 1);}
}
// 使用关键字 inline 声明为内联函数,减少贴图函数频繁调用的开销导致的卡顿。
// 缓冲区纹理映射函数:bkmesh 映射目标,map 映射总网格,pentable:纹理集,bkmeshmapi,bkmeshmapj:映射起始点,tilenum:横,纵映射的数量,pixnum:一个映射块的边长,单位:像素。
inline void freshmesh(IMAGE* bkmesh, int** map, IMAGE* pentable, IMAGE*** pentablev2, int bkmeshmapi, int bkmeshmapj, int tilenum, int pixnum)
{int kind = 0; // 存储代号第一位:类型int number = 0; // 存储代号第二位:序列号int pennumber = -1; // 暂存每一次循环的映射代号IMAGE* pen = NULL; // 所找到的纹理int left = 0; // 这是每次循环所找到的纹理对应映射地址int top = 0;SetWorkingImage(bkmesh); // 设置绘图目标为游戏背景采样区,刷新采样区,刷新寄存区setbkcolor(RGB(200, 200, 200));cleardevice();for (int i = bkmeshmapi; i < bkmeshmapi + tilenum; i++){left = 0;for (int j = bkmeshmapj; j < bkmeshmapj + tilenum; j++){pennumber = map[i][j]; // 读取游戏大地图数组序号if (pennumber == -1){rectangle(left, top, left + pixnum, top + pixnum);}else{kind = pennumber / 10 - 6; // 剥离第一位number = pennumber % 10; // 剥离最后一位if (pennumber < 10)pen = &pentable[pennumber];elsepen = pentablev2[kind][number]; // 根据序号查找对应贴图putimage(left, top, pen); // 把贴图画到采样区}left += pixnum; // 往右移动,准备下一次绘制位置,此处贴图就会覆盖白色边框。为保证坐标变换和网格对应,算上网格宽度,也在贴图矩形内}top += pixnum; // 往下移动,准备下一次绘制位置,此处就会覆盖白色边框,方便定位}SetWorkingImage();
}// 在纹理映射函数中产生的图片中截图,但此为演示参数作用,此处并未优化。
inline void freshbk(IMAGE* bk, IMAGE* bkmesh, int gamex, int gamey, int bkmeshmapi, int bkmeshmapj, int tilenum, int pixnum)
{SetWorkingImage(bkmesh);getimage(bk, gamex - bkmeshmapj * pixnum, gamey - bkmeshmapi * pixnum, tilenum * pixnum, tilenum * pixnum);SetWorkingImage();
}
// 在屏幕显示截图
inline void showbk(IMAGE* bk, int bkdeskx, int bkdesky)
{SetWorkingImage();putimage(bkdeskx, bkdesky, bk);
}
// 在屏幕上显示缓冲区
inline void showbkmesh(IMAGE* bkmesh, int bkmeshdeskx, int bkmeshdesky)
{SetWorkingImage();putimage(bkmeshdeskx, bkmeshdesky, bkmesh);
}
// 检查边界
inline void checkboundary(int* bkgameleft, int* bkgametop, int gamelimitright, int gamelimitbuttom, int* bkmeshgameleft, int* bkmeshgametop, int* meshlimitright, int* meshlimitbuttom, int move, int size)
{if (*bkgameleft < 0) // 网格越界检测并调整*bkgameleft = 0;else if (*bkgameleft > gamelimitright)*bkgameleft = gamelimitright;if (*bkgametop < 0)*bkgametop = 0;else if (*bkgametop > gamelimitbuttom)*bkgametop = gamelimitbuttom;if (*bkgameleft < *bkmeshgameleft) // 更新游戏采样区坐标,一些简单换算,由于频繁调用函数在这里产生了明显的卡顿影响,所以这里就不再封装成函数{*bkmeshgameleft -= move;*meshlimitright = *bkmeshgameleft + size;}else if (*bkgameleft > *meshlimitright){*meshlimitright += move;*bkmeshgameleft = *meshlimitright - size;}if (*bkgametop < *bkmeshgametop){*bkmeshgametop -= move;*meshlimitbuttom = *bkmeshgametop + size;}else if (*bkgametop > *meshlimitbuttom){*meshlimitbuttom += move;*bkmeshgametop = *meshlimitbuttom - size;}
}
// 实时渐变小动画
inline void animation(int characterflag, int bkgameleft, int bkgametop, int bkmeshgameleft, int bkmeshgametop, int bkmeshdeskleft, int bkmeshdesktop)
{static int i = 1;static int x = 10;static int y = 10;if (i % 3 == 0){x = bkmeshdeskleft + bkgameleft - bkmeshgameleft;y = bkmeshdesktop + bkgametop - bkmeshgametop;i %= 125; // i 的上限 * 放大倍数 不超过 255switch (characterflag) // 选取颜色{case 1:setfillcolor(RGB(i * 2, i * 2, 0));break;case 2:setfillcolor(RGB(i * 2, 0, i * 2));break;case 3:setfillcolor(RGB(i * 2, 0, 0));break;case 4:setfillcolor(RGB(0, i * 2, 0));break;case 5: // 如果没有按键,则使用默认颜色setfillcolor(RGB(0, 0, i * 2));break;}fillrectangle(x, y, x + 30, y + 30);}i++;
}
相关文章:

Devc++ Easyx 实现 瓦片地图编辑数据导入游戏
导出的DLC 直接放入 exe 同文件夹下即可自动读取。 // 程序:DLC 自动读取加载框架示例 // 作者:民用级脑的研发记录 // 邮箱:1309602336qq.com // 编译环境:Devc/VC 2010/Visual Studio 2022,EasyX_20220901/Easyx_202…...

去年面试的运维开发面试题二
VPN有哪些协议,不同协议之间有何区别? 2.内部组网通常使用哪些类型的网段,两个不同网段如何通信? 3.Linux中绝对路径,相对路径的区别 4. Linux如何添加磁盘,扩容系统文件? 5. Linux如何查看进程…...

【Unity编辑器扩展】Unity编辑器主题颜色设置工具
可以用来应用和自定义你的Unity编辑器。14个主题可供选择。轻松创建自己的主题。 主题展示:...

精美的WordPress外贸独立站模板
WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题,适合时尚服装行业搭建wordpress企业官网使用。 https://www.jianzhanpress.com/?p4999 简洁wordpress独立站模板 绿色精美、简洁大气的wordpress外贸独立网站模板 https://www.jianzhanpress.com/?…...

说一下 JVM 运行时数据区 ?
目录 一、程序计数器(Program Counter Register) 二、Java 虚拟机栈(Java Virtual Machine Stacks) 三、本地方法栈(Native Method Stack) 四、Java 堆(Java Heap) 五、方法区&…...

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——02.数据格式整理(1)
内容如下: 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的…...

Python 内存管理和优化之循环引用
更多Python学习内容:ipengtao.com Python 是一种高级动态编程语言,其内存管理由解释器自动完成。在大多数情况下,Python 的内存管理是透明的,开发者不需要过多地关注。然而,在处理大型数据结构或长时间运行的应用程序时…...

「Kafka」监控、集成篇
Kafka-Eagle 监控 Kafka-Eagle 框架可以监控 Kafka 集群的整体运行情况,在生产环境中经常使用。 MySQL环境准备 Kafka-Eagle 的安装依赖于 MySQL,MySQL 主要用来存储可视化展示的数据。 安装步骤参考:P61 尚硅谷 kafka监控_MySQL环境准备 …...

Linux之用户和用户组用户账号系统文件
一、简介 1.用户的定义 在linux系统中用户(User)需要用用户账号来访问系统,服务和信息,系统中的每个进程(运行的程序)都是使用一个特定的用户运行。每个文件都属于一个特定的用户所有。对文件和目录的访…...

ESP8266 (5),驱动屏幕
代码 第一步设置驱动库TFT_eSPI的默认配置文件 1,设置适配的屏幕 #define ST7789_DRIVER 2,设置屏幕大小 #define TFT_WIDTH 170 #define TFT_HEIGHT 320 3,设置屏幕驱动板端口和ESP8266对应的端口 // For NodeMCU - use pin numbers in the…...

ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识
1. 指令位置 Github仓库:Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本,并且打开代码解释器 2 使用 学习内容 开始学习 GPT甚至可以给你思考题,给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 …...

android studio模拟器不能打开
Andriod:The selected AVD is currently running in the Emulator. Please exit the emulator instance… 1.点击 2.删除下面文件 3.重新打开即可 参考...

设计模式学习笔记 - 面向对象 - 5.接口和抽象类的区别
简述 在面向对象编程中,抽象类和接口是常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则实现的基础。它们之间的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存…...

PolarDN MISC做题笔记
cat flag 使用01打开flag.png,发现图片尾部有padding的数据。D0 CF 11 E0 A1 B1 1A E1为office2007以前版本的文件头。将其另存为flag.doc,打开发现提示需要密码。(可以注意到:D0CF11E0非常类似DOCFILE) 使用john的office2john.py 提取hash …...

Web安全之浅见
备注:这是我在2017年在自己的网站上写的文章,今天迁移过来。 昨天去参加了公司组织的一个关于网络安全的培训,了解了很多关于网络安全方面的知识,也才意识到网络安全是一项极其重要的领域。 本篇文章主要聊聊Web安全。不过我对于网…...

企业安全建设工具推荐
全自动化挖洞,助力企业安全建设,一键实现域名扫描、IP 发现、端口扫描、服务识别、网站识别、漏洞探测、分析发现、合规检查。 使用方式: 录入目标企业名称即可开始使用 技术细节: 第一步:通过企业主体关联企业备案…...

力扣(leetcode)第455题分发饼干(Python)
455.分发饼干 题目链接:455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i…...

隐私也要付费?Meta公司为收集用户数据再出“奇招”
Cybernews网站消息,有相关人士表示,如果欧洲数据保护委员会(EDPB)不明确指出Meta公司的“付费或同意”的模式违反了欧盟的隐私法规,那么这一模式很可能会被大规模复制,危及数百万欧洲公民的自由选择权。 自…...

Android14 InputManager-InputReader的处理
IMS启动时会调用InputReader.start()方法 InputReader.cpp status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });…...

web前端安全性——JSONP劫持
1、JSONP概念 JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,协议IP端口有任意不同都会导致请求跨域,而HTML的script元素是一个例外。利用script元素的这个开放策略࿰…...

从零开始学HCIA之广域网技术03
1、LCP中包含的报文类型 (1)Configure-Request(配置请求),链路层协商过程中发送的第一个报文,该报文表明点对点双方开始进行链路层参数的协商。 (2) Configure-Ack(配置…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.01.01-2024.01.10
1.Pre-trained Large Language Models for Financial Sentiment Analysis 标题:用于金融情感分析的预训练大型语言模型 author:Wei Luo, Dihong Gong date Time:2024-01-10 paper pdf:http://arxiv.org/pdf/2401.05215v1 摘要: 金融情感分析是指将金融文本内容划分…...

Redis降低内存占用(二)分片结构
一、分区方法: 分片,也称为分区。Redis提供了多种分区实现方案: 1、哈希分区 2、区间分区 3、一致性哈希分区 4、虚拟分区 5、LUA脚本实现分片 二、...

vue大文件读取部分内容,避免重复加载大文件,造成流量浪费
使用场景:项目点云地图是pcd文件,但是文件可能上百兆,我需要获取到文件中的版本信息,跟本地的缓存文件做比较,如果不一致,才会加载整个文件。从而节省流量。 避免重复加载整个“.pcd文件,以最大…...

5G网络RedCap
RedCap:RedCap(Reduced Capability),即“降低能力”。它是3GPP在5G R17阶段,针对速率、时延要求不高的5G应用场景,专门推出的一种新技术标准协议,旨在全面提升5G网络质量和覆盖率,也…...

vue+springboot登录与注册功能的实现
①首先写一个登录页面 <template> <div style"background-color: #42b983;display: flex;align-items: center;justify-content: center;height: 100vh"><div style"background-color: white;display: flex;width: 50%;height: 50%;overflow: h…...

数据结构D3作业
1. 2. 按位插入 void insert_pos(seq_p L,datatype num,int pos) { if(LNULL) { printf("入参为空,请检查\n"); return; } if(seq_full(L)1) { printf("表已满,不能插入\n"); …...

Spring框架@Autowired注解进行字段时,使用父类类型接收子类变量,可以注入成功吗?(@Autowired源码跟踪)
一、 前言 平常我们在使用spring框架开发项目过程中,会使用Autowired注解进行属性依赖注入,一般我们都是声明接口类型来接收接口实现变量,那么使用父类类型接收子类变量,可以注入成功吗?答案是肯定可以的!…...

【springblade】springblade(bladeX) 数据权限失效原因分析
文章目录 数据权限接口权限 前言:最近博主在按照bladeX官方文档 配置数据权限 结果发现失效了,网上搜了一下没找到合适的答案,本着求人不如求己的精神,自己调试了一下发现了问题所在,也大致看了一下bladeX的权限逻辑。…...

单例模式的几种实现方式
在Java中,实现单例模式主要有几种方式:懒汉式、饿汉式、双重检查锁定、静态内部类和枚举。每种方式都有其特点和适用场景。 1. 饿汉式(线程安全) 饿汉式是最简单的一种实现方式,通过静态初始化实例,保证了…...