Игра «Змейка» на Arduino

1. Введение

В этом проекте мы создадим игру «Змейка» на платформе Arduino. Для отображения игрового поля мы будем использовать LED матрицу 8x8 с драйвером MAX7219, а для управления змейкой — джойстик. Игра заключается в том, чтобы управлять змейкой, избегать столкновений и собирать еду, увеличивая её длину. Этот проект является отличным примером использования Arduino для создания интерактивных и увлекательных игр.

2. Необходимые компоненты

  • Arduino Uno

  • LED матрица 8x8 с драйвером MAX7219

  • Джойстик

  • Соединительные провода

  • Макетная плата

3. Подключение компонентов

Подключение LED матрицы MAX7219:

  • VCC к 5V Arduino

  • GND к GND Arduino

  • DIN к цифровому пину 12 Arduino

  • CLK к цифровому пину 11 Arduino

  • CS к цифровому пину 10 Arduino

Подключение джойстика:

  • VCC к 5V Arduino

  • GND к GND Arduino

  • Ось X к аналоговому пину A0 Arduino

  • Ось Y к аналоговому пину A1 Arduino

Схема подключения джойстика к Arduino

4. Установка библиотеки LedControl

Для работы с матрицей MAX7219 нам понадобится библиотека LedControl. Установите её следующим образом:

  1. Откройте Arduino IDE

  2. Перейдите в «Скетч» -> «Подключить библиотеку» -> «Управлять библиотеками»

  3. Введите «LedControl» в строке поиска

  4. Найдите библиотеку «LedControl by Eberhard Fahle» и установите её

5. Программирование Arduino

Загрузите следующий код в ваш Arduino. Этот код реализует игру «Змейка» с управлением через джойстик и отображением на матрице MAX7219.

#include <LedControl.h>
#define DATA_IN 12
#define CLK 11
#define LOAD 10
LedControl lc = LedControl(DATA_IN, CLK, LOAD, 1);
#define JOYSTICK_X A0
#define JOYSTICK_Y A1
#define MATRIX_SIZE 8
int snakeX[MATRIX_SIZE * MATRIX_SIZE];
int snakeY[MATRIX_SIZE * MATRIX_SIZE];
int snakeLength;
int foodX, foodY;
int dirX, dirY;
int lastDirX, lastDirY;

void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 8);
lc.clearDisplay(0);
snakeLength = 3;
snakeX[0] = 4; snakeY[0] = 4;
snakeX[1] = 4; snakeY[1] = 5;
snakeX[2] = 4; snakeY[2] = 6;
dirX = 0; dirY = -1;
lastDirX = 0; lastDirY = -1;
generateFood();
}

void loop() {
int xValue = analogRead(JOYSTICK_X);
int yValue = analogRead(JOYSTICK_Y);
if (abs(xValue - 512) > abs(yValue - 512)) {
    if (xValue < 400 && lastDirX != 1) {
    dirX = -1; dirY = 0;
    } else if (xValue > 600 && lastDirX != -1) {
    dirX = 1; dirY = 0;
    }
} else {
    if (yValue < 400 && lastDirY != 1) {
    dirX = 0; dirY = -1;
    } else if (yValue > 600 && lastDirY != -1) {
    dirX = 0; dirY = 1;
    }
}
updateSnake();
display();
delay(200);
}

void updateSnake() {
int newX = snakeX[0] + dirX;
int newY = snakeY[0] + dirY;
if (newX < 0) newX = MATRIX_SIZE - 1;
if (newX >= MATRIX_SIZE) newX = 0;
if (newY < 0) newY = MATRIX_SIZE - 1;
if (newY >= MATRIX_SIZE) newY = 0;
for (int i = 0; i < snakeLength; i++) {
    if (snakeX[i] == newX && snakeY[i] == newY) {
    snakeLength = 3;
    snakeX[0] = 4; snakeY[0] = 4;
    snakeX[1] = 4; snakeY[1] = 5;
    snakeX[2] = 4; snakeY[2] = 6;
    dirX = 0; dirY = -1;
    return;
    }
}
for (int i = snakeLength; i > 0; i--) {
    snakeX[i] = snakeX[i - 1];
    snakeY[i] = snakeY[i - 1];
}
snakeX[0] = newX;
snakeY[0] = newY;
lastDirX = dirX;
lastDirY = dirY;
if (newX == foodX && newY == foodY) {
    snakeLength++;
    generateFood();
}
}

void generateFood() {
foodX = random(MATRIX_SIZE);
foodY = random(MATRIX_SIZE);
for (int i = 0; i < snakeLength; i++) {
    if (snakeX[i] == foodX && snakeY[i] == foodY) {
    generateFood();
    return;
    }
}
}

void display() {
lc.clearDisplay(0);
for (int i = 0; i < snakeLength; i++) {
    lc.setLed(0, snakeY[i], snakeX[i], true);
}
lc.setLed(0, foodY, foodX, true);
}

6. Пояснение к коду

  • Инициализация библиотеки LedControl: используется для управления матрицей MAX7219

  • Настройка матрицы: задаётся яркость, происходит очистка дисплея

  • Инициализация змейки: начальная длина 3, движение вверх

  • Считывание джойстика: определение направления

  • Запрет на движение назад: предотвращает обратный ход змейки

  • Обновление позиции змейки: перемещение, проверка столкновений

  • Генерация еды: случайная позиция, избегание пересечений

  • Отображение: вывод на матрицу MAX7219

7. Заключение

Этот проект является отличным примером использования Arduino и матрицы MAX7219 для создания интерактивной игры. Вы сможете улучшить свои навыки программирования и работы с аппаратными компонентами, создавая увлекательные проекты.