ARDUINO Змейка на ардуино.

Здравствуйте форумчане! Хочу сделать Змейку на ардуино, но я затрудняюсь понять как мне сделать хвост змеи. Есть точка, которая двигается. При повороте джойстика В крайнее правое/левое положение Y, змейка поворачивается на 90 градусов вправо/влево. Я в этом не очень мастер, но объясните хотя бы логику действий, что-бы хвост двигался как двигалась точка.
I2CSnake.png
C:
#include <TrueRandom.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR   0x3C

Adafruit_SSD1306 display(-1);

  byte xFood;
  byte yFood;
  byte x = 64;
  byte y = 32;
  int Stats;
  int moveX;
  int moveY;
  int rotate = 0;
  int Ntail;
  int Tail[115];   
 
void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.drawPixel(x - 1, y, 1);
  display.drawPixel(x - 2, y, 1);
  display.display();

  Ntail = 1;

  xFood = TrueRandom.random(11,118);
  yFood = TrueRandom.random(11,63);
}

void loop() {
  int moveR = analogRead(6);
  Serial.println(moveR);
 
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(10, 0);
  display.println(utf8rus("Кол-во очков:"));
  display.setCursor(88, 0);
  display.println(Stats);
  display.drawRect(10, 10, 108, 54, 1);
 
  if (moveR < 200) rotate = rotate + 1;
  if (moveR > 1000) rotate = rotate - 1;
 
  if (rotate < 0) rotate = 3;
  if (rotate > 3) rotate = 0;

  if (rotate == 0) {moveX = 1; moveY = 0;}
  if (rotate == 1) {moveX = 0; moveY = 1;}
  if (rotate == 2) {moveX = -1; moveY = 0;}
  if (rotate == 3) {moveX = 0; moveY = -1;}

  if (x == xFood && y == yFood) Stats++;

  x = x + moveX;
  y = y + moveY;
  if (y <= 10) y = 62;
  if (x <= 10) x = 117;
  if (y >= 63) y = 11;
  if (x >= 118) x = 11;
  Serial.print(x); Serial.print(" "); Serial.print(y); Serial.print(" "); Serial.print(moveR); Serial.print(" "); Serial.print(moveX); Serial.print(" "); Serial.print(moveY); Serial.print(" "); Serial.print(rotate); Serial.println(" ");
  display.drawPixel(x, y, 1);
  display.drawPixel(xFood, yFood, 1);
  display.display();
}

/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xBF){
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
К сообщению прикрепил архив проекта. Тут находятся библиотеки(В том числе русифицированная библиотека Adafruit GFX Library), И ino проект.
 

Вложения

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,002
406
Москва
wan-derer.ru
Змейка это совокупность точек. Надо хранить координаты всех точек. При движении рисовать голову и подтирать хвост. Потом переписывать координаты промежуточных точек, беря координату следующей из предыдущей.
Просто массив переменной длины.
 
  • Лойс +1
Реакции: Roden