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

713 阅读2分钟

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

完整的项目链接:
github.com/linxinlonin…

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

自动运行函数满足条件:

  • 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);
}

(短暂延时,避免改变过快)