Arduino点阵屏实现贪吃蛇游戏

Arduino 少儿编程 1544浏览 0评论
Arduino点阵屏实现贪吃蛇游戏
Arduino贪吃蛇

作者:Saddam
翻译:Tony
原文地址:https://circuitdigest.com/microcontroller-projects/Arduino-snake-game-using-8×8-led-matrix

自从手机问世以来,贪吃蛇游戏就非常受欢迎。最初它是从黑白屏手机上而来,很快就变得非常有名。随着手机的发展,该游戏也发生了很大的变化,现在也可在彩屏版本上使用。

贪吃蛇游戏也已成为电子爱好者和学生非常流行的DIY项目。今天我们将演示Arduino贪吃蛇的基本功能,同时使其保持简单。

使用组件

  • Arduino UNO

  • 8x8LED点阵屏

  • 移位寄存器74HC595

  • LCD1602

  • 1K电位器

  • 按键开关

  • 连接线

  • 面包板

  • 电源

操作说明

贪吃蛇游戏实现起来稍微复杂,但在本教程中,我们帮你对其做了简化。为了完成这个项目,我们使用了8×8红色点阵来显示蛇及其食物,使用LCD602显示得分,使用五个按键控制方向和开始游戏,最后通过一块Arduino UNO来控制整个流程。如下给出8×8点阵的引脚图以及制作好的硬件:

Arduino点阵屏实现贪吃蛇游戏
点阵引脚图
Arduino点阵屏实现贪吃蛇游戏
实物图

当上电后,首先在液晶屏上显示欢迎消息,然后显示”Press Start To Play”提示。然后LCD将分数显示为零,点阵上显示两个点表示蛇,一个点表示食物。

现在,用户需要按下中间按键开始游戏,并且默认情况下,蛇开始向上移动。然后,用户需要通过按中间按键周围的“方向键”来控制蛇的方向。在这里,我们使用了五个按键,即向左键,向右键,向上键,向下键和开始键。每当蛇到达食物点吃东西时,分数每次增加5,蛇的长度每次增加1个点,蛇的速度也比以前快。每当蛇撞到任何墙壁或到达LED矩阵的边界时游戏结束。然后,用户需要按开始键再次开始游戏。

Arduino点阵屏实现贪吃蛇游戏
系统图解

电路说明

贪吃蛇电路并不复杂。在这里,我们通过使用移位寄存器74HC595连接点阵屏。使用两个移位寄存器,一个用于驱动列,另一个用于驱动行。列移位寄存器和行移位寄存器[SH,ST]这两个寄存器的控制引脚分别连接到Arduino的14和16引脚。列移位寄存器和行移位寄存器的DS引脚连接到Arduino的15和17引脚。用于开始游戏的开始按键连接在3号引脚上,左方向按钮插在4号引脚上,右方向按钮插在6号引脚上,上方向按钮在引脚2上,下方向按钮插在引脚5上。LCD1602的RS和EN引脚连接到Arduino的13和12。RW引脚接地。数据引脚d4-d7连接到Arduino的11、10、9、8引脚。其余连接参照如下电路图。

Arduino点阵屏实现贪吃蛇游戏
电路原理图

编程说明

要编写Arduino贪吃蛇游戏代码,首先包含LCD库头文件并定义LCD引脚,然后是方向按键和移位寄存器的相关引脚。

#include<LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);

#define ds_col 15
#define sh_col 16
#define st_col 14
#define ds_row 17

#define start 3
#define up 2
#define down 5
#define left 4
#define right 6

然后,我们初始化程序中使用到的功能。在setup函数中,我们初始化LCD,设置IO口方向,上拉相关位并在LCD上显示欢迎消息。

void setup()
{   
    lcd.begin(16,2);
    pinMode(ds_col, OUTPUT);
    pinMode(sh_col, OUTPUT);
    pinMode(st_col, OUTPUT);
    pinMode(ds_row, OUTPUT);
    pinMode(start, INPUT);
    ... ....
    .... ....

然后在loop函数中开始游戏。

void show_snake(int temp)
{
 for(int n=0;n<temp;n++)
 {
   int r,c;
  for(int k=0;k<21;k++)
  {
  ... ....
  .... ....

在这里我们使用如下函数从按键读取方向。

void read_button()
{
 if(!digitalRead(left))
 {
   move_r=0;
   move_c!=-1 ? move_c=-1 : move_c=1;
   while(!digitalRead(left));
   ... ....
   .... ....

视频演示

转自公众号:
TonyCode

您必须 登录 才能发表评论!