Найти в Дзене
ArcadePub

Игра змейка на Ардуино

Оглавление
Змейка на Ардуино
Змейка на Ардуино

Привет. в прошлый раз мы начали программировать змейку. Мы используем светодиодную матрицу и джойстик для управления. Сегодня допишем код, чтобы у нас получилась настоящая игра змейка.

Содержание

  • Для того, чтобы выполнить этот проект нам понадобиться
  • Игра змейка
  • Несколько секций змейки
  • Еда
  • Конец игры
  • Полный текст программы
  • Заключение
  • Похожее

В предыдущей статье мы уже начали писать программу для игры. Посмотрите тот пост, если пропустили или уже забыли. Сегодня мы допишем программу, чтобы получить настоящую игру.

Змейка. Проекты. Ардуино

Для того, чтобы выполнить этот проект нам понадобиться

  • Ардуино UNO
  • Перемычки
  • Макетная плата
  • Светодиодная матрица
  • Резистор 220 Ом
  • Джойстик
  • Кабель USB

Игра змейка

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

Во-первых змейка должна состоять из нескольких светодиодов. И ее размер должен увеличиваться, когда змейка ест.

Во-вторых мы должны создать еду, проверять, не съели ли ее. И создавать новую.

И в-третьих, нужно создать условия проигрыша. Иначе какая это будет игра.

Несколько секций змейки

Сложность здесь в том, что при изменении направления движения головы змейки, ее тело должно повторять точный путь. Для этого нам придется записывать координаты каждой секции змейки. И выводить их последовательно при изменении направления движения.

Для этого заведем специальный массив. В нем будут храниться координаты каждой секции змейки. Максимальный размер змеи будет равен размеру матрицы, поэтому сразу зарезервируем 256 элементов. Также создадим переменную для реального размера змейки в текущий момент. И текущую скорость.

int snake[256]; // array of snakes elements
int snakeSize = 2; // real snake size
int snakeSpeed = 500; // snake speed

В начале игры, все элементы змеи, кроме ее реального размера, должны быть пустыми. А несколько элементов должны быть рядом со стартовой позицией. Инициализируем это следующим образом.

for( i=0; i<=255; i++ ){
snake[i] = 0;
}
for( i=0; i<=snakeSize; i++ ){
snake[i] = lastDirection+i;
}

Теперь в функции перемещения змейки мы должны нарисовать все элементы, но убрать лишние при движении вперед. Для этого 0 элементу присвоим новое значение из функции Snakedirection, а последующим элементам присвоим значения предыдущих элементов.

FastLED.clear();
for(i=snakeSize; i>=1; i--){
snake[i] = snake[i-1];
}
snake[0] = snakeDirection;
for( i=0; i<=255; i++ ){
if( snake[i] ){
leds[snake[i]].setRGB(red, green, blue);
}
}
FastLED.show();

Таким образом, в нашей змейке появилось три секции. И при движении они перемещаются по матрице. А при смене направления движения джойстиком, весь маршрут сохраняется и прорисовывается на матрице.

Движение с сохранением координат
Движение с сохранением координат

Еда

Теперь создадим что-нибудь съедобное. Чтобы змея могла съесть и вырасти. В переменную f запишем координаты точки с едой. Она будет генерироваться случайно.

f = random(0, 255);

И напишем небольшую функцию. Она будет проверять, съедена ли еда. И создавать новую.

void food( int eaten ){
if( eaten == f ){
snakeSize++;
f = random(0, 255);
red = fred;
green = fgreen;
blue = fblue;
fred = random(0, 255);
fgreen = random(0, 255);
fblue = random(0, 255);
snakeSpeed = snakeSpeed / 1.1;
} else {
leds[f].setRGB(fred, fgreen, fblue);
FastLED.show();
}
}

Если точка съедена, вы увеличим размер змейки, увеличим скорость и создадим новую точку со случайными координатами. Также перекрасим змейку в цвета съеденной ранее еды.

Генерация еды и увеличение размер
Генерация еды и увеличение размер

Конец игры

Для определения конца игры напишем еще одну функцию. Она будет восстанавливать размер змейки, скорость, а также перекрашивать ее в красный цвет.

void death(){
snakeSize = 2;
snakeSpeed = 500;
red = 255;
green = 0;
blue = 0;
}

Таким образом мы будем понимать, что старая змейка умерла и нужно все начинать сначала. Конечно, вы можете изменить код и добавить текст или закрасить всю матрицу красным.

Теперь добавим условие, при котором считать игру законченной. Поскольку мы сделали границы матрицы прозрачными. То, запретим змейке пересекаться со своим собственным телом. Для этого в функцию прорисовки текущего шага добавим проверку.

for( i=0; i<=255; i++ ){
if( snake[i] == snakeDirection ){
death();
}
}

Если координаты текущего шага уже есть в составе змейки, вызываем функцию death()

Мы не стали сбрасывать все цифры из массива snake, а значит после смерти несколько элементов останутся лежать на месте. Наезжать на них так же будет нельзя, ведь эти координаты находятся в составе змейки.

Конец игры
Конец игры

Полный текст программы

Пожалуйста, посмотрите полный текст программы на сайте. Дзен некорректно отображает ссылки на библиотеки из-за этого код может быть неправильно скопирован.

Кроме того, код достаточно объемный.

Ссылка на сайт здесь

Заключение

Мы написали нашу первую игру для Ардуино. Конечно, в коде еще много возможностей для улучшения игры. И у вас в запасе еще 78% памяти Ардуино. Но это уже готовая классическая аркадная игра.

Спасибо, что дочитали статью до конца.
Пожалуйста, подписывайтесь на блог в яндекс дзен, ставьте лайки и пишите в комментариях, если у вас появились вопросы.
Посмотрите больше уроков и проектов на сайте arcadepub.ru
И подписывайтесь на соц. сети.
Спасибо за внимание, скоро увидимся #arcade pub
Другие интересные статьи
Ардуино. Урок 3. Цикл While, массивы светодиодов и электрическое сопротивление
Ардуино. Урок 2. Цикл for и управляющие конструкции if и else
С чего начать знакомство с Ардуино
Ультразвуковой радар

Где купить