У меня есть проблема с игрой "Змейка" на Arduino: вместо того, чтобы отображаться в виде полной змейки, на экране появляется лишь одна точка. Как я могу это исправить?

Я использую библиотеки EncButton и GyverOLED для своего проекта. Я основываюсь на <a href="https://habr.com/ru/articles/795395/" rel="nofollow">статье</a>, однако мой код еще не завершен. Я адаптировал и разработал только часть, отвечающую за движение, но сталкиваюсь с проблемой: на OLED-дисплее отображается лишь одна бегающая точка. Почему не отображается вся змейка?
  • 24 января 2025 г. 20:04
Ответы на вопрос 2
Скорее всего, причина того, что ваша змейка отображается в виде одной точки, заключается в том, что вы не обновляете массив, который хранит координаты частей тела змейки, и не отображаете его на экране должным образом. Чтобы решить эту проблему, вам нужно убедиться, что:

1. **Инициализация змейки**: Убедитесь, что вы правильно инициализируете стартовую позицию и длину змейки.

2. **Массив координат**: Используйте массив для хранения координат всех сегментов змейки, а не только одного. Например, если ваша змейка состоит из 5 сегментов, вам нужно хранить 5 пар координат (x, y).

3. **Обновление положения**: При каждом движении обновляйте позиции всех сегментов. S каждым обновлением нужно смещать каждый сегмент на место предыдущего, и только голова змейки будет двигаться в новом направлении.

4. **Отображение на экране**: Обновляйте отрисовку всех сегментов змейки на OLED-дисплее после каждого движения.

Вот пример, который может помочь вам понять, как это реализовать. Данный пример показывает, как можно использовать массивы для хранения координат частей змейки:

```cpp
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#include <GyverOLED.h>

GyverOLED<OLED_WIDTH, OLED_HEIGHT> oled;

struct Segment {
  int x;
  int y;
};

Segment snake[100]; // Массив частей змейки
int snakeLength = 5; // Длина змейки
int direction = 1; // Направление (0 - вверх, 1 - вправо, 2 - вниз, 3 - влево)

void setup() {
  oled.begin();
  
  // Инициализация начальной позиции змейки
  for (int i = 0; i < snakeLength; i++) {
    snake[i].x = 10; // Начальная позиция по X
    snake[i].y = 10 + i; // Разделитель по Y
  }
}

void loop() {
  // Логика движения змейки
  for (int i = snakeLength - 1; i > 0; i--) {
    snake[i] = snake[i - 1]; // Сдвигаем сегменты
  }

  // Обновляем голову змейки согласно направлению
  switch (direction) {
    case 0: snake[0].y--; break; // Вверх
    case 1: snake[0].x++; break; // Вправо
    case 2: snake[0].y++; break; // Вниз
    case 3: snake[0].x--; break; // Влево
  }

  // Очищаем экран
  oled.clear();

  // Отображаем змейку
  for (int i = 0; i < snakeLength; i++) {
    oled.pixel(snake[i].x, snake[i].y, 1);
  }

  oled.display();
  delay(200); // Задержка для регулирования скорости игры
}
```

Этот код создает змейку, которая состоит из нескольких сегментов, и отображает ее на экране. Обратите внимание на инициализацию, обновление каждого сегмента и отрисовку. Убедитесь также, что ваша логика управления направлением корректна, чтобы змейка могла изменять свою траекторию.

Если у вас все еще возникают проблемы, проверьте, чтобы:
- Размеры дисплея совпадали с размерами элементов змейки.
- Не выходите за границы экрана дисплея, что может приводить к неправильному отображению.
- Все библиотеки и их версии корректно подключены.
Ошибки в коде: 
for (int i=snakeLength;i>0;i--) {
        snakeX[i] = snakeX[i-1];
        snakeY[i] = snake[i-1];   # < --- snakeY[i] = snakeY[i-1];
      }
Похожие вопросы