基于STM32战舰V3开发板的贪吃蛇游戏

基于STM32战舰V3开发板的贪吃蛇游戏


完整工程资源链接:https://download.csdn.net/download/qq_41676952/11572132

本文是基于STM32战舰V3开发板平台的贪吃蛇游戏,主要用到了开发板上的ATK-HC05蓝牙模块,按键模块,LCD液晶显示屏模块;在程序设计方面主要是对贪吃蛇游戏进行程序设计,深入理解贪吃蛇游戏的设计思想以及开发板与手机蓝牙的信息交互,最终通过软件与硬件的配合实现STM32战舰V3开发板平台的贪吃蛇游戏。

  1. .主要用到的软件资源有:串口3、定时器3
  2. 主要用到的硬件资源有:按键4个、液晶显示屏、ATK-HC05蓝牙模块
  3. 主循环中控制游戏进程与显示屏现实,通过定时器中断服务程序和串口中断服务程序,协调手机与蓝牙模块连接向开发板发送的控制数据与按键检测获取控制数据,结合主循环的游戏进程以按键和手机两种方式实现控制游戏的进行。

最终效果图:
进入界面

游戏界面
操作界面
可利用按键KEY_UP、KEY0、KEY1、 KEY2分别代表上、左、下、右或者手机端控制蛇的走位

基本思路:蛇每吃一个食物蛇身子就增加一格,用WASD控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推
附加功能:包含等级选择、暂停/继续、分数制、关卡的选择,难度的设置等

地图的创建:创建地图,游戏开始前先建立好地图, 将外围一圈设置为城墙。

void show_map(void)
{
	LCD_Fill(x1,y1,x2,y1+10,BLUE);	
	LCD_Fill(x1,y1,x1+10,y3,BLUE);		
	LCD_Fill(x4-10,y2,x4,y4,BLUE);		
	LCD_Fill(x3,y4-10,x4,y4,BLUE);
	LCD_Fill(210,700,480,700,WHITE);
}

食物的产生
利用随机函数(rand())产生随机食物的坐标,该坐标的值不能与墙重合,不能与蛇身重合。食物我这里用的是红色方块表示。

void Creat_food(void)
{
	rand();      //产生一个30到50的随机数
	if(Food_flag==1)
	{
		Food_flag=0;
		Food_x= (rand()%45+1)*10;      //产生一个1到45的随机数
		Food_y= (rand()%55+1)*10;      //产生一个1到55的随机数
	}
	LCD_Fill(Food_x,Food_y,Food_x+10,Food_y+10,RED);
}

构造一条蛇
使用两个unsigned char类型的二维数组。 SNACK_x[100] SNACK_y[100]

SNACK_x[100] SNACK_y[100]
SNACK_x[0]=90,SNACK_y[0]=50;
SNACK_x[1]=80,SNACK_y[1]=50;
SNACK_x[2]=70,SNACK_y[2]=50;
for(i=0;i<3;i++)//初始化蛇身长为SNACK_L=3,初始化蛇的位置:
{
LCD_Fill(SNACK_x[i],SNACK_y[i],SNACK_x[i]+10,SNACK_y[i]+10,RED);
}

利用按键KEY_UP、KEY0、KEY1、 KEY2分别代表上、左、下、右或者手机端控制蛇的走位,以及当蛇每走一步就利用清屏,重新打印蛇身,模拟蛇的移动。

#define LEFT 1
#define RIGHT 2
#define UP 3
#define DOWN 4
for(i=SNACK_L-1;i>0;i--)//记录蛇身
{
		SNACK_x[i]=SNACK_x[i-1];
		SNACK_y[i]=SNACK_y[i-1];
}
//计算蛇头位置
if(DIR==RIGHT)		SNACK_x[0]=SNACK_x[0]+10;
if(DIR==LEFT)		SNACK_x[0]=SNACK_x[0]-10;
if(DIR==UP)			SNACK_y[0]=SNACK_y[0]-10;
if(DIR==DOWN)		SNACK_y[0]=SNACK_y[0]+10;

游戏结束
当蛇撞墙, 以及咬到自己的身体时候游戏结束.

if(SNACK_x[0]==0||SNACK_x[0]==470||SNACK_y[0]==0||SNACK_y[0]==590)//是否撞墙
	{
		GAME_state=2;//GAME OVER
		delay_ms(500);
		delay_ms(500);
		LCD_Clear(WHITE); 
		return;
	}
for(i=1;i<SNACK_L;i++)//判断是否咬到蛇身
	{
		if(SNACK_x[0]==SNACK_x[i] && SNACK_y[0]==SNACK_y[i])
		{
			GAME_state=2;//GAME OVER
			delay_ms(500);
			delay_ms(500);
			LCD_Clear(WHITE); 
		}
	}

完整工程资源链接https://download.csdn.net/download/qq_41676952/11572132

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值