利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

贪吃蛇是自己不断朝着前运动的,所以需要封装一个令贪吃蛇自己朝前运动的函数

自动运行函数满足条件:

  • 1.控制贪吃蛇不断运动
  • 2.运动方向发生改变时,蛇头运动方向立马发生改变,蛇身其他led灯运动方向仍保持,待运动到蛇头未改变时的位置,方可改变运动方向
  • 3.改变运动方向后,贪吃蛇朝此方向向前

虽然看上去十分混乱,一头雾水。

1.但我们先拆分出蛇头的坐标方位进行分析,起初我们自定义的蛇身长度为length(初始化点亮了三盏灯,length为3),贪吃蛇中led灯坐标都在x[32],y[32]数组里,那么蛇头的坐标对应着就是x[length-1],y[length-1].

2.我们假设蛇头要向左移动一位,起初蛇头位置为(2,3),移动后就是(1,3),x-1,y-0;

以此类推,向右就是x+1,y;向上就是x,y+1;向下就是x,y-1;

3.将改变的数值用flag_x,flag_y表示,那么例如蛇头向左一位则就是

flag_x=1, flag_y=0,

x[[length-1]+flag_x], y[[length-1]+flag_y]

通过改变flag_x和flag_y的值,就可实现上下左右的移动。

4.蛇头的运动有了,蛇身的运动怎么解决,其实十分简单,将蛇身的坐标点都换成它上一个点的坐标即可

例如蛇头改变方向了,蛇头的下一led此时坐标改为蛇头为发生改变时的坐标,以此类推,往返操作,即可达到运动的目的

封装自动运动的函数

void auto_move(void)
{
unsigned char i;
for(i=0;i<(length-1);i++)
{
x[i]=x[i+1];
y[i]=y[i+1];
}
x[length-1]+=flag_x;
y[length-1]+=flag_y;
if(x[length-1]>8)
x[length-1] = 1;
else if(x[length-1]<1)
x[length-1] = 8;
if(y[length-1]>8)
y[length-1] = 1;
else if(y[length-1]<1)
y[length-1] = 8;
delay(500);
}

(短暂延时,避免改变过快)
图片我就不再一一上传了,想看图片请移步https://linxinloningg.space/archives/%E5%88%A9%E7%94%A851%E5%8D%95%E7%89%87%E6%9C%BAhc595%E8%8A%AF%E7%89%87%E9%85%8D%E5%90%88%E5%9C%A8led%E7%82%B9%E9%98%B5%E4%B8%8A%E7%8E%A9%E8%B4%AA%E5%90%83%E8%9B%87%E7%AC%AC%E4%B8%80%E7%AF%87%E6%98%BE%E7%A4%BA%E8%B4%AA%E5%90%83%E8%9B%87
请大家多多点赞,你们的点赞对我很重要,是我创作的动力

你可能感兴趣的:(linus)