构建基于MAX7219单片机的小游戏《贪吃蛇》
扫描二维码
随时随地手机看文章
《贪吃蛇》是一款经典的怀旧游戏,也是微控制器必须编写的程序。
采用51单片机最小开发板,由8位自制独立按键控制。单片机芯片为STC89C52RC,晶振为@12.000 mhz。8X8LED点阵屏模块由MAX7219驱动,MAX7219包含一个自动扫描电路。你只需要把要显示的数据发送到芯片寄存器。这是非常容易使用和推荐。
组件需求
•STC89C52RC
•晶体
步骤1:原理分析
1. 检测矩阵键盘键
延迟不能用来消除抖动,因为它会阻塞程序。
使用计时器每20ms调用中断函数中的检测函数(跳过debounce),检测按下了哪个键,判断是短按、长按还是释放,并将相应的键码值保存到一个变量中,然后在主函数中获取键码值来控制游戏运行。在游戏中,短按方向键和长按方向键会改变蛇头的方向,使控制更加准确。
2. 蛇体数据的保存
使用一个字节来保存一个点在蛇身上的位置。十位(1~8)表示列,从左到右依次为1~8列;个位(1~8)表示行,从上到下依次为1~8行。8X8点阵屏幕总共有64个点,因此总共需要保存64个无符号字符变量。可以定义一个一维数组SnakeBody来保存蛇的身体数据。
使用变量SnakeHead保存蛇头对应数据的索引在数组SnakeBody中(范围:0~63)。
使用另一个变量SnakeLength保存蛇的长度。
3. 蛇的运动和展示
点阵屏幕有64个点,一个字节可以控制8个点。要显示的数据总共需要8个字节。定义一个显示缓冲数组DisplayBuffer来保存要显示的数据。在蛇移动后,或者蛇吃了食物产生新的食物后,需要将数据更新到显示缓冲数组DisplayBuffer中,然后将数据写入MAX7219芯片的寄存器中。代码还定义了一个中间缓冲区数组MiddleBuffer(首先将数据更新到MiddleBuffer,然后将MiddleBuffer中的64个0或1数据组合成8个字节)。实际上,您不需要定义这个数组。您可以直接通过AND、OR、shift等操作将数据更新到显示缓冲区数组DisplayBuffer中。同时,保存蛇体数据的数组SnakeBody中的数据也必须同步更新。
4. 检测到蛇头撞在墙上和身体上
撞墙检测:如果移动后的新蛇头在数组SnakeBody中的数据个位数小于1,十位小于1,个位数大于8,十位大于8,则表示它已经撞墙了。游戏结束了。
身体碰撞检测:如果新蛇头的缓存数组中对应位的数据为1,则表示它已经撞击了身体。游戏结束了。
5. 创造真正的随机食物
每次按下一个按钮,定时器0 (TL0)的下八位作为种子,由随机函数rand生成两个随机数,确定点阵屏幕上的一个点,以确定该位置是否为蛇体。如果不是,这是创建的食物的位置。如果是,则在此位置周围搜索,直到找到空位置。
6. 控制蛇头的方向
如上面代码所示,按下按钮后,如果按钮对应的方向与蛇头的运动方向不是相反,则会改变蛇头方向变量direction的值。然而,这有一个问题。如果在下一个移动之前按钮被按多次,游戏可能结束。例如,在下一步行动之前,蛇“右转”之后,如果继续“右转”,就会击中蛇的身体(蛇的第二点,也就是蛇头的下一个点)。
解决方案是定义另一个变量LastDirection来记录最后一次移动的方向。注意,方向的值应该赋给LastDirection,以便在蛇移动后更新,这样可以解决上面的问题。
7. 向上、向下、向左和向右滚动显示
滚动显示函数的输入参数是:数组的第一个地址(即数组名)和偏移量offset。所述数据通过移位、和等操作进行处理,然后写入显示缓存阵列。如果不熟悉的话,建议大家了解一下指针的应用。
步骤2:模块代码
1.定时器0
2. 8个独立按钮
3. 8X8LED点阵屏(MAX7219驱动)
步骤3:效果显示
4 .结论
这个小游戏的关键在于真随机数的生成,蛇数据的保存,蛇体的移动,碰撞检测,按钮检测,LED点阵屏幕的扫描显示,字符的滚动显示,各种标志的使用。
本文编译自hackster.io