easyx devc++ 开发具有导出文件夹DLC的瓦片地图编辑器

 1. F1保存为 DLC 输出为当前文件目录下。

2. 瓦片的边框利用绘制到 -1 -1 把边框绘制到外部

3. 利用 +1 实现网格保留

#include <graphics.h>
#include <stdio.h>
#include <string.h>
#include <io.h>
// 保存游戏地图贴图数据
void savegamemap(int** map,int gamemapi,int gamemapj,IMAGE* pentable,int pixnum);
// 使用关键字 inline 声明为内联函数,减少贴图函数频繁调用的开销导致的卡顿。
// 缓冲区纹理映射函数:bkmesh 映射目标,map 映射总网格,pentable:纹理集,bkmeshmapi,bkmeshmapj:映射起始点,tilenum:横,纵映射的数量,pixnum:一个映射块的边长,单位:像素。
inline void freshmesh(IMAGE* bkmesh, int** map, IMAGE* pentable, int bkmeshmapi, int bkmeshmapj, int tilenum, int pixnum)
{int pennumber = 0;										// 暂存每一次循环的映射代号IMAGE pen = NULL;										// 所找到的纹理int left = 0;											// 这是每次循环所找到的纹理对应映射地址int top = 0;SetWorkingImage(bkmesh);								// 设置绘图目标为游戏背景采样区,刷新采样区,刷新寄存区for (int i = bkmeshmapi; i < bkmeshmapi + tilenum; i++){left = 0;for (int j = bkmeshmapj; j < bkmeshmapj + tilenum; j++){pennumber = map[i][j];							// 读取游戏大地图数组序号pen = pentable[pennumber];						// 根据序号查找对应贴图putimage(left, top, &pen);						// 把贴图画到采样区left += pixnum+1;									// 往右移动,准备下一次绘制位置,+1 留出白色背景 }top += pixnum+1;										// 往下移动,准备下一次绘制位置,+1 留出白色背景 }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);
}
// 初始化游戏地图
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 的参数,参数范围 3}}return map;
}
int main()
{initgraph(1640, 980, 1);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;bkgametop = 0;bkmeshdeskleft = 700;							// 游戏背景缓冲区左上角将会在屏幕的(700,0)处bkmeshdesktop = 0;bkmeshgameleft = 0;bkmeshgametop = 0;bkmeshmapi = bkmeshgametop / pixnum;bkmeshmapj = bkmeshgameleft / pixnum;map=initmap(1000,1000);							// 初始化一个有1000*1000个贴图的地图int pentableleft;								// 忘了初始化调色盘了,这里设置调色盘左上角在屏幕的坐标int pentabletop;IMAGE* pentable;								// 调色板其实就是贴图数组pentableleft = 0;								// 调色盘左上角将会在屏幕的(0,0)处pentabletop = 0;pentable = new IMAGE[10];for (int i = 0; i < 10; i++){pentable[i] = IMAGE(30, 30);SetWorkingImage(&pentable[i]);					// 给调色板绘制颜色setfillcolor(RGB(i * 20, i * 20, i * 20));		// 这里初始化调色盘的颜色fillrectangle(-1, -1, pixnum, pixnum);			// 在调色板上绘制颜色(纹理) 要从 -1,-1 开始绘制,把边框画到外部,不保留边框。 }int left;												// 初始化绘制采样区所需的坐标,相对于采样区,(0,0)就是采样区左上角顶点坐标int top;left = 0;top = 0;//	往缓冲区刷入贴图SetWorkingImage(bkmesh);								// 设置绘图目标为游戏背景采样区,刷新采样区,刷新寄存区setbkcolor(RGB(200,200,200));cleardevice(); for (int i = bkmeshmapi; i < bkmeshmapi + 30; i++){left = 0;for (int j = bkmeshmapj; j < bkmeshmapj + 30; j++){int pennumber = map[i][j];						// 读取游戏大地图数组序号IMAGE pen = pentable[pennumber];				// 根据序号查找对应贴图putimage(left, top, &pen);						// 把贴图画到采样区left += pixnum+1;								// 往右移动,准备下一次绘制位置, 此处 +1 是增加白色边框,方便定位 }top += pixnum+1;									// 往下移动,准备下一次绘制位置,此处 +1 是增加白色边框,方便定位 }getimage(bk, bkgameleft, bkgametop, 270, 270);			// 从刚刚绘制好的采样区取样,刷新游戏背景寄存区。//	开始往屏幕上绘图SetWorkingImage();															// 设置电脑屏幕为绘制对象for (int j = 0; j < 10; j++){putimage(pentableleft + 10, pentabletop + j * 30, &pentable[j]); 		// 绘制绘图板}putimage(bkdeskleft, bkdesktop, bk);										// 绘制游戏背景putimage(bkmeshdeskleft, bkmeshdesktop, bkmesh); 							// 显示游戏背景缓冲区// 此时绘制完成,以上 刷贴图,采样,粘贴就是实现 RPG 游戏大地图的压缩//	开始检测鼠标键盘功能int drawflag;															// 设置长按 flagint drawoldmx;															// 记录上一次绘制时的鼠标坐标,用于检测是否重复点击相同像素,来减少重复绘制int drawoldmy;int drawx;																// 画笔在游戏里的位置,单位像素int drawy;int olddrawi;															// 记录上一次绘制的瓦片,判断是否需要重新绘制int olddrawj;int drawsmallflag;														// 在 drawflag=1 时,检测是否刷新drawsmallflag=0;olddrawi=0;olddrawj=0;drawx = 0;drawy = 0;drawflag = 0;drawoldmx = 0;drawoldmy = 0;int pentake;															// 设置不绘制时贴图代号为 -1pentake = 0;															// 默认黑色笔刷int draftoldmx;															// 记录刚刚拖拽时的鼠标的位置,用于坐标变换计算位移int draftoldmy;int draftoldgamex;														// 记录刚刚拖拽时的游戏地图位置,用于坐标变换计算新的游戏坐标int draftoldgamey;int draftflag;															// 设置拖拽 flagdraftoldmx = 0;draftoldmy = 0;draftoldgamex = 0;draftoldgamey = 0;draftflag = 0;int moveflag;															// 是否键盘控制移动int flag_x;																// 记录位移int flag_y;int speed;																// 键盘控制视口的移动速度speed=5;flag_x=0;flag_y=0;moveflag=0;int mousex;																// 记录鼠标位置int mousey;mousex=0;mousey=0;int oldbkmeshgamex;														// 判断拖拽时是否需要刷新 bkmesh 网格int oldbkmeshgamey;ExMessage m;while (1){while (peekmessage(&m, EX_KEY | EX_MOUSE))		// 一次性处理完鼠标消息,参考自 https://codebus.cn/zhaoh/handle-mouse-messages-correctly{switch (m.message){case WM_LBUTTONDOWN:																				// 鼠标左键按下,有两种情况,一是选择贴图,另外就是绘制贴图if (drawflag==0&&m.x > bkdeskleft && m.y > bkdesktop && m.x < bkdeskleft + 300 && m.y < bkdesktop + 300)		// 如果之前不是长按状态	且按下左键时,鼠标在游戏背景区域内{drawflag = 1;																				// 才记录为正在绘制的状态mousex=m.x;mousey=m.y;}else if (drawflag==0&&draftflag==0&&m.x > 0 && m.y > 0 && m.x < 30 && m.y < 300)pentake = m.y / 30; 																		// 选择贴图对应的代号break;case WM_LBUTTONUP:drawflag = 0;drawsmallflag=0;olddrawi=0;olddrawj=0;break;case WM_RBUTTONDOWN:																				// 鼠标右键拖动if (draftflag==0&&m.x > bkdeskleft && m.y > bkdesktop && m.x < bkdeskleft + 270 && m.y < bkdesktop + 270){draftflag = 1;draftoldmx = m.x;																			// 记录鼠标坐标draftoldmy = m.y;mousex=m.x;mousey=m.y;draftoldgamex = bkgameleft;																	// 记录游戏背景寄存区左上角坐标draftoldgamey = bkgametop;}break;case WM_RBUTTONUP:draftflag = 0;bkgameleft = draftoldgamex - (m.x - draftoldmx);												// bkgameleft - draftoldgamex =- (m.x - draftoldmx)bkgametop = draftoldgamey - (m.y - draftoldmy);													// bkgametop - draftoldgamey =- (m.y - draftoldmy)break;case WM_KEYDOWN:switch (m.vkcode)					// 键盘移动控制{case 0x41:						// Aflag_x-=speed;moveflag=1;break;case 0x57:						// Wflag_y-=speed;break;case 0x44:						// Dflag_x+=speed;break;case 0x53:						// Sflag_y+=speed;break;case VK_F1:savegamemap(map,300,300,pentable,pixnum);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;}break;case WM_MOUSEMOVE:if(mousex!=m.x||mousey!=m.y){mousex=m.x;mousey=m.y;}break;}}
//		开始根据指令运行坐标变化if (draftflag == 1){bkgameleft = draftoldgamex - (mousex - draftoldmx);											// bkgameleft-draftoldgamex=-(mousex-draftoldmx)bkgametop = draftoldgamey - (mousey - draftoldmy);											// bkgametop-draftoldgamey=-(mousey - draftoldmy)}else if (drawflag == 1&&flag_x==0&&flag_y==0 &&(drawoldmx!=mousex||drawoldmy!=mousey)&& mousex > bkdeskleft && mousey > bkdesktop && mousex < bkdeskleft + 300 && mousey < bkdesktop + 300){// 注意不要越界,否则 gamex 为负数,导致数组越界闪退。// 通过实现坐标变换与赋值达到修改游戏大地图(数组)moveflag=0;drawoldmx = mousex;drawoldmy = mousey;drawx = bkgameleft + (mousex - bkdeskleft);										// drawx-bkgameleft=mousex-bkdeskleft	横坐标方向移动距离相同drawy = bkgametop + (mousey - bkdesktop);										// drawy-bkgametop=mousey-bkdesktop	纵坐标方向移动距离相同if(olddrawi!=drawy/pixnum||olddrawj!=drawx/pixnum){drawsmallflag=1;olddrawi=drawy / pixnum;olddrawj=drawx / pixnum;map[olddrawi][olddrawj] = pentake;											// 注意 map[y][x],而不是 map[x][y],因为判断第几行,是通过 y 来控制上下移动的,判断第几列,是通过 x 左右移动的。}else{drawsmallflag=0;															// 检测到是上一次绘制的瓦片,则不再刷新贴图与缓冲区。}}	//	对绘制进行分类计算数据,剥离特殊情况的重复绘制,仅仅是 flag_x,或者flag_y不为零时取消重复绘制判断。else if(drawflag == 1 && mousex > bkdeskleft && mousey > bkdesktop && mousex < bkdeskleft + 300 && mousey < bkdesktop + 300){moveflag=1;while(flag_x<-10)																// 限制在合适速度范围flag_x+=10;while(flag_x>10)flag_x-=10;while(flag_y<-10)flag_y+=10;while(flag_y>10)flag_y-=10;bkgameleft+=flag_x;																// 更新游戏背景寄存区左上角坐标bkgametop+=flag_y;drawx = bkgameleft + (mousex - bkdeskleft);										// drawx-bkgameleft=m.x-bkdeskleft	横坐标方向移动距离相同drawy = bkgametop + (mousey - bkdesktop);										// drawy-bkgametop=m.y-bkdesktop	纵坐标方向移动距离相同if(olddrawi!=drawy/pixnum||olddrawj!=drawx/pixnum){drawsmallflag=1;olddrawi=drawy / pixnum;olddrawj=drawx / pixnum;map[olddrawi][olddrawj] = pentake;											// 注意 map[y][x],而不是 map[x][y],因为判断第几行,是通过 y 来控制上下移动的,判断第几列,是通过 x 左右移动的。}else{drawsmallflag=0;															// 检测到是上一次绘制的瓦片,则不再刷新贴图与缓冲区。}}else if(drawflag==0&&flag_x!=0||flag_y!=0){moveflag=1;while(flag_x<-10)																// 限制在合适速度范围flag_x+=10;while(flag_x>10)flag_x-=10;while(flag_y<-10)flag_y+=10;while(flag_y>10)flag_y-=10;bkgameleft+=flag_x;bkgametop+=flag_y;}else{// 既不绘制也不移动也不拖拽}// 根据计算出的坐标数据进行绘制,分多种情况分别绘制,减少函数重复调用与无效调用if(drawsmallflag==1&&moveflag==0){freshmesh(bkmesh, map, pentable, bkmeshmapi, bkmeshmapj, 27, 30);			// 刷新,重新映射,其实就是开头初始化的代码,这里是给了一个封装示例,但未进行性能优化freshbk(bk, bkmesh, bkgameleft, bkgametop, bkmeshmapi, bkmeshmapj, 9, 30);showbk(bk, bkdeskleft, bkdesktop);showbkmesh(bkmesh, bkmeshdeskleft, bkmeshdesktop);}else if(moveflag==1&&drawsmallflag==1){if(bkgameleft<0)															// 网格越界检测并调整bkgameleft=0;if(bkgametop<0)bkgametop=0;if(bkgameleft>30*300)bkgameleft=30*300;if(bkgametop>30*300)bkgametop=30*300;while (bkgameleft < bkmeshgameleft)											// 更新游戏采样区坐标,一些简单换算bkmeshgameleft -=270;while (bkgametop <bkmeshgametop )bkmeshgametop -= 270;while(bkgameleft>bkmeshgameleft+270+270)bkmeshgameleft += 270;while(bkgametop>bkmeshgametop+270+270)bkmeshgametop += 270;bkmeshmapi = bkmeshgametop / pixnum;bkmeshmapj = bkmeshgameleft / pixnum;freshmesh(bkmesh, map, pentable, bkmeshmapi, bkmeshmapj, 27, 30);freshbk(bk, bkmesh, bkgameleft, bkgametop, bkmeshmapi, bkmeshmapj, 9, 30);showbkmesh(bkmesh, bkmeshdeskleft, bkmeshdesktop);showbk(bk, bkdeskleft, bkdesktop);}else if(moveflag==1)															// 分类渲染, drawflag==0 时,再选择性刷新缓冲区{if(bkgameleft<0)															// 网格越界检测并调整bkgameleft=0;if(bkgametop<0)bkgametop=0;if(bkgameleft>30*300)bkgameleft=30*300;if(bkgametop>30*300)bkgametop=30*300;while (bkgameleft < bkmeshgameleft)											// 更新游戏采样区坐标,一些简单换算,由于频繁调用函数在这里产生了明显的卡顿影响,所以这里就不再封装成函数bkmeshgameleft -=270;while (bkgametop <bkmeshgametop )bkmeshgametop -= 270;while(bkgameleft>bkmeshgameleft+270+270)bkmeshgameleft += 270;while(bkgametop>bkmeshgametop+270+270)bkmeshgametop += 270;bkmeshmapi = bkmeshgametop / pixnum;bkmeshmapj = bkmeshgameleft / pixnum;if(oldbkmeshgamex!=bkmeshgameleft||oldbkmeshgamey!=bkmeshgametop)			// 判断是否更新采样区{freshmesh(bkmesh, map, pentable, 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);}else if(draftflag)																// 分类渲染-只拖拽{if(bkgameleft<0)															// 网格越界检测并调整bkgameleft=0;if(bkgametop<0)bkgametop=0;if(bkgameleft>30*300)bkgameleft=30*300;if(bkgametop>30*300)bkgametop=30*300;while (bkgameleft < bkmeshgameleft)											// 更新游戏采样区坐标,一些简单换算bkmeshgameleft -=270;while (bkgametop <bkmeshgametop )bkmeshgametop -= 270;while(bkgameleft>bkmeshgameleft+270+270)bkmeshgameleft += 270;while(bkgametop>bkmeshgametop+270+270)bkmeshgametop += 270;bkmeshmapi = bkmeshgametop / pixnum;bkmeshmapj = bkmeshgameleft / pixnum;if(oldbkmeshgamex!=bkmeshgameleft||oldbkmeshgamey!=bkmeshgametop)			// 判断是否更新采样区{freshmesh(bkmesh, map, pentable, 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);}Sleep(20);																		// 休眠 20 毫秒,减少 CPU 占用}return 0;
}
// 边绘制边移动:最大:边界 2.30GHz 3%占用,内部 2.25Ghz。仅绘制:1.8GHz, 拖拽:0.99GHz,旧瓦片绘制检测,又减少重复绘制,显著平稳,峰值降低
void savegamemap(int** map,int gamemapi,int gamemapj,IMAGE* pentable,int pixnum)
{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)==-1){										// 检查 DLC 是否存在,不存在为 -1 break;}}mkdir(dirpath);														// 创建文件夹 char filename[400]="gamemap.txt";const char* next="./";strcat(filepath,dirpath);strcat(filepath,next);strcat(filepath,filename);fp=fopen(filepath,"w+");											// 创建 .txt 文件 fprintf(fp,"注意此导出的游戏文件为按键 F1 后自动生成 修改汉语字符或者英文字符 或导致该 .txt 文件不可读取\n");fprintf(fp,"warning this saved gamefile is automatically create after F1 pressed change Chinesse character or English character lead to read failed");fprintf(fp,"pixnum %d\n",pixnum);									// 正方形瓦片贴图边长信息:单位:像素 fprintf(fp,"imagenum %d\n",10);										// 瓦片个数 char c[400]={'\0'};for(i=0;i<10;i++){sprintf(c,"tile_%d.png",i);fprintf(fp,"%s\n",c);} fprintf(fp,"gamemapi %d gamemapj %d\n",gamemapi,gamemapj);for(i=0; i<gamemapi; i++){fprintf(fp,"%d",map[i][j]);for(j=0; j<gamemapj; j++){fprintf(fp," %d",map[i][j]);}fprintf(fp,"\n");}fclose(fp);char imagename[400]= {'\0'};char imagepath[400]={'\0'}; for(i=0; i<10; i++){sprintf(imagename,"tile_%d.png",i);							// 数字转字符串strcpy(imagepath,dirpath);									// 函数直接从头开始粘贴,自动清除开头的字符 strcat(imagepath,next);strcat(imagepath,imagename);saveimage(imagepath,&pentable[i]);							// 批量导出贴图}
}

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

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

相关文章

python常见的数据类型与数据结构(一)数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法

python常见的数据类型与数据结构&#xff08;一&#xff09;数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法 数据类型数字类型字符串类型布尔类型 数据结构列表集合字典 数据类型 数字类型 数字类型有int(整数)&#xff0c;float(浮点数)和complex(复数型…

异步任务超时机制

目录 1、Thread.Join(timeout) 2、Task.WhenAny(task,Task.Delay(timeout)) 3、WaitAsync(timeout) 需主动取消 4、CancellationTokenSource(timeout) 1、Thread.Join(timeout) var thread new Thread(() > {try {Console.WriteLine("Foo start...");Thread…

vue 使用docx库生成word表格文档

在Vue.js中生成Word表格文档&#xff0c;可以通过前端库来实现。这些库可以帮助我们轻松地将HTML表格转换为Word文档&#xff08;通常是.docx格式&#xff09;。以下是一些流行的前端库&#xff0c;它们可以用于在Vue项目中生成Word表格文档&#xff1a; docx…

保险购买的渠道

买保险的渠道 1.代理人。这个是保险公司传统的渠道&#xff0c;代理人的队伍非常庞大&#xff0c;许多人都碰到过保险代理人。 保险代理人的优势是"线下""1对1"&#xff0c;业务员如果非常专业&#xff0c;就能够给我们提供非常好的体验。由于大多数人接…

跨境电商无货源如何实现自动化对接1688货源商品上架?1688商品采集API来帮你

阿里巴巴集团旗下的B2B电子商务网站&#xff0c;提供海量优质商品&#xff0c;为采购商和供应商提供交流、合作、采购等服务&#xff0c;是很多没有货源优势的电商卖家首选的货源途径&#xff0c;也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要直…

优思学院|精益思想如何识别价值流?【案例分析】

精益思想是一种为了提高效率、减少浪费的管理哲学&#xff0c;精益思想强调在整个生产过程中识别并消除一切不创造价值的步骤。 价值流分析是精益思想中的一个核心概念&#xff0c;通过深入分析特定产品从原材料到最终交付给顾客的全过程&#xff0c;来识别并削减浪费&#xf…

Win11专业版安装集成了谷歌框架的安卓子系统,包含谷歌商店

1.摘要 上一篇博客讲述了使用微软商店安装安卓子系统的教程 https://blog.csdn.net/RudeTomatoes/article/details/135958882 上述方法的优点是安装过程简单&#xff0c;但是&#xff0c;由于Windows安卓子系统是微软与亚马逊联合开发&#xff0c;默认没有安装谷歌框架。我尝试…

实现一个Windows环境一键启停Oracle的bat脚本

Oracle数据库有许多优点,其中一些最重要的包括: 可靠性和稳定性: Oracle数据库经过长期的发展和测试,被广泛认为是非常可靠和稳定的数据库管理系统。它在大型企业和关键业务环境中被广泛应用,能够处理高负载和大规模的数据。 高性能: Oracle数据库具有优化的查询处理器和…

Pytorch框架-----torch.tensor(创建张量)

文章目录 前言一、torch.Tensor二、构建tensor1.从Python的list或序列构建2.空张量3.索引和切片来获取和修改一个张量tensor中的内容 前言 torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True&#xff0c;则会开始跟踪针对 tensor的所有操作。完成计算后&am…

线程相关整理

一 常用的线程手段 1 synchronized 有方法&#xff0c;和方法块&#xff0c;新的java版本 内部实现已经包含了多种方案&#xff0c;并动态调整方案&#xff0c;因此不是特别需求的化&#xff0c;建议直接用此方式 2 reentrantlock 可以构造公平锁 以上两种 代码片段应该是没得选…

开箱即用之 redis键值失效通知后端进行业务操作

引入redis依赖 <!--Spring boot Redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>配置类编写 import com.alibaba.fastjson.support.sp…

蓝牙攻击工具集合与使用说明

bluez - 蓝牙协议栈&#xff0c;提供了蓝牙设备管理和通信的基本功能。btscanner - 用于发现和扫描蓝牙设备的工具。bluetoothctl - 蓝牙控制终端工具&#xff0c;用于管理蓝牙设备和进行配对等操作。spooftooph - 用于欺骗和伪造蓝牙设备的MAC地址的工具。ubertooth - 用于无线…

设计模式一:单例模式

1、单例模式的实现方式 /*** 1、饿汉模式*/ public class Singleton1 {private static AtomicInteger count new AtomicInteger(0);private static final Singleton1 instance new Singleton1();public static Singleton1 getInstance(){return instance;} }/*** 2、懒汉模式…

学习总结19

# 奶牛的耳语 ## 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 n 头奶牛&#xff0c;其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi(0< pi < 10^8) 来表示。在无聊的日子里&#xff0c;奶牛们常常在自己的牛栏里与其它奶牛交…

设计模式-面试题

一、实际应用 项目中使用到的设计模式 模板方法模式、工厂方法模式、外观模式、建造者模式Spring中使用到的设计模式 代理模式、单例模式、观察者模式二、设计模式分类 设计模式(Design Pattern)是一套被反复使用、代码设计经验的总结。使用设计模式是为了可重用代码、让代码…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

c++学习记录 普通函数与函数模板调用规则

普通函数与函数模板调用规则 如果函数模板和普通函数都可以调用&#xff0c;优先调用普通函数可以通过空模板参数列表 强制调用函数模板函数模板可以发生函数重载如果函数模板可以产生更好的匹配&#xff0c;优先调用函数模板 #include<iostream> using namespace std;…

Python学习-用Python设计第一个游戏

三、用Python设计第一个游戏 1、新建文件 使用IDLE的编辑器模式&#xff0c;新建一个文件&#xff0c;点击File—>New File 2、将下面的游戏代码敲入进去 """用Python设计第一个游戏"""temp input("不妨猜一下小甲鱼现在心里想的是…

微软和OpenAI将检查AI聊天记录,以寻找恶意账户

据国外媒体报道&#xff0c;大型科技公司及其附属的网络安全、人工智能产品很可能会推出类似的安全研究&#xff0c;尽管这会引起用户极度地隐私担忧。大型语言模型被要求提供情报机构信息&#xff0c;并用于帮助修复脚本错误和开发代码以侵入系统&#xff0c;这将很可能会成为…

Vue的个人笔记

Vue学习小tips ctrl s ----> 运行 alt b <scrip> 链接 <script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script> 插值表达式 指令