【STM32单片机】贪吃蛇游戏设计


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用8*8LED点阵模块、矩阵按键、蜂鸣器模块等。

主要功能:
系统运行后,贪吃蛇游戏开始运行,默认蛇身为2节,
可通过如下按键控制贪吃蛇方向,每当吃掉3个食物,则游戏
速度加快,直达以最快速度运行;贪吃蛇游戏默认未设置墙壁,
可穿墙,当贪吃蛇头碰撞身体时,游戏结束,D1指示灯亮。
当按下开始/暂停键时,游戏可重新开始,D1灯灭。
当游戏过程中需要暂停时,可按下开始/暂停键,进入暂停状态,
当再次按下开始/暂停键时,游戏恢复。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//贪吃蛇方向控制
void snake_dir_control(void)
{
	u8 i=0;
	
	//生成食物
	if(sys_ctrl.food.flag==0)
	{
		while(1)
		{
			sys_ctrl.food.x=rand()%8;//产生0-7随机数
			sys_ctrl.food.y=rand()%8;//产生0-7随机数
			for(i=0;i<sys_ctrl.body.len;i++)
			{
				//食物坐标与蛇身冲突
				if(sys_ctrl.food.x==sys_ctrl.body.x[i] && sys_ctrl.food.y==sys_ctrl.body.y[i])	
					break;	
			}
			//食物坐标有效
			if(i==sys_ctrl.body.len)
			{
				sys_ctrl.food.flag=1;
				break;	
			}
		}
//		leddz_draw_dot(sys_ctrl.food.x,sys_ctrl.food.y,1);
	}
	if(sys_ctrl.food.flag)
		leddz_draw_dot(sys_ctrl.food.x,sys_ctrl.food.y,1);
	//清除上次的蛇身末尾节
	leddz_draw_dot(sys_ctrl.body.x[sys_ctrl.body.len-1],sys_ctrl.body.y[sys_ctrl.body.len-1],0);
	
	//重新获取蛇身移动一步位置
	for(i=sys_ctrl.body.len-1;i>0;i--)
	{
		sys_ctrl.body.x[i]=sys_ctrl.body.x[i-1];
		sys_ctrl.body.y[i]=sys_ctrl.body.y[i-1];	
	}
	//方向选择
	switch(sys_ctrl.dir)
	{
		case DIR_RIGHT: sys_ctrl.body.x[0]+=1;break;
		case DIR_LEFT: sys_ctrl.body.x[0]-=1;break;
		case DIR_UP: sys_ctrl.body.y[0]-=1;break;
		case DIR_DOWN: sys_ctrl.body.y[0]+=1;break;
	}
	//重绘蛇身
	for(i=0;i<sys_ctrl.body.len;i++)
	{
		//判断蛇头是否超限
		if(sys_ctrl.body.x[0]==LEDDZ_WIDTH)sys_ctrl.body.x[0]=0;
		else if(sys_ctrl.body.x[0]<0)sys_ctrl.body.x[0]=LEDDZ_WIDTH-1;
		if(sys_ctrl.body.y[0]==LEDDZ_HEIGHT)sys_ctrl.body.y[0]=0;
		else if(sys_ctrl.body.y[0]<0)sys_ctrl.body.y[0]=LEDDZ_HEIGHT-1;
		leddz_draw_dot(sys_ctrl.body.x[i],sys_ctrl.body.y[i],1);	
	}
	//判断贪吃蛇是否吃到食物
	if(sys_ctrl.body.x[0]==sys_ctrl.food.x && sys_ctrl.body.y[0]==sys_ctrl.food.y)
	{
//		leddz_draw_dot(sys_ctrl.food.x,sys_ctrl.food.y,0);
		if(sys_ctrl.body.len<=SNAKE_LEN_MAX)//最大蛇身长度
			sys_ctrl.body.len++;
		sys_ctrl.score+=GET_SCORE_RATIO;
		sys_ctrl.food.flag=0;//重新生成食物
		if(sys_ctrl.score%SCORE_RATIO==0)
		{
			sys_ctrl.speed-=SPEED_RATIO;
			if(sys_ctrl.speed<=SPEED_RATIO)sys_ctrl.speed=SPEED_MAX;	
		}
								
	}
	//判断是否碰撞到身体,前提是蛇身要超过3节
	for(i=3;i<sys_ctrl.body.len;i++)
	{
		if(sys_ctrl.body.x[0]==sys_ctrl.body.x[i] && sys_ctrl.body.y[0]==sys_ctrl.body.y[i])
		{
			sys_ctrl.status=3;//游戏停止状态
			game_over();//游戏结束
		}
	}
	//暂停时等待开始
	while(sys_ctrl.status==1);				
}


//应用控制系统
void app_sys_ctrl_demo(void)
{
	LED_Init();
	USART1_Init(115200);
	KEY_Matrix_Init();
	LEDDZ_Init();
	snake_init();//贪吃蛇参数初始化
	TIM3_Init(20,36000-1);//定时10ms
	TIM4_Init(20,36000-1);//定时10ms
	TIM_Cmd(TIM3,ENABLE);//打开定时器
	TIM_Cmd(TIM4,ENABLE);//打开定时器
	
	while(1)
	{
		if(sys_ctrl.flag)//运行
		{
			sys_ctrl.flag=0;//清除
			snake_dir_control();//贪吃蛇方向控制		
		}	
	}
}





三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于STM32贪吃蛇游戏设计如下: 首先,我们需要连接一个液晶显示器和一组按键STM32单片机上,用于显示游戏画面和控制贪吃蛇的移动方向。 其次,设计一个游戏循环,在每次循环中更新贪吃蛇的位置和状态,并根据按键输入改变贪吃蛇的移动方向。游戏区域可以由一个二维数组表示,每个元素代表一个像素点的状态,可以是空白、贪吃蛇的身体、食物或墙壁。 在每次循环中,首先检测按键输入,并根据输入改变贪吃蛇的移动方向。然后根据贪吃蛇当前的移动方向更新贪吃蛇的位置,如果贪吃蛇的头部碰到身体、墙壁或游戏界限,则游戏结束。如果贪吃蛇的头部与食物重合,则贪吃蛇变长,分数增加,并生成新的食物。 在游戏的初始化阶段,需要设置贪吃蛇的初始位置和长度,生成食物,并将游戏区域显示在液晶显示器上。 此外,还可以加入一些特殊道具或障碍物,增加游戏的难度和趣味性。 整个游戏的逻辑可以在STM32的开发环境中编写和调试,确保游戏的正常运行和稳定性。同时,为了提高游戏性能,可以利用STM32的硬件加速功能,如DMA控制液晶显示和定时器控制游戏循环。 综上所述,基于STM32贪吃蛇游戏设计包括液晶显示器、按键输入、游戏循环、贪吃蛇移动和碰撞检测、食物生成、道具/障碍物设置等核心功能。通过合理的设计和调试,可以实现一个完整且具有娱乐性的贪吃蛇游戏

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值