# NeoPixels Matrix：Snake Game

3,167

4

1

## Introduction: NeoPixels Matrix：Snake Game

Do you still remember snake game we played on our game box or mobile during our childhood? Today we are going to learn how to make a snake game with 8*8 NeoPixels Matrix. We choose Arduino uno as the control center and Joystick breakout module to control the snake.

Hardware:

3 X Guide Line

Software:

Arduino IDE

## Step 2: Hardware Connection

Connect NeoPixels to pin D2.

"X" on Joystick breakout module connect pin A0 on Arduino UNO board, "Y" connect pin A1, "K" connect pin A2. ## Step 3: Programming

```<span style="color: black; font-family: Arial; font-size: 12pt;">P#include <Adafruit_NeoPixel.h>

#define PIN 2           //Output Pin
#define MAX_LED 64       //Quantity of bead
uint32_t c;
int a = 0 , number;
unsigned char huan = 0, ci = 0;
unsigned char  u = 40; //The font size of word group
unsigned char x = 0;
unsigned char Colour;
unsigned char go[] = {2, 3, 4, 5, 9, 14, 17, 20, 22, 26, 27, 29, 34, 35, 36, 37, 41, 46, 49, 54, 58, 59, 60, 61}; //24
unsigned char light = {
{0, 1, 2, 3, 4, 5, 6, 7},
{15, 14, 13, 12, 11, 10, 9, 8},
{16, 17, 18, 19, 20, 21, 22, 23},
{31, 30, 29, 28, 27, 26, 25, 24},
{32, 33, 34, 35, 36, 37, 38, 39},
{47, 46, 45, 44, 43, 42, 41, 40},
{48, 49, 50, 51, 52, 53, 54, 55},
{63, 62, 61, 60, 59, 58, 57, 56},
} ;
unsigned char character[] =  //Set the word to be sent
{
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 1, 0, 0, 0, 1, 0, 0}, // 0
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}, // 1
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 0, 1, 1, 1, 0, 0},
{0, 1, 0, 1, 0, 1, 0, 0}, // 2
{0, 1, 1, 1, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 0, 1, 0, 1, 0, 0},
{0, 1, 0, 1, 0, 1, 0, 0}, // 3
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0}, // 4
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 1, 1, 0, 1, 0, 0},
{0, 1, 0, 1, 0, 1, 0, 0}, // 5
{0, 1, 0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 1, 1, 1, 1, 0, 0},
{0, 1, 0, 1, 0, 1, 0, 0}, // 6
{0, 1, 0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0}, // 7
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 1, 1, 1, 1, 0, 0},
{0, 1, 0, 1, 0, 1, 0, 0}, // 8
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},

{0, 1, 1, 1, 0, 1, 0, 0},
{0, 1, 0, 1, 0, 1, 0, 0}, // 9
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
};

unsigned char displayscore ;

int speedS = 400;                                                         // Initial speed of snake
int score;                                                              // Game score
int xValue;                                                             // JoyStick-X
int yValue;                                                             // JoyStick-Y
int zValue;                                                             // JoyStick-Z
int FX, FY;                                                             // Coordinate of food
int SX, SY;                                                             // Coordinate of snake head
int KEY, K;
int Enabled;                                                            // Enable to restart game

char sx ;                                                     //Coordinate of snake body
char sy;

void RANDOM() {
A:
FX = random(0, 7);
FY = random(0, 7);

for (int i = 0; i < 3 + score; i++)          //Prevent food display on snake body
{
if ( FX == sx[i] && FY == sy[i])
goto A;
}
}
void myDelay( unsigned int Time) {                             // During the delay period of snake movement, we have to do something like food glitter and read the direction of Joystick

for (int t = 1; t <= Time; t++)
{
joyStick();
delay(1);                                     //Read the direction of Joystick
}
}
void joyStick() {

xValue = analogRead(A0);                             // JoyStick-X   The leftmost value is 0, the rightmost value is 1023, and the middle value is 515.
yValue = analogRead(A1);                             // JoyStick-Y   The bottom value is 0, the top value is 1023, the middle value is 510.

if (yValue > 950 && KEY != 5) {
K = 8;
}
else if (yValue < 50 && KEY != 8) {
K = 5;
}
else if (xValue < 50  && KEY != 6 && K != 0) {       // Before operate Joystic for the first time, you can't move snake to the left direction.
K = 4;
}
else if (xValue > 950 && KEY != 4) {
K = 6;
}
}
// Here you can compare whether the direction of keypad is opposite to the snake move direction. If it is opposite, then give up the keypad.
/***************************************************************************************************************************************************************************************************************/
void gameover() {                                      // Once Gameover program stopped, press the central button to restart the game.
unsigned char value, y;

Colour = random(3 , 18); // Set color.Parameter is R G B, range 0-255.
Colour = random(3, 18);
Colour = random(3, 18);
c = strip.Color(Colour, Colour, Colour);
value = score / 10;
value = value * 4;
y = 0;

for (number = value; number < value + 4; number++)
{
for (unsigned char vertical = 0; vertical < 8; vertical++)
{
displayscore[y][vertical] = character[number][vertical];

}
y++;
}

value = score % 10;
value = value * 4;

for (number = value; number < value + 4; number++)
{
for (unsigned char vertical = 0; vertical < 8; vertical++)
{
displayscore[y][vertical] = character[number][vertical];

}
y++;
}

for (unsigned char horizontal = 0; horizontal < 8; horizontal++)
{
for (unsigned char vertical = 0; vertical < 8; vertical++)
{

if (displayscore[horizontal][vertical] == 1) //Judge whether the light is on.
{
strip.setPixelColor(light[horizontal][vertical],  c);
}
else
strip.setPixelColor(light[horizontal][vertical],  0);

}
}

strip.show();//Send data
delay(5000);
K = 0;                  // Reset Joystick direction
sx = 2;
sx = 1;
sx = 0;
sy = 1;
sy = 1;
sy = 1;               // Reset snake coordinate
score = 0;              // Reset game score
speedS = 400;                                                         // The initial speed of snake

}
void setup() {
Serial.begin(9600);
// Initialize library
strip.begin();
// Send data. Default the color of each point as 0. So every point is not illuminated at the beginning.
strip.show();
K = 0;                  // Reset the direction of Joystick
sx = 2;
sx = 1;
sx = 0;
sy = 1;
sy = 1;
sy = 1;               // Reset snake coordinate
score = 0;              // Reset game score
Colour = random(3 , 18); // Set color.Parameter is R G B, range 0-255.
Colour = random(3, 18);
Colour = random(3, 18);
c = strip.Color(Colour, Colour, Colour); //Green  Red Blue // Set color
for (number = 0; number < 24; number++)
{
strip.setPixelColor(go[number],  c);
}
strip.show();// Send data
delay(2000);
RANDOM();     //Produce food
}
void mobile()
{

KEY = K;                                      //Every movement of snake makes the direction change for once.

if (KEY == 8)                                 // Snake upward movement
{
for (int i = 2 +  score; i > 0; i--)
{
sx[i] = sx[i - 1];
sy[i] = sy[i - 1];
}
sy = sy - 1;
if (sy < 0)                               // Go beyond the border and continue on the other side
sy = 7;
}
else if (KEY == 5)                            // Snake downward movement
{
for (int i = 2 +  score; i > 0; i--)
{
sx[i] = sx[i - 1];
sy[i] = sy[i - 1];
}
sy = sy + 1;
if (sy > 7)                               // Go beyond the border and continue on the other side
sy = 0;
}
else if (KEY == 4)                            // Snake left movement
{
for (int i = 2 +  score; i > 0; i--)
{
sx[i] = sx[i - 1];
sy[i] = sy[i - 1];
}
sx = sx - 1;
if (sx < 0)                               // Go beyond the border and continue on the other side
sx = 7;
}
else if (KEY == 6)                            // Snake right movement
{
for (int i = 2 +  score; i > 0; i--)
{
sx[i] = sx[i - 1];
sy[i] = sy[i - 1];
}
sx = sx + 1;
if (sx > 7)                               // Go beyond the border and continue on the other side
sx = 0;
}
// Move snake body with button
}
void displays()
{
for (number = 0; number < 64; number++)   //Clear the screen
{
strip.setPixelColor(number,  0);
}
strip.show();

Colour = 40; // Set color. Parameter is R G B, range 0-255.
Colour = 0;
Colour = 0;
c = strip.Color(Colour, Colour, Colour); //Green Red Blue    // Set color
x = light[FX][FY];                                              //Display food
strip.setPixelColor(x, c);

Colour = random(3 , 18); // Set color. Parameter is R G B, range 0-255.
Colour = random(3, 18);
Colour = random(3, 18);
c = strip.Color(Colour, Colour, Colour); //Green Red Blue  // Set color

for (int i = 2 +  score; i > 0; i--)                   //Display snake body
{

x = light[sx[i]][sy[i]];
strip.setPixelColor(x,  c);
}

Colour = 0; // Set color. Parameter is R G B, range 0-255.
Colour = 40;
Colour = 0;
c = strip.Color(Colour, Colour, Colour); //Green Red Blue    // Set color
x = light[sx][sy];                                        //Display snake head
strip.setPixelColor(x,  c);

strip.show();//Send data
}
void loop() {

mobile();
myDelay(speedS);                                // Within（) is delay time.
displays();
SX = sx;
SY = sy;
// Get coordinate of snake head

for (int i = 1; i <= 2 + score; i++)
{
if ( SX == sx[i] && SY == sy[i])
gameover();
}
// Judge whether snake head touched its body. If touched, then forward to GameOver.

if (SY == FY && SX == FX)
{
RANDOM();
score ++;
Colour = 40; // Set color. Parameter is R G B, range 0-255.
Colour = 0;
Colour = 0;
c = strip.Color(Colour, Colour, Colour); //Green Red Blue  // Set color
x = light[FX][FY];                                              //Display food
strip.setPixelColor(x, c);
strip.show();//Send data
if ( !(score % 5)) {                      // Accerlerate snake speed according to the score. Every 5 foods eaten, accerlerate 100ms.
speedS = speedS - 50;
if (speedS < 150)                         // The bottom limit is 200ms. If speed lower than 200ms, the speed stays 200ms.
speedS = 150;
}
}
// Judge whether food are eaten. If snake ate food, then plus scores and regenerate food randomly.
}
```

Experiment Result