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

news2024/11/19 13:44:33

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 2048

int *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]);x
	return 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++){	//从右到左遍历zero
					printf("%d\t", zero[k]);
				}
				printf("\n");

				for(k=0; k<=3; k++){	//从右到左遍历zero
					if(zero[k] == 0){
						// printf("zero[%d] is empty!\n", k);
						matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处
						matrix[i][j] = 0;
						zero[k] = -1;					//将移入的位置标志为-1
						zero[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++){	//从右到左遍历zero
					if(zero[k] == 0){
						printf("zero[%d] is empty!\n", k);
						matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处
						matrix[i][j] = 0;
						zero[k] = -1;					//将移入的位置标志为-1
						zero[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--){	//从右到左遍历zero
					if(zero[k] == 0){
						printf("zero[%d] is empty!\n", k);
						matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处
						matrix[i][j] = 0;
						zero[k] = -1;					//将移入的位置标志为-1
						zero[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--){	//从右到左遍历zero
					if(zero[k] == 0){
						printf("zero[%d] is empty!\n", k);
						matrix[k][j] = matrix[i][j];	//将左侧的数值移动到右侧的空白处
						matrix[i][j] = 0;
						zero[k] = -1;					//将移入的位置标志为-1
						zero[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++){	//从右到左遍历zero
					if(zero[k] == 0){
						printf("zero[%d] is empty!\n", k);
						matrix[i][k] = matrix[i][j];	//将左侧的数值移动到右侧的空白处
						matrix[i][j] = 0;
						zero[k] = -1;					//将移入的位置标志为-1
						zero[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++){	//从左到右遍历zero
					if(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;					//将移入的位置标志为-1
						zero[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--){	//从右到左遍历zero
					if(zero[k] == 0){
						printf("zero[%d] is empty!\n", k);
						matrix[i][k] = matrix[i][j];	//将左侧的数值移动到右侧的空白处
						matrix[i][j] = 0;
						zero[k] = -1;					//将移入的位置标志为-1
						zero[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--){	//从右到左遍历zero
					if(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;					//将移入的位置标志为-1
						zero[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 0
	int i;
	for (i = 0; i < 800*480;i++)
		*(plcd + i) = 0x0000ff00;
	#endif
	
	#if 0
	int 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 0
	for (y = 200; y < 200+100; y++){
		for (x = 200; x < 200 + 100; x++)
			draw_point(x, y, color);
	}
	#endif
	lcd_draw_rect(0, 0, 800, 480, 0x0);
	
	My_2048();
	
	
	return 0;
}

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

在这里插入图片描述

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

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

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

相关文章

modbusRTU【codesys】

先熟悉功能码&#xff1a; 1添加主站&#xff1a; 2添加从站&#xff1a; 3从站操作&#xff1a;【写】 注&#xff1a; 厂家屏蔽了 5和6 【不能写 单线圈和单寄存器】 映射好【站1Q】之后&#xff0c;就不需要再管其他设置。 只需要再程序里赋值【站1Q】的输出值就行 比如 站…

爬虫使用Selenium生成Cookie

在爬虫的世界中&#xff0c;有时候我们需要模拟登录来获取特定网站的数据&#xff0c;而使用Selenium登录并生成Cookie是一种常见且有效的方法。本文将为你介绍如何使用Selenium进行登录&#xff0c;并生成Cookie以便后续的爬取操作。让我们一起探索吧&#xff01; 一、Seleni…

【数据结构】七大排序算法详解

目录 ♫什么是排序 ♪排序的概念 ♪排序的稳定性 ♪排序的分类 ♪常见的排序算法 ♫直接插入排序 ♪基本思想 ♪算法实现 ♪算法稳定性 ♪时间复杂度 ♪空间复杂度 ♫希尔排序 ♪基本思想 ♪算法实现 ♪算法稳定性 ♪时间复杂度 ♪空间复杂度 ♫直接选择排序 ♪基本思想 ♪算法…

基于51单片机简易计算器仿真设计(proteus仿真+程序+原理图+PCB+设计报告+讲解视频)

基于51单片机简易计算器仿真设计&#xff08;proteus仿真程序原理图PCB设计报告讲解视频&#xff09; 讲解视频1.1 功能要求1.2 仿真图&#xff1a;1.3 原理图&#xff1a;1.4 PCB&#xff1a;1.5 源程序&#xff1a;1.6设计报告&#xff1a;资料清单&&下载链接&#x…

C/C++统计满足条件的4位数个数 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计满足条件的4位数个数 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C统计满足条件的4位数个数 2019年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定若干…

搭建安信可小安派Windows 开发环境

搭建小安派Windows 开发环境 Ai-Pi-Eyes 系列是安信可开源团队专门为Ai-M61-32S设计的开发板&#xff0c;支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口&#xff0c;具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SP…

硬件知识积累 网口接口 百兆,千兆,万兆 接口介绍与定义 (RJ45 --简单介绍)

1. 百兆网口 1.1百兆网的定义 百兆网的意思是是100Mb/S&#xff0c;中文叫做100兆位/秒。 1.2百兆网口的常用连接器 1.1.1 一般百兆网口的连接器一般是RJ45 下面是 实物图&#xff0c; 原理图&#xff0c;封装图。 1.3 百兆网口连接线的介绍 1.3.1 百兆需要使用的线的定义 百…

嵌入式开发笔记:STM32的外设GPIO知识学习

GPIO简介&#xff1a; • GPIO &#xff08; General Purpose Input Output &#xff09;通用输入输出口 • 可配置为 8 种输入输出模式 • 引脚电平&#xff1a; 0V~3.3V &#xff0c;部分引脚可容忍 5V &#xff08;如舵机和驱动直流电机&#xff09; • 输出模式下可控制端口…

《从菜鸟到大师之路 MySQL 篇》

《从菜鸟到大师之路 MySQL 篇》 数据库是什么 数据库管理系统&#xff0c;简称为DBMS&#xff08;Database Management System&#xff09;&#xff0c;是用来存储数据的管理系统。 DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 实现读取自动化需要编程…

《软件方法(下)》第8章2023版连载(02)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.1.5 重视分析工作流 分析&#xff0c;就是从核心域的视角构思系统的内部机理。 在现在的很多软件组织中&#xff0c;分析工作流的技能被严重忽视。很多开发人员上手就直接编码&…

92 # express 中的中间件的实现

上一节实现 express 的优化处理&#xff0c;这一节来实现 express 的中间件 中间件的特点&#xff1a; 可以决定是否向下执行可以拓展属性和方法可以权限校验中间件的放置顺序在路由之前 中间件基于路由&#xff0c;只针对路径拦截&#xff0c;下面是中间件的匹配规则&#…

HTTP、TCP、SOCKET三者之间区别和原理

7层网络模型 网络在世界范围内实现互联的标准框架 7层为理想模型&#xff0c;一般实际运用没有7层 详细内容 HTTP属于7层应用层 BSD socket属于5层会话层 TCP/IP属于4成传输层 TCP/IP协议 三次握手 笔者解析&#xff1a; 第一次握手&#xff1a;实现第一步需要客户端主动…

【WSL】下载appx包将WSL装在非系统盘

装系统软件这事&#xff0c;主打一个小强精神 首先&#xff0c;准备好一个微软官方提供的安装包。下载链接&#xff1a;https://learn.microsoft.com/en-us/windows/wsl/install-manual#downloading-distributions 然后&#xff0c;剩下步骤在这个问题讨论中已经说明了&#xf…

【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本

前言 &#x1f34a;缘由 Iphone15来了&#xff0c;两年之约你还记得吗&#xff1f; 两年前&#xff0c;与特别的人有一个特别的约定。虽物是人非&#xff0c;但思念仍在。 遂整合之前iphone13及iphone14的相关抢购代码&#xff0c;完成一个SpringBoot监听Iphone15有货邮件提…

PHP后台实现微信小程序登录

微信小程序官方给了十分详细的登陆时序图&#xff0c;当然为了安全着想&#xff0c;应该加上签名加密。 微信小程序端 1).调用wx.login获取 code 。 2).调用wx.getUserInfo获取签名所需的 rawData , signatrue , encryptData 。 3).发起请求将获取的数据发送的后台。 login: …

Nginx 解决内容安全策略CSP(Content-Security-Policy)配置方式

1、修改 nginx 配置文件 在nginx.conf 配置文件中&#xff0c;增加如下配置内容&#xff1a; add_header Content-Security-Policy "default-src self localhost:8080 unsafe-inline unsafe-eval blob: data: ;";修改后效果如下&#xff1a; 2、重启 nginx 服务 …

【CFD小工坊】模型网格(三角形网格)

【CFD小工坊】模型网格&#xff08;三角形网格&#xff09; 前言网格几何网格编号编程实现数据读入网格数据构建 本系列博文的是我学习二维浅水方程理论&#xff0c;直至编译一个实用的二维浅水流动模型的过程。&#xff08;上一篇Blog回顾&#xff09; 前言 本二维浅水模型将…

Docker部署Nginx+FastDFS插件

文章目录 一、部署FastDFS二、部署Nginx(带FastDFS插件)三、FastDFS上传文件Nginx访问验证 一、部署FastDFS 1、准备工作 docker pull qinziteng/fastdfs:5.05 Pwd"/data/software/fastdfs" mkdir ${Pwd}/{storage,tracker} -p2、创建TEST容器&#xff0c;将fastdf…

uniapp中vue3使用uni.createSelectorQuery().in(this)报错

因为VUE3中使用setup没有this作用域&#xff0c;所以报错 解决办法&#xff1a;使用getCurrentInstance()方法获取组件实例 import { getCurrentInstance } from vue;const instance getCurrentInstance(); // 获取组件实例 const DOMArr uni.createSelectorQuery().in(ins…

【C#】.Net基础语法二

目录 一、字符串(String) 【1.1】字符串创建和使用 【1.2】字符串其他方法 【1.3】字符串格式化的扩展方法 【1.4】字符串空值和空对象比较 【1.5】字符串中的转移字符 【1.6】大写的String和小写的string 【1.7】StringBuilder类的重要性 二、数组(Array) 【2.1】声…