【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
【STM32单片机】贪吃蛇游戏设计_第1张图片


联系作者

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

你可能感兴趣的:(单片机,stm32,游戏,STM32最小系统,贪吃蛇游戏)