Игра на Arduino Динозаврик T-Rex (Дракончик) с дисплеем LCD 1602 — простой и интересный проект для начинающих программистов. Для сборки игры вам понадобится lcd экран I2C, кнопка, пьезодинамик и макетная плата с коннекторами. Программа для игры и схема проекта размещена на этой странице. Кнопка и пьезодинамик могут быть собраны на макетной плате, а модули кнопки и зуммера следует подключать напрямую к Arduino.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- дисплей LCD 1602 i2c
- тактовая кнопка
- пьезодинамик
- макетная плата
- коннекторы
- библиотека LiquidCrystal_I2C.h
Суть игры «Dino T-Rex» очень проста — на экране отображается уровень игры и динозаврик, который должен уворачиваться от препятствий. На экране в случайном порядке появляется препятствие, а динозавр должен перепрыгнуть через них. На каждом уровне скорость увеличивается. Также вы можете собрать еще один интересный мини проект, опубликованный у нас — Игра на реакцию с тремя тактовыми кнопками.
Закодил Google Dino на Arduino! [Arduino GameDev]
Схема игры Динозаврик Arduino с дисплеем LCD 1602
LCD 1602 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
GND | GND | GND | GND |
VCC | 5V | 5V | 5V |
SDA | A4 | A4 | 20 |
SCL | A5 | A5 | 21 |
Вместо подключения кнопки к Ардуино через подтягивающий резистор на макетной плате, можно использовать модуль с кнопкой. Пьезодинамик (зуммер) для звуковых эффектов игры подключается к микроконтроллеру по желанию, но можно обойтись и без него. Соберите схему, как показано на рисунке выше, и загрузите следующую программу в плату Arduino Uno. Скорость игры «Dino T-Rex» на дисплее можно изменить в коде.
Скетч для игры Динозаврик на Arduino с LCD дисплеем
#include «Wire.h» #include «LiquidCrystal_I2C.h» LiquidCrystal_I2C LCD(0x27, 20, 2); int level = 1; int pause = 400; byte p = 0; byte dragon[8] = < 0b01110, 0b11011, 0b11111, 0b11100, 0b11111, 0b01100, 0b10010, 0b11011 >; byte arbre[8] = < 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b01100, 0b01100 >; byte pierre[8] = < 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b11111 >; byte oiseau[8] = < 0b00100, 0b00101, 0b01111, 0b11111, 0b10100, 0b00100, 0b00000, 0b00000 >; void setup() < pinMode (10, OUTPUT); pinMode (A1, INPUT); analogWrite(A1, LOW); LCD.init(); LCD.backlight(); LCD.createChar(0, dragon); LCD.createChar(1, arbre); LCD.createChar(2, pierre); LCD.createChar(3, oiseau); LCD.setCursor(7, 0); LCD.print(«GO!»); delay(400); tone(10, 600); delay(100); noTone(10); LCD.clear(); >void loop() < byte d = 1; byte x = 15; byte y = 1; byte i = random (1, 4); if (i == 3) y = 0; else y = 1; while (x >0) < LCD.clear(); LCD.setCursor(0, 0); LCD.print(level); if (digitalRead(A1) == LOW) d = 1; if (digitalRead(A1) == HIGH) d = 0; if (p >3) d = 1; LCD.setCursor(4, d); LCD.print(char(0)); LCD.setCursor(x, y); tone(10, 50); LCD.print(char(i)); noTone(10); if (x == 4 y == d) < delay(400); tone(10, 50); delay(100); noTone(10); delay(100); tone(10, 20); delay(300); noTone(10); LCD.clear(); delay(200); LCD.setCursor(3, 0); LCD.print(«GAME OVER!»); delay(600); LCD.clear(); delay(400); LCD.setCursor(3, 0); LCD.print(«GAME OVER!»); delay(600); LCD.clear(); LCD.setCursor(3, 1); LCD.print(«LEVEL: «); LCD.print(level); delay(400); LCD.setCursor(3, 0); LCD.print(«GAME OVER!»); delay(3000); LCD.clear(); LCD.setCursor(7, 0); LCD.print(«GO!»); delay(400); tone(10, 600); delay(100); noTone(10); LCD.clear(); level = 0; pause = 400; p = 0; y = 1; x = 0; break; >if (d == 0) < tone(10, 200); delay(100); noTone(10); >else < delay(100); >delay(pause); x = x — 1; p = p + 1; if (p > 4) p = 0; > tone(10, 800); delay(20); level = level + 1; pause = pause — 20; if (pause
Вызов принят: динозаврик из Chrome
Заключение. На дисплее в случайном порядке появляется дерево, камень или птица, и динозавр должен перепрыгнуть через них. Переменная int pause = 400; определяет начальную скорость движения препятствий (можно указать собственное значение). После прохождения каждого уровня скорость игры увеличивается за счет уменьшения переменной pause на 20 миллисекунд, используемой в команде delay() Arduino.
Источник: arduino-site.ru
T-Rex-duino – клон игры про динозавра из браузера Chrome для Arduino
Имея такой девайс, пользователи Firefox тоже смогут поиграть в T-Rex’а при ошибке загрузки страницы.
Начну с того, что меня заинтересовали самодельные супер минималистичные портативные игровые консоли. В частности, очень популярен вариант ATtiny85 + OLED дисплей:
Вот человек уже сделал 13+ игр для такой платформы.
Забавный гаджет, но после сборки играть на нем долго не хочется. На мой вкус, имеющиеся игры недостаточно «скоростные», чтобы можно было поддерживать интерес хотя бы в течении нескольких минут. Поэтому решил сделать игрушку, в которую сам бы захотел поиграть минут 10-20 и может даже два-три раза. Благо, уже давно была на примете относительно интересная игра, затягивающая и достаточно простая для помещения в микроконтроллер.
После 4 выходных работы получился такой клон.
К сожалению, уместиться в ROM ATtiny85 не удалось, поэтому пришлось воспользоваться классической Arduino. Сейчас даже считаю, что это более выигрышный вариант, т.к. Arduino более доступна, ее проще прошить и есть куда расширяться.
Игра имеет дополнительные «фитчи»: ти-рекс может нагибаться (хотя это не обязательно, можно просто прыгать!), добавлены «жизни» для продления геймплея.
Можно поиграться с параметрами игры (такие как скорость, частота «врагов» и подобное), многие настройки вынесены в начало скетча.
Сборка
В минимальном варианте понадобится Arduino Uno / Nano / Mini, OLED дисплей 128х64 на контроллере SSD1309 и одна или две кнопки. В портативном варианте нужно будет добавить аккумулятор со схемой заряда или батарейки.
После сборки нужно прошить скетч из директории t-rex-duino/ (ссылка на репозиторий в конце статьи).
Некоторые детали реализации
Привожу тут некоторые подробности, которые могут пригодится тем, кто захочет сделать свою мини-игру. Старался писать «движок» так, чтобы на нем удобно было делать игры, основанные на рендере спрайтов и детекции их «столкновений» (вообще, это чуть ли не единственные две функции «движка», на них построена вся игра). Сейчас осталось еще очень много свободных ресурсов, более 50% по производительности и памяти.
Т.к. я изначально рассчитывал на маленький микроконтроллер, в котором всего 512 байт RAM и в 2 раза меньше частота, чем у камня ардуины, для игры был написан быстрый рендер с «виртуальным» буфером, который рендерит экран по вертикальным или горизонтальным кусочкам.
Вертикальный виртуальный буфер требует минимум 128 байт памяти, а горизонтальный – от 8 байт. При этом полный буфер всего экрана занял бы 1кб. Направление рендера следует выбирать так, чтобы оно совпадало с основным направлением движения на экране (меньше искажений). В начале скетча есть переключение режима рендера, для демонстрации работы обоих вариантов.
Каждый спрайт в игре описан точкой экрана в которую нужно его отрендерить и двумя однобитными битмапами: «данные» и «маска». Эти два битмапа описывают однобитное изображение с «прозрачностью». Т.е. каждый пиксель в спрайте может быть «белым», «черным» или «прозрачным». Вместе с кодом проекта есть python-утилита game-assets-gen/img-conv.py конвертации png в с-массивы соответствующих битмапов. Для запуска процесса перегенерации существующих битмапов можно запустить gen_assets.bat находясь в game-assets-gen/ .
Также, привожу поясняющую картинку по используемой координатной системе.
Ссылки
Доступны схема, исходники для Arduino, утилита для конвертации изображений в используемый в игре формат битмапов.
Модуль дисплея: diymore 2.42 inch 128×64 OLED Display Module SSD1309
— На этом все, спасибо за внимание!
Источник: habr.com
Игра на Ардуино с LCD дисплеем «Дракончик»
Вместо подключения кнопки к Ардуино через резистор на макетной плате можно использовать модуль с кнопкой. Пьезодинамик (пьезоизлучатель) подключается к плате при желании, можно обойтись и без него. Соберите схему, как на картинке выше, и загрузите следующий скетч. Скачать программу для игры «Дракончик» на Arduino с жк дисплеем можно здесь. Скорость игры и звуки можно изменить в программе.
Скетч для игры «Дракончик» на дисплее
#include Wire.h> // библиотека для протокола IIC #include LiquidCrystal_I2C.h> // подключаем библиотеку LCD IIC LiquidCrystal_I2C LCD(0x27, 20, 2); // присваиваем имя lcd для дисплея int level = 1; // переменная для отсчета уровня int pause = 400; // переменная для задержки byte p = 0; // переменная для времени прыжка // создаем массивы дракончика, дерева, камня и птицы byte dracon[8] = < 0b01110, 0b11011, 0b11111, 0b11100, 0b11111, 0b01100, 0b10010, 0b11011 >; byte derevo[8] = < 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b01100, 0b01100 >; byte kamen[8] = < 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b11111 >; byte ptica[8] = < 0b00100, 0b00101, 0b01111, 0b11111, 0b10100, 0b00100, 0b00000, 0b00000 >; void setup() < pinMode (10, OUTPUT); // подключаем пьезодинамик pinMode (A1, INPUT); // подключаем кнопку analogWrite(A1, LOW); LCD.init(); // инициализация LCD дисплея LCD.
backlight(); // включение подсветки дисплея // создаем символы дракончика, дерева, камня и птицы LCD.createChar(0, dracon); LCD.createChar(1, derevo); LCD.createChar(2, kamen); LCD.createChar(3, ptica); // начинаем игру: выводим надпись GO! LCD.
setCursor(7, 0); LCD.print(«GO!»); delay(400); tone(10, 600); delay(100); noTone(10); LCD.
clear(); > void loop() < // первоначальное положение дракончика и препятствия byte d = 1; byte x = 15; byte y = 1; // выбираем препятствие, которое появится, рандомно byte i = random (1, 4); if (i == 3) y = 0; else y = 1; while (x > 0) < // очищаем экран и выводим номер уровня LCD.clear(); LCD.
setCursor(0, 0); LCD.print(level); // считываем данные с кнопки и учитываем количество циклов в прыжке // если дакончик находится в прыжке долго — возвращаем его вниз if (digitalRead(A1) == LOW) d = 1; if (digitalRead(A1) == HIGH) d = 0; if (p > 3) d = 1; // выводим дракончика в нужной строке LCD.
setCursor(4, d); LCD.print(char(0)); // выводим препятствие LCD.setCursor(x, y); tone(10, 50); LCD.print(char(i)); noTone(10); // если дракончик наткнулся на препятствие выводим надпись GAME OVER!
if (x == 4 y == d) < delay(400); tone(10, 50); delay(100); noTone(10); delay(100); tone(10, 20); delay(300); noTone(10); LCD.clear(); delay(200); LCD.setCursor(3, 0); LCD.
print(«GAME OVER!»); delay(600); LCD.clear(); delay(400); LCD.setCursor(3, 0); LCD.print(«GAME OVER!»); delay(600); LCD.clear(); LCD.
setCursor(3, 1); LCD.print(«LEVEL: «); LCD.print(level); delay(400); LCD.setCursor(3, 0); LCD.print(«GAME OVER!»); delay(3000); LCD.
clear(); // начинаем игру заново, обнулив уровень игры LCD.setCursor(7, 0); LCD.print(«GO!»); delay(400); tone(10, 600); delay(100); noTone(10); LCD.clear(); level = 0; pause = 400; p = 0; y = 1; x = 0; break; > // если дракончик прыгнул, издаем звук if (d == 0) < tone(10, 200); delay(100); noTone(10); > else < delay(100); > // если дракончик не столкнулся, то меняем положение препятствия // начинаем считать сколько циклов дракончик находится в прыжке delay(pause); x = x — 1; p = p + 1; if (p > 4) p = 0; > // переходим на следующий уровень и сокращаем время задержки tone(10, 800); delay(20); level = level + 1; pause = pause — 20; if (pause
Пояснения к коду:
- в начале программы создаются массивы, где нарисован дракончик (динозаврик) и препятствия, их можно изменить и создать свои символы или изображения;
- переменная int pause = 400; задает начальную скорость движения препятствий по экрану (можно поставить свое значение в скетче);
- после прохождения каждого уровня, скорость игры увеличивается, путем уменьшения времени задержки на 20 миллисекунд pause = pause — 20; .
(53 оценок, среднее: 4,51 из 5)
Источник: xn--18-6kcdusowgbt1a4b.xn--p1ai