Каталог
Игра "Змейка" на Arduino

Игра "Змейка" на Arduino

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

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

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

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

    • VCC к 5V Arduino
    • GND к GND Arduino
    • DIN к цифровому пину 12 Arduino
    • CLK к цифровому пину 11 Arduino
    • CS к цифровому пину 10 Arduino
  2. Подключение джойстика:

    • VCC к 5V Arduino
    • GND к GND Arduino
    • Ось X к аналоговому пину A0 Arduino
    • Ось Y к аналоговому пину A1 Arduino

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

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

  1. Откройте Arduino IDE.
  2. Перейдите в "Скетч" -> "Подключить библиотеку" -> "Управлять библиотеками".
  3. Введите "LedControl" в строке поиска.
  4. Найдите библиотеку "LedControl by Eberhard Fahle" и установите её.

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

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

#include <LedControl.h>
// Определение пинов для матрицы MAX7219
#define DATA_IN 12
#define CLK 11
#define LOAD 10
// Инициализация библиотеки для работы с MAX7219
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); // Установите яркость от 0 до 15
  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);
}

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

  1. Инициализация библиотеки LedControl: Библиотека LedControl используется для управления матрицей MAX7219.
  2. Настройка матрицы: В функции setup() устанавливаются параметры яркости и очищается дисплей.
  3. Инициализация змейки: Змейка начинается с длины 3 и движется вверх.
  4. Считывание значений джойстика: В функции loop() считываются значения осей X и Y джойстика и определяется направление движения змейки.
  5. Запрет на движение назад: Код проверяет направление, чтобы змейка не могла двигаться назад по своей линии.
  6. Обновление позиции змейки: Перемещение змейки с проверкой на столкновение с собой и выход за границы.
  7. Генерация еды: Позиционирование еды случайным образом на матрице.
  8. Отображение: Отображение змейки и еды на матрице.

Заключение

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

Комментарии
Отзывов еще никто не оставлял
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином