9.基于粤嵌gec6818开发板小游戏2048的算法实现

2048源码:

感兴趣的可以去了解一下2048优化算法:
基于蒙特卡罗树搜索的_2048_游戏优化算法_刘子正

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
#define SUCCESS_NUM 2048int *plcd = NULL;char *bmp_name[] = {"2.bmp","4.bmp","8.bmp","16.bmp","32.bmp","64.bmp","128.bmp","256.bmp","512.bmp","1024.bmp","2048.bmp",
};
we
int matrix[4][4] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};int get_rand_int_1(){int k = 0;int a;srand((unsigned)time(NULL));a = rand();return a;
}int get_rand_int_2(){int k = 0;int a;srand((unsigned) (time(NULL) + 1));a = rand();// printf("%d\n", a);return a;
}int get_rand_int_3(){int k = 0;int a;srand((unsigned) (time(NULL) + 2));a = rand();// printf("%d\n", a);return a;
}int get_rand_int_4(){int k = 0;int a;srand((unsigned) (time(NULL) + 3));a = rand();// printf("%d\n", a);return a;
}// 初始化二维数组随机值
void init_matrix(){int a = get_rand_int_1();int b = get_rand_int_2();// printf("%d %d \n",a, b );int rand1_x = a % 4;int rand1_y = b % 4;// printf("%d %d\n",rand1_x, rand1_y );int c = get_rand_int_2();int d = get_rand_int_4();int rand2_x = c % 4;int rand2_y = d % 4;// 防止生成两个相同位置的块if(rand1_x == rand2_x && rand1_y == rand2_y){rand2_x = (rand2_x + 1) % 4;	//右移一位,对四取余}// printf("%d %d\n",rand2_x, rand2_y );matrix[rand1_x][rand1_y] = 2;matrix[rand2_x][rand2_y] = 4;
}void draw_point(int x,int y,int color){if(x>=0 && x<800 && y>=0 && y<480 ){*(plcd+800*y+x) = color ;}
}//实现一个函数,在坐标为x0,y0的位置显示一个矩形,宽度为w,高度为h,颜色为color
void lcd_draw_rect(int x0, int y0, int w, int h, int color){int x, y;for (y = y0; y < y0+h; y++){for (x = x0; x < x0+w; x++)draw_point(x, y, color);}
}void lcd_draw_bmp(char *file, int x, int y){int photo_file = open(file, O_RDONLY);if(photo_file == -1){perror("open error\n");return ;}int width, height;short depth;unsigned char buf[4] ;//读取宽度lseek(photo_file, 0x12, SEEK_SET);read(photo_file, buf, 4);width = buf[3]<<24 | buf[2]<<16 | buf[1]<<8 | buf[0];//读取高度read(photo_file, buf, 4);height  = buf[3]<<24 | buf[2]<<16 | buf[1]<<8 | buf[0];//读取色深lseek(photo_file, 0x1c, SEEK_SET);read(photo_file, buf, 2);depth = buf[1]<<8 | buf[0];//打印信息// printf("width=%d | height=%d | depth=%d \n", width, height, depth);//像素数组 int line_valid_bytes = abs(width) * depth / 8 ; //一行本有的有效字节int laizi = 0;//填充字节if( (line_valid_bytes % 4) !=0   ){laizi = 4 - line_valid_bytes % 4;}int line_bytes = line_valid_bytes + laizi;//一行所有的字节数int total_bytes = line_bytes * abs(height); //整个像素数组的大小unsigned char * photo_contents = malloc(total_bytes);lseek(photo_file, 54, SEEK_SET);read(photo_file, photo_contents, total_bytes);//调用draw_point 函数 。unsigned char a, r, g, b;int i = 0;//用来做指针运动的int x_0 = 0, y_0 = 0; //用来循环计数int color;for(y_0=0; y_0<abs(height); y_0++){	//画满每一列for(x_0=0; x_0<abs(width); x_0++){	//画满每一行//现在开始一个字节一个字节写入颜色// i++  先用后加     // ++i  先加后用b = photo_contents[i++];g = photo_contents[i++];r = photo_contents[i++];if(depth == 32){a = photo_contents[i++];}if(depth == 24){a = 0;}color = a<<24 | r<<16 | g<<8 | b ;draw_point(width>0 ? x+x_0 : abs(width)+x-1-x_0, height>0 ? y+height-1-y_0 : y+y_0, color);}i = i + laizi ;//每一行后面的癞子数 跳过去。	}free(photo_contents);close(photo_file);
}char *get_filename_by_digit(int digit){int index;switch (digit){case 2:index = 0;break;case 4:index = 1;break;case 8:index = 2;break;case 16:index = 3;break;case 32:index = 4;break;case 64:index = 5;break;case 128:index = 6;break;case 256:index = 7;break;case 512:index = 8;break;case 1024:index = 9;break;case 2048:index = 10;break;default:index = 0;break;}// printf("%s\n", bmp_name[index]);xreturn bmp_name[index];
}void lcd_draw_matrix(){int i, j;for (i = 0 ; i < 4; i++){for (j = 0; j < 4; j++){if (matrix[i][j] == 0){//画一个颜色矩形//	void lcd_draw_rect(int x0, int y0, int //w, int h, int color)lcd_draw_rect(20+ 120*j, 20+120*i,100, 100, 0x16a08500);}else{//画一张对应数字的bmp图片//	void lcd_draw_bmp(char *file, int x0, //int y0)lcd_draw_bmp(get_filename_by_digit(matrix[i][j]),20+ 120*j, 20+120*i);}}}
}//获得手指的滑动方向
int get_finger_move_direction()
{int direction;int fd = open("/dev/input/event0", O_RDONLY);if(fd == -1){perror("/dev/input/event0 open error\n");return -1;}int x,y;int x_start, y_start, x_stop, y_stop;struct input_event ev ;while(1){int r = read(fd,&ev,sizeof(ev));if(r != sizeof(ev)){perror("read ev error\n");return -2;}if(ev.type == EV_ABS  && ev.code == ABS_X){x= ev.value ;}if(ev.type == EV_ABS  && ev.code == ABS_Y){y = ev.value;}if(ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value != 0 ){printf("FINGTER DOWN(%d ,%d )\n",x,y);x_start = x;y_start = y;}//弹起来if(ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value == 0 ){printf("FINGTER UP(%d ,%d )\n",x,y);x_stop = x;y_stop = y ;if(y > 0)	break;}}if(abs(x_start - x_stop)  - abs(y_start - y_stop)  > 0 && abs(x_start - x_stop) > 30){	//X方向滑动if(x_stop  -  x_start  > 0){printf("SLIP RIGHT\n\n");direction = RIGHT;}else{printf("SLIP LEFT\n\n");direction = LEFT;}}if(abs(x_start - x_stop)  - abs(y_start - y_stop)  < 0 && abs(y_start - y_stop) > 30){	//y方向滑动if(y_stop - y_start >0){printf("SLIP DOWN\n\n");direction = DOWN;}else{printf("SLIP UP\n\n");direction = UP;}}close(fd);return direction;
}void handle_up(){int i, j, k, l;int zero[4] = {-1, -1, -1, -1};// 挪动部分for(j=0; j<=3; j++){for(l=0; l<=3; l++){zero[l] = -1;}for(i=0; i<=3; i++){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[i] = 0;}else{// printf("Start to scan zero\n");for(k=0; k<=3; k++){	//从右到左遍历zeroprintf("%d\t", zero[k]);}printf("\n");for(k=0; k<=3; k++){	//从右到左遍历zeroif(zero[k] == 0){// printf("zero[%d] is empty!\n", k);matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;zero[k] = -1;					//将移入的位置标志为-1zero[i] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);// for(k=0; k<=3; k++){			//从右到左遍历zero// 	printf("%d\t", zero[k]);// }printf("\n");}}}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("ADD\n");//加和部分for(j=0; j<=3; j++){for(i=0; i<=2; i++){if(matrix[i][j] != matrix[i+1][j]){		//相邻的不想等,j左移continue;}else{matrix[i][j] = 2 * matrix[i][j];	//相邻的相等,向右合并matrix[i+1][j] = 0;printf("%d\t%d\n", matrix[i][j], matrix[i+1][j]);i += 1;								//j指向到置零格子的位置}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("Move again\n");// 再次向右挪动for(j=0; j<=3; j++){for(l=0; l<=3; l++){zero[l] = -1;}for(i=0; i<=3; i++){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[i] = 0;}else{// printf("Start to scan zero\n");// for(k=0; k<=3; k++){	//从右到左遍历zero// 	printf("%d\t", zero[k]);// }// printf("\n");for(k=0; k<=3; k++){	//从右到左遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;zero[k] = -1;					//将移入的位置标志为-1zero[i] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);// for(k=0; k<=3; k++){			//从右到左遍历zero// 	printf("%d\t", zero[k]);// }// printf("\n");}}}}}// printf("Start to scan zero\n");// 			for(k=0; k<=3; k++){	//从右到左遍历zero// 				printf("%d\t", zero[k]);// 			}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}
}void handle_down(){int i, j, k, l;int zero[4] = {-1, -1, -1, -1};printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}// 挪动部分for(j=0; j<=3; j++){for(l=0; l<=3; l++){zero[l] = -1;}for(i=3; i>=0; i--){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[i] = 0;}else{// printf("Start to scan zero\n");// for(k=0; k<=3; k++){	//从右到左遍历zero// 	printf("%d\n", zero[k]);// }// printf("\n");for(k=3; k>=0; k--){	//从右到左遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;zero[k] = -1;					//将移入的位置标志为-1zero[i] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);// for(k=0; k<=3; k++){			//从右到左遍历zero// 	printf("%d\n", zero[k]);// }}}}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("ADD\n");//加和部分for(j=0; j<=3; j++){for(i=3; i>=1; i--){if(matrix[i][j] != matrix[i-1][j]){		//相邻的不想等,i上移continue;}else{matrix[i][j] = 2 * matrix[i][j];	//相邻的相等,向右合并matrix[i-1][j] = 0;printf("%d\t%d\n", matrix[i][j], matrix[i-1][j]);i -= 1;								//i指向到置零格子的位置}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("Move again\n");// 再次向右挪动for(j=0; j<=3; j++){for(l=0; l<=3; l++){zero[l] = -1;}for(i=3; i>=0; i--){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[i] = 0;}else{// printf("Start to scan zero\n");// for(k=0; k<=3; k++){	//从右到左遍历zero// 	printf("%d\n", zero[k]);// }// printf("\n");for(k=3; k>=0; k--){	//从右到左遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;zero[k] = -1;					//将移入的位置标志为-1zero[i] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);printf("\n");}}}}}// printf("Start to scan zero\n");// 			for(k=0; k<=3; k++){	//从右到左遍历zero// 				printf("%d\n", zero[k]);// 			}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}
}void handle_left(){int i, j, k, l;int zero[4] = {-1, -1, -1, -1};// 挪动部分for(i=0; i<=3; i++){for(l=0; l<=3; l++){zero[l] = -1;}for(j=0; j<=3; j++){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[j] = 0;}else{// printf("Start to scan zero\n");// for(k=0; k<=3; k++){	//从右到左遍历zero// 	printf("%d\t", zero[k]);// }// printf("\n");for(k=0; k<=3; k++){	//从右到左遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[i][k] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;zero[k] = -1;					//将移入的位置标志为-1zero[j] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);// for(k=0; k<=3; k++){			//从右到左遍历zero// 	printf("%d\t", zero[k]);// }// printf("\n");}}}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("ADD\n");//加和部分for(i=0; i<=3; i++){for(j=0; j<=2; j++){if(matrix[i][j] != matrix[i][j+1]){		//相邻的不想等,j左移continue;}else{matrix[i][j] = 2 * matrix[i][j];	//相邻的相等,向右合并matrix[i][j+1] = 0;printf("%d\t%d\n", matrix[i][j], matrix[i][j+1]);j += 1;								//j指向到置零格子的位置}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("Move again\n");// 再次向右挪动for(i=0; i<=3; i++){for(l=0; l<=3; l++){zero[l] = -1;}for(j=0; j<=3; j++){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[j] = 0;// printf("Start to scan zero\n");// for(k=0; k<=3; k++){	//从左到右遍历zero// 	printf("%d\t", zero[k]);// }printf("\n");}else{printf("(%d, %d) NOT 0\n", i, j);for(k=0; k<=3; k++){	//从左到右遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[i][k] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;printf("%d \t %d \n", matrix[i][k], matrix[i][j] );zero[k] = -1;					//将移入的位置标志为-1zero[j] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);}}}}}// printf("Start to scan zero\n");// 			for(k=0; k<=3; k++){	//从右到左遍历zero// 				printf("%d\t", zero[k]);// 			}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}
}void handle_right(){int i, j, k, l;int zero[4] = {-1, -1, -1, -1};// 挪动部分for(i=0; i<=3; i++){for(l=0; l<=3; l++){zero[l] = -1;}for(j=3; j>=0; j--){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[j] = 0;}else{// printf("Start to scan zero\n");// for(k=3; k>=0; k--){	//从右到左遍历zero// 	printf("%d\t", zero[k]);// }printf("\n");for(k=3; k>=0; k--){	//从右到左遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[i][k] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;zero[k] = -1;					//将移入的位置标志为-1zero[j] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);// for(k=3; k>=0; k--){			//从右到左遍历zero// 	printf("%d\t", zero[k]);// }printf("\n");}}}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("ADD\n");//加和部分for(i=0; i<=3; i++){for(j=3; j>=1; j--){if(matrix[i][j] != matrix[i][j-1]){		//相邻的不想等,j左移continue;}else{matrix[i][j] = 2 * matrix[i][j];	//相邻的相等,向右合并matrix[i][j-1] = 0;printf("%d\t%d\n", matrix[i][j], matrix[i][j-1]);j -= 1;								//j指向到置零格子的位置}}}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}printf("---------------------------------------\n");printf("Move again\n");// 再次向右挪动for(i=0; i<=3; i++){for(l=0; l<=3; l++){zero[l] = -1;}for(j=3; j>=0; j--){if(matrix[i][j] == 0){printf("(%d, %d) ---> 0\n", i, j);zero[j] = 0;// printf("Start to scan zero\n");// for(k=0; k<=3; k++){	//从右到左遍历zero// 	printf("%d\t", zero[k]);// }// printf("\n");}else{printf("(%d, %d) NOT 0\n", i, j);for(k=3; k>=0; k--){	//从右到左遍历zeroif(zero[k] == 0){printf("zero[%d] is empty!\n", k);matrix[i][k] = matrix[i][j];	//将左侧的数值移动到右侧的空白处matrix[i][j] = 0;printf("%d \t %d \n", matrix[i][k], matrix[i][j] );zero[k] = -1;					//将移入的位置标志为-1zero[j] = 0;					//将移走的位置标志为0// printf("after move: zero[k]: %d \t zero[j]: %d\n", zero[k]);}}}}}// printf("Start to scan zero\n");// 			for(k=0; k<=3; k++){	//从右到左遍历zero// 				printf("%d\t", zero[k]);// 			}printf("Start to scan matrix\n");// int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d\t", matrix[i][j]);}printf("\n");}
}void rand_digital(){int b[32], k=0, m=0, i, j;for(i=0;i<4;i++)for(j=0;j<4;j++){if(matrix[i][j] == 0){// printf("(%d, %d)\n", i, j);b[k] = i;b[k+1] = j;k += 2;m += 1;}}if(m>0){int a;srand((unsigned)time(NULL));a = rand();printf("%d\n", a);int t = a % m;// if(t % 2 != 0) t -= 1;matrix[b[2*t]][b[2*t+1]] = 2;}}int False(){// printf("enter false\n");int i,j;for(i=0;i<4;i++)for(j=0;j<3;j++)if(matrix[i][j]==0||matrix[i][j]==matrix[i][j+1]) return 0;	//遍历左右for(j=0;j<4;j++)for(i=0;i<3;i++)if(matrix[i][j]==0||matrix[i+1][j]==matrix[i][j]) return 0;	//遍历上下if(matrix[3][3]==0) return 0;return 1;
}int Success(){// printf("Start to scan matrix\n");int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++){// printf("%d\n", matrix[i][j]);if(matrix[i][j]==SUCCESS_NUM) return 1;				//遍历所有格,如果有2048,即成功!}return 0;
}void pfalse(){lcd_draw_rect(0, 0, 800, 480, 0x0);lcd_draw_bmp("false.bmp",0,0);
}void psuccess(){lcd_draw_rect(0, 0, 800, 480, 0x0);lcd_draw_bmp("success.bmp",0,0);
}void My_2048(){int direction;init_matrix();while(1){lcd_draw_matrix();direction = get_finger_move_direction();switch (direction){case UP:handle_up();rand_digital();break;case DOWN:handle_down();rand_digital();break;case LEFT:handle_left();rand_digital();break;case RIGHT:handle_right();rand_digital();break;}// handle(direction);// rand_digital();if(False()){pfalse();return;}if(Success()){psuccess();return;}// rand_digital();}
}int main(int argc, char *argv[]){int fd;fd = open("/dev/fb0", O_RDWR);//if (fd == -1)if (-1 == fd){printf("/dev/fb0 open error!\n");return 0;}plcd = mmap(NULL, 800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);if (MAP_FAILED == plcd){printf("mmap error !\n");return 0;}#if 0int i;for (i = 0; i < 800*480;i++)*(plcd + i) = 0x0000ff00;#endif#if 0int x, y, color;color = 0x000000ff;for (y = 0; y < 480; y++){for (x = 0; x < 800; x++)draw_point(x, y, color);}#endif//在坐标为(200,200)的位置,显示一个100*100的颜色矩形,颜色为红色#if 0for (y = 200; y < 200+100; y++){for (x = 200; x < 200 + 100; x++)draw_point(x, y, color);}#endiflcd_draw_rect(0, 0, 800, 480, 0x0);My_2048();return 0;
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

程序员自由创业周记#12:999%

下载量涨了999% 在此之前&#xff0c;我的Apple开发账号上只有一个产品-学伟扫描&#xff0c;因为没有推广&#xff0c;只靠自然流量&#xff0c;每天的下载量寥寥无几&#xff0c;这种稳定无人问津的状态断断续续保持了4年。 之前的周记里介绍了最近在做创业的第二个项目-学伟…

PHP 如何创建一个 composer 包 并在 项目中使用自己的 composer sdk 包

第一步创建一个composer SDK项目 创建一个 composer.json文件或使用 命令 &#xff08;如果不清楚怎么弄 直接跳过即可&#xff0c;一般都会默认配置&#xff09; composer init这是生成的composer.json文件 将自己要使用的包添加到 require 中&#xff0c;如果没有require则…

mac安装运行superset及踩坑解决过程

介绍 Apache Superset 是一个现代的企业级商业智能 Web 应用程序。它快速、轻量、直观&#xff0c;并加载了各种选项&#xff0c;使所有技能的用户都可以轻松探索和可视化他们的数据&#xff0c;从简单的饼图到高度详细的 Deck.gl 地理空间图表。 安装 首先安装自制homebrew安…

1. PCIE基础入门知识

GT/s 是"每秒十亿次传输" 时间版本速率2003Pcie 1.02.5GT/s2006PCIE 2.05GT/s2010PCIE 3.08GT/s2017PCIE 4.016GT/s 高速接口&#xff1a;雷电接口&#xff08;PCIEx4接口 &#xff09; PCIE接口 工作模式&#xff1a;Endpoint 和 Root Port。 Endpoint&#xff0…

Si314 低功耗 14 通道电容触摸传感器,软硬件兼容替代GTX314L

Si314 是一款具有自动灵敏度校准功能的 14 通道电容传感器&#xff0c;其工作电压范围为 1.8~5.5V。 Si314 设置休眠模式来节省功耗&#xff0c;此时&#xff0c;功耗电流为 10uA3.3V。Si314 各个感应通道可实现独立使能、校准、灵敏度调节&#xff0c;可以确保可靠性&#xff…

Terminnal will be login out after 20 second

锐捷交换机&#xff0c;命令敲着敲着 &#xff0c;就提示20秒后将中断 &#xff0c;show ip ssh 查看也一下也没有什么特殊的。 于是查看了一下VTY下的配置 absolute-timeout 5 ,这句话是什么意思呢 &#xff1f; 5分钟强制退出 &#xff01; 改进方法&#xff1a; (config)#…

14:00面试,14:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Revopoint的3D输出格式及转换工具

在 CES 展会期间&#xff0c;许多参观者向我们询问与我们的 3D 扫描仪相关的问题。 最常见的问题包括我们的扫描仪导出的文件格式&#xff0c;以及该文件是否与 3D 打印机兼容&#xff1f; 因此&#xff0c;我们决定回答这些问题&#xff0c;并在本文中对常见的 3D 文件格式进行…

vuejs - - - - - 使用code编辑器codemirror

使用code编辑器codemirror 0. 效果图1. 依赖安装2. 组件封装3. 组件使用 0. 效果图 列表实现参考: 列表实现代码 1. 依赖安装 npm install codemirror codemirror-editor-vue3 jsonlint-mod 2. 组件封装 code-mirror-editor.vue <template><VueCodeMirrorclas…

Nginx location 精准匹配URL = /

Location是什么&#xff1f; Location是Nginx中的块级指令(block directive)&#xff0c;通过配置Location指令块&#xff0c;可以决定客户端发过来的请求URI如何处理&#xff08;是映射到本地文件还是转发出去&#xff09;及被哪个location处理。 匹配模式 分为两种模式&…

Vim编辑器使用入门

目录 一、Vim 编辑器基础操作 二、Vim 编辑器进阶操作 三、Vim 编辑器高级操作 四、Vim 编辑器文件操作 五、Vim 编辑器文件管理 六、Vim 编辑器进阶技巧 七、Vim 编辑器增强功能 Vim的三种工作模式 一、Vim 编辑器基础操作 1.移动光标 - 光标的移动控制 移动光标有两…

计算机网络常见面试题

目录 一、谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 答&#xff1a;OSI七层模型主要分为&#xff1a; TCP/IP四层协议&#xff1a; 二、谈谈TCP协议的3次握手过程&#xff1f; 三、TCP协议为什么要3次握手&#xff1f;2次&#xff0c;4次不行吗&#xff1f; …

微信这样的加人方式,既安全又解放双手

在当今竞争激烈的市场环境下&#xff0c;如何高效地管理和运营私域流量成为企业发展的关键。 1.批量自动化加好友的优势 &#xff08;1&#xff09;提高效率&#xff1a;批量自动化添加好友功能可以帮助企业添加大量潜在客户或目标客户。相比手动逐个添加好友&#xff0c;自动…

嵌入式Linux驱动开发(I2C专题)(七)

使用GPIO操作I2C设备_IMX6ULL 参考资料&#xff1a; Linux文档 Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yamlLinux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt Linux驱动源码 Linux-5.4\drivers\i2c\busses\i2c-gpio.cLinux-4.9.88\driv…

spring boot 时间格式化输出

目录标题 一、spring boot 序列化二、 JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")和JSONField(format "yyyy-MM-dd HH:mm:ss")区别三、在实体类中序列化时间&#xff08;格式化输出&#xff09;&#xff08;一&#xff09;使用JsonFormat&#xff08;二…

【校招VIP】产品基础知识之学习渠道

考点介绍&#xff1a; 产品经理是一项复合型的工作&#xff0c;需要学习掌握的知识很多&#xff0c;能否通过学习掌握并构建一套属于自己的产品知识体系&#xff0c;是成为一名优秀产品经理的重要条件。系统化学习方法&#xff0c;可以分为以下6个步骤&#xff1a; 1、明确的学…

robotframework在Jenkins执行踩坑

1. Groovy Template file [robot_results.groovy] was not found in $JENKINS_HOME/email_template 1.需要在managed files 添加robot_results.groovy。这个名字需要和配置在构建项目里default content一致&#xff08;Extended E-mail Notification默认设置里Default Content…

如何利用物联网技术打造新型智能餐饮连锁店

中国是美食大国&#xff0c;餐饮美食的消费需求庞大&#xff0c;随着餐饮产业的标准化、规模化发展&#xff0c;餐饮店的连锁化率在持续上升&#xff0c;许多餐饮知名品牌都开设了成百上千家连锁店。随着餐饮连锁店数量的增加&#xff0c;对品牌店铺的管理和运营难度也日益增长…

【C语言】字符函数和字符串函数(含模拟)

前言&#xff1a; 在做OJ题或阅读代码时或多或少会遇到一些字符函数和字符串函数&#xff0c; 如果不认识或不熟悉就会造成不便&#xff0c; 本篇文章主要是为了这方面而存在&#xff0c; 此篇介绍各个字符串的功能与使用方法&#xff0c; 下一篇会讲解如何模拟这些函数 重点&a…

javax.validation.constraints校验

这个必须配合Validated 使用 三者都得不为null (没有参数传过来即为null ) notNull 可以为空白或空格(长度不限) NotEmpty 长度要大于0 (可以为空格,因为空格也有长度) NotBlank 只能用在 string &#xff0c;并且去掉空格之后要大于0