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

这篇具有很好参考价值的文章主要介绍了【STM32单片机】贪吃蛇游戏设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、主要功能

系统运行后,TFTLCD触摸屏显示游戏界面,通过按键任意键进入游戏界面, 然后通过按键KEY_UP、KEY1、KEY2和KEY0键控住上下左右方向。 每当蛇吃到3个食物,速度就会提升一个等级,并且显示得分和等级,最高位5级。当游戏结束后可按任意键重新回到主界面开始。


二、硬件资源

1.硬件准备

项目所需要的硬件资源如下:
①STM32F103或STM32F407开发板1个
②TFTLCD液晶模块1个
③USB线1条(用于供电和程序下载)
④杜邦线若干

2.硬件连接

	TFTLCD触摸屏模块-->单片机IO
	  
	  按键模块-->单片机IO
	  KEY_UP-->PA0
	  KEY0-->PE4
	  KEY1-->PE3
	  KEY2-->PE2

四、软件设计

1.软件结构

stm32 贪吃蛇,【STM32单片机】趣味项目设计,单片机,stm32,游戏

2.主要代码

主要代码如下:

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


//游戏初始化
void GameInit()
{
	u16 color=FRONT_COLOR;
	
	LCD_ShowPicture(0,(tftlcd_data.height-240)/2,320,240,(u8 *)gImage_picture);
	LCD_ShowFontHZ((tftlcd_data.width-7*32)/2,20,"贪吃蛇游戏设计");
	while(1)
	{
		//如果有键按下则退出,重新开始
		if(KEY_Scan(0)!=0)
		{
			LCD_Clear(BACK_COLOR);
			break;
		}
	}
	
	//绘制窗口
	window.color=BLACK;
	window.x=(tftlcd_data.width-WIN_WIDTH)/2;
	window.y=(tftlcd_data.height-WIN_HEIGHT)/2-30;
	
	//初始化蛇
	snake.num=3;
	snake.dir=RIGHT;
	snake.score=0;
	snake.size=10;
	snake.level=1;
	snake.coor[2].x=window.x+snake.size;snake.coor[2].y=window.y+snake.size;
	snake.coor[1].x=window.x+snake.size+snake.size;snake.coor[1].y=window.y+snake.size;
	snake.coor[0].x=window.x+snake.size+2*snake.size;snake.coor[0].y=window.y+snake.size;
	
	//初始化食物
	food.fd.x=window.x+rand()%(WIN_WIDTH/snake.size)*snake.size;
	food.fd.y=window.y+rand()%(WIN_HEIGHT/snake.size)*snake.size;
	food.flag=1;
	food.color=RED;
	
	//得分显示
	FRONT_COLOR=BLACK;
	LCD_ShowFontHZ((tftlcd_data.width-7*32)/2,20,"贪吃蛇游戏设计");
	FRONT_COLOR=color;
	LCD_ShowString(window.x,window.y+WIN_HEIGHT+10,tftlcd_data.width,30,24,"Score:");
	LCD_ShowString(window.x,window.y+WIN_HEIGHT+50,tftlcd_data.width,30,24,"Level:");
	

	//初始化速度
	gspeed=SNAKE_SPEED;
	gcnt=0;
}

//游戏绘图
void GameDraw()
{
	u16 i=0;
	//绘制窗口
	LCD_DrawRectangle_Color(window.x,window.y,window.x+WIN_WIDTH,window.y+WIN_HEIGHT,window.color);
	
	//画蛇
	for(i=0;i<snake.num;i++)
	{
		LCD_Fill(snake.coor[i].x,snake.coor[i].y,snake.coor[i].x+snake.size,snake.coor[i].y+snake.size,YELLOW);
		LCD_DrawRectangle_Color(snake.coor[i].x,snake.coor[i].y,snake.coor[i].x+snake.size,snake.coor[i].y+snake.size,BLACK);
	}
	
	//画食物
	if(food.flag==1)
	{
		LCD_Fill(food.fd.x,food.fd.y,food.fd.x+snake.size,food.fd.y+snake.size,food.color);
	}
	
	//显示分数
	LCD_ShowxNum(window.x+6*12,window.y+WIN_HEIGHT+10,snake.score,5,24,0);
	//显示等级
	LCD_ShowxNum(window.x+6*12,window.y+WIN_HEIGHT+50,snake.level,1,24,0);
}

//蛇身移动
void SnakeMove()
{
	u16 i=0;
	
	//清除上次的蛇身末尾节
	LCD_Fill(snake.coor[snake.num-1].x,snake.coor[snake.num-1].y,snake.coor[snake.num-1].x+snake.size,snake.coor[snake.num-1].y+snake.size,BACK_COLOR);
		
	//重新获取蛇身移动一步位置
	for(i=snake.num-1;i>0;i--)
	{
		snake.coor[i].x=snake.coor[i-1].x;
		snake.coor[i].y=snake.coor[i-1].y;
	}
	switch(snake.dir)
	{
		case UP:
			snake.coor[0].y-=snake.size;
			break;
		case DOWN:
			snake.coor[0].y+=snake.size;
			break;
		case LEFT:
			snake.coor[0].x-=snake.size;
			break;
		case RIGHT:
			snake.coor[0].x+=snake.size;
			break;
	}
}

//蜂鸣器提示
void beep_alarm(void)
{
	BEEP=1;
	delay_ms(50);
	BEEP=0;
}

//游戏结束
void game_over()
{
	beep_alarm();
	//游戏结束显示
	LCD_ShowFontHZ((tftlcd_data.width-32*4)/2,(tftlcd_data.height-29)/2,"游戏结束");
	LCD_ShowString((tftlcd_data.width-8*20)/2,(tftlcd_data.height-29)/2+30,tftlcd_data.width,tftlcd_data.height,16,"Press KEY ReStart...");
	while(1)
	{
		//如果有键按下则退出,重新开始
		if(KEY_Scan(0)!=0)
		{
			LCD_Clear(BACK_COLOR);
			GameInit();
			break;
		}
	}
}

//游戏结束判断
void DontEatSelf()
{
	u16 i=0;
	//判断是否碰撞到身体,前提是蛇身要超过3节
	for(i=4;i<snake.num;i++)
	{
		if(snake.coor[0].x==snake.coor[i].x && snake.coor[0].y==snake.coor[i].y) 
		{
			game_over();//游戏结束
		}
	}
	//判断是否碰撞到边界区
	if(snake.coor[0].x>=window.x+WIN_WIDTH || snake.coor[0].x<=window.x-snake.size ||
		snake.coor[0].y>=window.y+WIN_HEIGHT || snake.coor[0].y<=window.y-snake.size)
	{
		game_over();//游戏结束
	}
}

//应用程序
void app_demo(void)
{
	BEEP_Init();
	KEY_Init();
	LED_Init();
	My_EXTI_Init();
	TFTLCD_Init();
	TP_Init();
	
	GameInit();//游戏参数初始化
	
	while(1)
	{
		SnakeMove();//方向控制
		GameDraw();//游戏绘制
		EatFood();//蛇吃食物
		DontEatSelf();//检测是否碰撞
		delay_ms(gspeed);//蛇移动速度
		//速度控制,当每吃到3个食物,速度增加
		if(gcnt>=3)
		{
			gcnt=0;
			snake.level++;
			gspeed-=100;
			if(gspeed<100)
			{
				gspeed=50;
				snake.level=5;
			}	
		}
	}
}




五、实验现象

B站演示视频:https://space.bilibili.com/444388619

stm32 贪吃蛇,【STM32单片机】趣味项目设计,单片机,stm32,游戏
stm32 贪吃蛇,【STM32单片机】趣味项目设计,单片机,stm32,游戏
stm32 贪吃蛇,【STM32单片机】趣味项目设计,单片机,stm32,游戏

联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。文章来源地址https://www.toymoban.com/news/detail-516452.html

到了这里,关于【STM32单片机】贪吃蛇游戏设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32单片机的智能交通灯设计

    一.硬件方案        stm32单片机的智能交通灯主要由stm32单片机核心板+74HC245芯片+数码管+LED指示灯+按键等构成。硬件框图如下: 二.设计功能 (1)本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示。 (2)按键可以控制

    2024年02月08日
    浏览(44)
  • 单片机毕业设计 stm32火灾报警系统

    Hi,大家好,学长今天向大家介绍一个 单片机项目 基于单片机的火灾报警系统设计与实现 大家可用于 课程设计 或 毕业设计 选题指导,项目分享: https://gitee.com/yaa-dc/warehouse-1/blob/master/iot/README.md 火灾是指在时间或空间上失去控制的燃烧所造成的灾害。在各种灾害中,火灾是

    2024年02月03日
    浏览(56)
  • 基于STM32单片机的智能视力保护台灯设计

    智能台灯以专门感应人体红外信号的红外传感器为基础,这意味着仅当有人的时候,红外传感器才输出一个信号,经放大处理后达到单片机的输入门限电压,单片机开始运行,台灯自动点亮。当人离开的时候,单片机控制台灯自动关闭,以达到节约用电的目的。此外,通过功

    2024年02月12日
    浏览(63)
  • 单片机毕业设计 stm32宠物自动喂食系统

    Hi,大家好,学长今天向大家介绍一个 单片机项目 基于stm32的宠物自动喂食系统 大家可用于 课程设计 或 毕业设计 为了解决主人不在家而无法正常对宠物进行饮水喂食, 导致宠物身体不健康这一情况, 为此学长设计了宠物自动饮水喂食器。 宠物自动饮水喂食器主要由单片

    2024年02月03日
    浏览(43)
  • 【Proteus仿真】【STM32单片机】环境监测系统设计

    本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、蜂鸣器、按键模块、DHT11温湿度传感器、继电器加热祛湿加湿模块等。 主要功能: 系统运行后,LCD1602显示传感器检测的温度、湿度及有害气体浓度值;若按下K3键进入阈值设置模式,默认以温度下限开始位置闪烁

    2024年02月01日
    浏览(104)
  • 毕业设计 单片机心率检测器设计与实现 - stm32

    Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于STM32的心率检测器的设计与实现 大家可用于 课程设计 或 毕业设计 主控:STM32F103C8T6 MAX30102传感器 OLED屏幕:用于显示实时心率波形 未测试时的状态:心率波形显为平稳直线,即0 将手指放上进行心率测试: 还可以把

    2024年02月07日
    浏览(45)
  • 单片机设计基于STM32的心率检测仪设计与实现

      现代科学的发展,导致越来越多人开始重视自己的身体健康,他们往往会想在能力之余使用健身运动等方式来锻炼自身。你会发现,在健身房,健身达人或者是教练都会叮嘱新手去关注自己的心率节奏。一般来说,人的激烈的锻炼会造成心脏血压的上升,心率变化从而加

    2024年02月04日
    浏览(62)
  • 单片机毕业设计 stm32发送短信消息(GMS模块)

    Hi,大家好,学长今天向大家介绍如何使用GMS模块,达到单片机发送短信的效果,应用场景非常广泛 ** 单片机发送短信消息(GMS模块)** 大家可用于 课程设计 或 毕业设计 GSM模块使用上海SIMcom公司的SIM900高精度无线GSM/GPRS完全四频芯片,使用SMT封装且融 合了高性能的ARM926EJ

    2024年02月07日
    浏览(53)
  • 【Proteus仿真】【STM32单片机】火灾监测报警系统设计

    本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、按键模块、LED和蜂鸣器、继电器直流电机模块、DS18B20温度传感器、MQ2烟雾传感器等。 主要功能: 系统运行后,LCD1602显示温度和MQ2烟雾传感器检测的温度及烟雾浓度;当检测温度或烟雾浓度高于设置的温度或烟雾

    2024年02月03日
    浏览(57)
  • 【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

    本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、按键模块、HC05蓝牙、DHT11温湿度、PCF8591 ADC模块、光线传感器、28BYJ48步进电机等。 主要功能: 系统运行后,LCD1602显示温湿度和光线强度值和系统模式状态。 系统模式以自动模式运行,当按下K4键切换为手动模式

    2023年04月24日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包