首页 资讯 论坛 我的社区 搜索 用户

[QT]RGB点阵的贪吃蛇设计

无闻风
发表于 2019-06-27 14:45:17
0
893

本来是同RGB点阵实现的但这个项目由于没有硬件支持,所以用VS写代码,再用QT写个界面模拟一下。

先看一下可以实现的功能:

所有的猎物都以LED矩阵屏幕的像素点形式出现,健康猎物-绿色,带病猎物-紫色(红色加蓝色)有毒猎物红色,蛇一连串的像素点构成:蛇头是一个蓝色的像素点,蛇尾是一系列情色(绿蓝)像素点 游戏统计信息显示在LCD点阵屏上。

当系统复位商店后LCD顶部显示出玩家零统计和零计时,LED矩阵屏幕出现游戏界面(随机在游戏区域内出现猎物)当摇杆俺就被按下,游戏开始(更换一批猎物),游戏开始计时,这是,在游戏区域中随机分布和配数10个猎物,大概比例为45%健康,45%带病,10%死亡的,猎物不能在另一个猎物上出现,也不能在蛇段上出现。

游戏开始时,是以一个像素点的头的形式出现在随机位置(不包括目标位置),舍得行动随着摇杆开始运动开始,蛇的移动速度可以设定,迷人设置一个像素每秒,蛇时以直角的形式进行转弯,当猎物被蛇头吃掉时:被捕获的猎物消失,一个新猎物出现(随机的位置以及类型),舍得 长度增加一个像素点,玩家的得分变化,蛇头运动到被捕猎的猎物位置上。玩家得分情况是显示补货的健康猎物(后缀h)和带兵的猎物(后缀i)的数量来体现。蛇最大能够增加24个像素点长度包括头,移动时蛇必须沿着他的爬行轨迹,其中蛇头是由摇杆控制其偏离情况。是不能向后运动和跨越身体。

如果玩家将蛇推向死局时——当蛇头被蛇身围死且阻挡了运动方向,这时游戏停止,并且在LCD上显示“dead lock”事件,当捕捉了一个有毒的猎物后“game over”事件出现,游戏结束并且在LCD上显示该事件。游戏结束时,玩家的计时固定下来,显示出得分结果(捕捉的健康猎物减去不会做的带病猎物),并且停止蛇的任何移动。重新开始游戏——在“game over”和“dead lock”事件时按下摇杆按钮。

在游戏过程中按下摇杆按钮,游戏暂停并进入菜单设置模式,LCD显示信息,并使用摇杆设置菜单由“是否可以穿墙”(through wall ?)和“蛇移动速度”(speed)两个选项,可以通过摇杆上下设置,如果玩家设置了Yes,那么蛇可以从墙的一边直接到另一边出来(LED屏幕的边缘)。在速度模式中,玩家可以通过摇杆上下对速度进行加减,没修改一次改变0.5像素,最小1最大到4.菜单模式中任何时候按下摇杆按钮,游戏返回并继续。

查看排行榜——在游戏开始前或者“游戏结束 game over”事件时,玩家可以通过摇杆左右移动查看排行榜,可以查看历史4个最高分,摇杆左右切换查看排行榜页面和返回游戏界面。

(这其实就是世界技能大赛的国赛项目,哈哈)

  

这是效果图。下面上代码:

/*全局变量*/
static int RGB_Buffer[8][8] =
{
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,
	BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK
};
//点阵上的缓存
unsigned char hh=0, mm=0, ss=0;//保存运行时间的
unsigned char food_xy[24] = { 0,0 ,6,6};//食物坐标 
unsigned char food_type[15];//食物类型 0good  1bad  2die
unsigned char snake_head_direction = 1;//移动的方向 1左 2右 3上 4下
unsigned char snake_len = 1;//蛇身长度
char snake[128] = { 3,3,3,4};//蛇的身体坐标
char eatflag=0;              //进食标记
int good_tests, bad_tests,all;//分数统计  all=good_tests-bad_tests
char x_ana, y_ana;//预判结果
char game_star = 0;//游戏标志
unsigned int speedflag = 10,speed;//速度设置
char through = 0;//是否可以穿墙
uint32_t second_t,speed_t;//时间变量
int tests[10];//分数排行
/*一些显示子函数*/
void displayinit()//清除点阵上的内容
{
	unsigned char a,b;
	for (a = 0; a < 8; a++)
	{
		for (b = 0; b < 8; b++)
		{
			RGB_Buffer[a][b] = BLACK;
		}
	}

}
void displaysnakeandfood()//显示蛇的身体以及食物
{
	unsigned char a;

	displayinit();
	if(game_star!=0&game_star!=6)
	{ 
		for (a = snake_len; a > 0; a--)
		{
			if (a == snake_len)
			{
				RGB_Buffer[snake[(2 * a) - 2] - 1][8 - snake[(2 * a) - 1]] = BLUE;
			}
			else
			{
				RGB_Buffer[snake[(2 * a) - 2] - 1][8 - snake[(2 * a) - 1]] = CYAN;

			}

		}
	}
	for (a = 0; a < 10; a++)
	{
		if (food_type[a] == 0)
		{
			if(food_xy[2 * a]!=0| food_xy[(2 * a) + 1] !=0)
			{
				RGB_Buffer[food_xy[2 * a] - 1][8 - (food_xy[(2 * a) + 1])] = GREEN;
			}

		}
		if (food_type[a] == 1)
		{
			if (food_xy[2 * a] != 0 | food_xy[(2 * a) + 1] != 0)
			{
				RGB_Buffer[food_xy[2 * a] - 1][8 - (food_xy[(2 * a) + 1])] = VIOLET;
			}
		}
		if (food_type[a] == 2)
		{
			if (food_xy[2 * a] != 0 | food_xy[(2 * a) + 1] != 0)
			{
				RGB_Buffer[food_xy[2 * a] - 1][8 - (food_xy[(2 * a) + 1])] = RED;
			}
		}
	}

}
void displaydata()//显示lcd的数据
{
	if (hh < 10)
	{
		sprintf((char *)strL, "0%d", hh);
		strToLCD(strL, 0x00);
	}
	else
	{
		sprintf((char *)strL, "%d", hh);
		strToLCD(strL, 0x00);
	}
	if (mm < 10)
	{
		sprintf((char *)strL, ":0%d", mm);
		strToLCD(strL, 0x02);
	}
	else
	{
		sprintf((char *)strL, ":%d", mm);
		strToLCD(strL, 0x02);
	}
	if(ss<10)
	{ 
		sprintf((char *)strL, ":0%d", ss);
		strToLCD(strL, 0x05);
	}
	else 
	{
		sprintf((char *)strL, ":%d", ss);
		strToLCD(strL, 0x05);
	}


	if(game_star==0|game_star==1)
	{ 
	if (good_tests < 10)
	{
		sprintf((char *)strL, "00");
		strToLCD(strL, 0x10);
		sprintf((char *)strL, "%d", good_tests);
		strToLCD(strL, 0x12);
	}
	if (good_tests > 10)
	{
		sprintf((char *)strL, "0");
		strToLCD(strL, 0x10);
		sprintf((char *)strL, "%d", good_tests);
		strToLCD(strL, 0x11);
	}
	sprintf((char *)strL, "h");
	strToLCD(strL, 0x13);
	if (bad_tests < 10)
	{
		sprintf((char *)strL, "00");
		strToLCD(strL, 0x14);
		sprintf((char *)strL, "%d", bad_tests);
		strToLCD(strL, 0x16);
	}
	if (bad_tests > 10)
	{
		sprintf((char *)strL, "0");
		strToLCD(strL, 0x14);
		sprintf((char *)strL, "%d", bad_tests);
		strToLCD(strL, 0x15);
	}
	sprintf((char *)strL, "i");
	strToLCD(strL, 0x17);
	}
	if (game_star == 2 | game_star == 3)
	{

			sprintf((char *)strL, "   ");
			strToLCD(strL, 0x10);
			sprintf((char *)strL, "%d", all);
			strToLCD(strL, 0x10);

		if (game_star == 2)
		{
			sprintf((char *)strL, "h GAME OVER");
			strToLCD(strL, 0x13);
		}
		if (game_star == 3)
		{
			sprintf((char *)strL, "h DEADLOCK");
			strToLCD(strL, 0x13);
		}
	}
}
void meuo()//显示lcd的数据2  显示菜单 分数等
{
	if (game_star == 4)
	{
		sprintf((char *)strL, "through wall ?");
		strToLCD(strL, 0x00);
		if (through == 0)
		{
			sprintf((char *)strL, "NO ");
			strToLCD(strL, 0x10);
		}
		if (through == 1)
		{
			sprintf((char *)strL, "YES");
			strToLCD(strL, 0x10);
		}
	}
	if (game_star == 5)
	{
		sprintf((char *)strL, "speed");
		strToLCD(strL, 0x00);
		sprintf((char *)strL, "%d",speedflag/10);
		strToLCD(strL, 0x10);
		sprintf((char *)strL, ".%d", speedflag % 10);
		strToLCD(strL, 0x11);
	}
	if (game_star == 6)
	{
		sprintf((char *)strL, "1.%d",tests[0]);
		strToLCD(strL, 0x00);
		sprintf((char *)strL, "2.%d", tests[1]);
		strToLCD(strL, 0x08);
		sprintf((char *)strL, "1.%d", tests[2]);
		strToLCD(strL, 0x10);
		sprintf((char *)strL, "1.%d", tests[3]);
		strToLCD(strL, 0x18);
	}
}
/*一些判断子函数*/
char fand_food(unsigned char x,unsigned char y)  //判断食物是否存在 是则返回食物存在于数组的位置  否则返回10
{
	unsigned char a;
	for (a = 0; a < 10; a++)
	{
		if (x == food_xy[2 * a] & y == food_xy[(2 * a) + 1])
		{
			return a;
		}
	}
	return 10;
}
char snake_bady(unsigned char x, unsigned char y, unsigned char mod)//身体判断 两个模式 包括蛇头 与不包括蛇头
{
	unsigned char a, b = 0;
	if (mod == 0)
	{
		for (a = 0; a

最后修改 2019-06-27 14:45:17
0
893
用户评论
一起折腾