Игра «Змейка» на 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

4. Установка библиотеки LedControl
Для работы с матрицей MAX7219 нам понадобится библиотека LedControl. Установите её следующим образом:
Откройте Arduino IDE
Перейдите в «Скетч» -> «Подключить библиотеку» -> «Управлять библиотеками»
Введите «LedControl» в строке поиска
Найдите библиотеку «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 для создания интерактивной игры. Вы сможете улучшить свои навыки программирования и работы с аппаратными компонентами, создавая увлекательные проекты.