文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用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设计,视频分享,技术交流。