当前位置: 首页 > article >正文

【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设计,视频分享,技术交流。


http://www.kler.cn/a/145906.html

相关文章:

  • AI 新动态:技术突破与应用拓展
  • .Net WebApi 中的Token参数校验
  • SDL2:PC端编译使用 -- SDL2多媒体库使用音频实例
  • 基于python+Django+mysql鲜花水果销售商城网站系统设计与实现
  • OpenCV相机标定与3D重建(63)校正图像的畸变函数undistort()的使用
  • (7)(7.2) 围栏
  • 【算法】装备合成(二分)
  • 【UCAS自然语言处理作业二】训练FFN, RNN, Attention机制的语言模型,并计算测试集上的PPL
  • 电子学会C/C++编程等级考试2021年09月(三级)真题解析
  • redisserver一闪而过 redis闪退解决版本
  • 深信服超融合一体机提示:内存ECC
  • Echarts title标题配置项的使用 更改颜色 副标题
  • 常见树种(贵州省):021冬青、连香树、白辛树、香合欢、云贵鹅耳枥、肥牛树、杜英、格木、黄连木、圆果化香树、南天竹
  • 基于51单片机直流电机PWM控制设计
  • linux环境下对mysql操作
  • FilterChain攻击解析及利用
  • ATK-ESP8266 WIFI模块串口通信通用实现方案
  • mac VScode 添加PHP debug
  • 在 Ubuntu 上安装最新版的 Calibre
  • ElasticSearch之禁用交换分区
  • 数据结构 / 顺序表的遍历
  • 云匣子 FastJson反序列化RCE漏洞复现
  • 京东数据分析(京东大数据):2023年10月京东手机行业品牌销售排行榜
  • 初学vue3与ts:setup与setup()下的数据写法
  • Blender快捷键总结
  • vs2015如何远程启动程序来进行调试