Оглавление:
- Шаг 1: все части
- Шаг 2: Как подключить детали к Arduino
- Шаг 3: Блок-схема программы
- Шаг 4: Программирование джойстика
- Шаг 5: Первый уровень
- Шаг 6: Обнаружение столкновения
- Шаг 7: Последние два уровня
Видео: Воссоздание самой сложной игры в мире на Arduino: 7 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
Этот проект основан на компьютерной игре, которую вы можете найти в Интернете. Его название - «Самая сложная игра в мире». Мне удалось воссоздать его на Arduino, используя четырехмодульную светодиодную матрицу. В этом руководстве я научу вас, как построить его самостоятельно. Прежде чем мы углубимся в подробности, я хочу дать краткий обзор шагов, которые я прошел, чтобы создать эту игру.
- Собрал все необходимые детали.
- Я соединил части вместе.
- Я написал скетч, который использовал джойстик для перемещения светодиода игроков по всем модулям.
- Я разработал первые препятствия и добавил их в набросок, чтобы они имитировали сложнейшую игру в мире.
- Затем я добавил код для обнаружения столкновения с препятствиями, который перезапустил игру.
- А потом спроектировал еще два уровня препятствий.
Шаг 1: все части
Вот список всех необходимых деталей:
- Разъем Arduino UNO и usb:
- Четыре модуля 8x8: светодиодная матрица
- Джойстик:
- 10 проводов папа-мама:
Шаг 2: Как подключить детали к Arduino
Как подключить светодиодную матрицу к Arduino
- GND переходит в GND
- VCC переходит на 5 В
- DataIn идет на цифровой контакт 12
- CLK переходит на цифровой контакт 11
- CS или LOAD переходит на цифровой контакт 10
Как подключить джойстик
- GND переходит в GND
- 5 В переходит в 5 В
- VRx идет на аналоговый вывод A0
- VRy идет на аналоговый вывод A1
- ПО не используется
Аккумулятор подключается к разъему 9 В, чтобы обеспечить питание Arduino.
Шаг 3: Блок-схема программы
Овал указывает на начало программы.
Первый шаг - определить все препятствия.
Следующие два шага указывают на установку переменных и включение всех модулей.
Следующий шаг - установить светодиоды на первый уровень и любые другие переменные.
Затем отобразите уровень, на котором в данный момент находится игрок.
Ромб указывает на то, что джойстик считывается, чтобы увидеть, в каком направлении он толкается.
Затем переместите игрока в любом направлении, в котором был нажат джойстик.
Проверьте, не столкнулся ли игрок с препятствием.
Если игрок наткнулся на препятствие, вернитесь на первый уровень. Если нет, проверьте, достиг ли игрок конца уровня.
Если игрок находится в конце уровня, перейдите на следующий уровень, затем вернитесь к «Показать текущий уровень». Если они не в конце, переместите препятствия и вернитесь к «Прочитать джойстик».
Шаг 4: Программирование джойстика
Конечно, чтобы переместить маленькую точку, которая является игроком, нам понадобится джойстик. и чтобы позволить джойстику действительно перемещать игрока, нам нужно закодировать его в Arduino IDE. Вам необходимо включить библиотеку LedControl, которую вы можете найти, перейдя в меню эскиза> Включить библиотеки> Управление библиотеками и найдите LedControl. Вот как выглядит код джойстика.
#include "LedControl.h"
int DataIn = 12; int CLK = 11; int DIN = 10; LedControl lc = LedControl (DataIn, CLK, DIN, 4); // Создает объект для четырех модулей int delaytime = 50; // скорость, с которой работает игра int joystick_RtLt, joystick_UpDn; int player_x = 0; // горизонтальное положение игроков от 0 до 31 int player_y = 3; // вертикальное положение игроков от 0 до 7 int row, column, module; void setup () {initialize_modules (); // включаем и устанавливаем все четыре светодиодных модуля} void loop () {move_player (); // запускаем цикл, проверяя, движется ли игрок delay (delaytime); } void initialize_modules () {lc.shutdown (0, ложь); // запускаем модуль 0 lc.setIntensity (0, 1); lc.shutdown (1, ложь); // запускаем модуль 1 lc.setIntensity (1, 1); lc.shutdown (2, ложь); // запускаем модуль 2 lc.setIntensity (2, 1); lc.shutdown (3, ложь); // запускаем модуль 3 lc.setIntensity (3, 1); lc.clearDisplay (0); // очищает модуль 0} void move_player () {module = player_x / 8; // определяет, в каком модуле находится игрок column = player_x% 8; // определяет столбец, в котором находится игрок, в модуле row = player_y; lc.setLed (модуль, строка, столбец, ложь); // выключить светодиод в текущей позиции игрока joystick_RtLt = analogRead (A0) / 204 - 2; // считываем X-джойстик и диапазон карты от 2 до -2 if (joystick_RtLt> 0) // когда джойстик справа player_x ++; // идем вправо else if (joystick_RtLt 0) // если джойстик находится слева, а не в начале player_x--; // перемещаемся влево joystick_UpDn = analogRead (A1) / 204 - 2; // считываем диапазон Y-джойстика и карты от 2 до -2 if (joystick_UpDn 0) // если джойстик опущен, а игрок не внизу player_y--; // двигаться вниз else if (joystick_UpDn> 0 && Players_y <7) // если джойстик поднят, а игрок не наверху player_y ++; // поднимаемся module = player_x / 8; // устанавливаем модуль для игроков new position column = Players_x% 8; // устанавливаем столбец для игроков новая позиция row = player_y; // установить строку для новой позиции игроков lc.setLed (module, row, column, true); // включаем светодиод на новой позиции игрока}
Теперь, когда вы добавили джойстик, давайте поработаем над первым препятствием!
Шаг 5: Первый уровень
Хорошо, теперь пора перейти к основной части программы - препятствиям! Препятствия - вот что действительно делает эту игру «самой сложной игрой в мире». Поэтому, если вы действительно хотите играть в игру, вам нужно добавить это в свой код:
байтовое препятствие [LEVELS] [SCENES] [COLUMNS] [ROWS] = {// три уровня, 8 сцен, 8 колонн, 8 строк
{{{1, 1, 1, 1, 1, 1, 0, 0}, // первый уровень, первая сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1}, { 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // первый уровень, вторая сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 1, 1, 1, 1 }, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // первый уровень, третий сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // сначала уровень, четвертая сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // первый уровень, пятая сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 0, 0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // первый уровень, шестая сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, { 1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 1, 1, 1, 1, 1, 1}, // первый уровень, седьмая сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0 }, {1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 1, 1, 1, 1, 1, 1, 1}, // первый уровень, восьмой сцена {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}}, void setup () {initialize_modules (); // включаем и устанавливаем все четыре светодиодных модуля start_level (0); недействительный цикл () {move_player (); // запускаем цикл, проверяя, движется ли игрок if (collision ()) {// проверяем уровень столкновения = 0; // если коллизия истинна, сбросить уровень start_level (level); // перезапуск игры} else if (delay_count == преподносить_delay) {// если нет столкновения, переместить препятствие через каждое второе задержка moveobstacle (); delay_count = 0; } else delay_count ++; delay (время задержки); // задержка по скорости игры}
И это первое препятствие! Если вам надоест это в качестве первого уровня, вы всегда можете изменить байты, просто помните, что вам нужно иметь восемь разных сцен! Перейдем к следующему шагу - обнаружению столкновений!
Шаг 6: Обнаружение столкновения
Этот шаг - еще одна важная часть игры, без него не было бы особых проблем! Вы могли просто преодолевать препятствия без каких-либо последствий! это было бы не очень весело, правда? так что давайте сделаем игру более сложной (и намного более интересной!), добавив в программу следующий раздел:
void loop () {
move_player (); // запускаем цикл, проверяя, движется ли игрок if (collision ()) {// проверяем уровень столкновения = 0; // если коллизия истинна, сбросить уровень start_level (level); // перезапуск игры} else if (delay_count == преподносить_delay) {// если нет столкновения, переместить препятствие через каждое второе задержка moveobstacle (); delay_count = 0; } else delay_count ++; delay (время задержки); // задержка по скорости игры} int collision () {// проверяем, попал ли игрок в препятствие в сцене module = player_x / 8; столбец = player_x% 8; row = player_y; if (модуль> 0) if (препятствие [уровень] [сцена] [столбец] [строка] == 1) // если позиция игрока такая же, как у препятствия return (1); // обнаружена коллизия return true return (0); // без коллизии возвращает false}
И вот так! теперь вы можете получать больше удовольствия от игры! Теперь я покажу вам, как программировать последние два уровня игры! Вы почти закончили с этой инструкцией, и я уверен, что вы готовы ее попробовать!
Шаг 7: Последние два уровня
Ближе к концу инструкции, эти последние два уровня - все, что вам нужно, чтобы закончить эту игру. Тогда вы можете попробовать это сами! вот код:
байтовое препятствие [LEVELS] [SCENES] [COLUMNS] [ROWS] = {// второй и третий уровень, 8 сцен, 8 столбцов, 8 строк
{{{1, 0, 0, 0, 0, 0, 0, 1}, // второй уровень, первая сцена {0, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, { 0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 0, 0, 1}}, {{1, 1, 0, 0, 0, 0, 0, 1}, // второй уровень, вторая сцена {0, 0, 1, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0, 0 }, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 0, 1, 1}}, {{0, 1, 0, 0, 0, 0, 0, 0}, // второй уровень, третья сцена {0, 0, 1, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}}, {{0, 0, 1, 0, 0, 0, 0, 0}, // четвертая сцена второго уровня {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {0, 1, 1, 1, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}}, {{0, 0, 0, 1, 0, 0, 0, 0}, // второй уровень, fif -я сцена {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // второй уровень, шестая сцена {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1, 1}, {0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 1, 0, 0}, // второй уровень, седьмая сцена {0, 0, 0, 0, 0, 1, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 1, 1}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 0, 1, 0}, // восьмая сцена второго уровня {1, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 1}, {0, 1, 0, 0, 0, 0, 0, 0}}}, {{{0, 1, 0, 0, 0, 0, 0, 1}, // третий уровень, первая сцена {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0} }, {{0, 0, 0, 0, 1, 0, 0, 1}, // третий уровень, вторая сцена {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // третий уровень, третья сцена {0, 0, 0, 1, 0, 0, 1, 0}, { 0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // третий уровень, четвертая сцена {1, 0, 0, 1, 0, 0, 1, 0 }, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // третий уровень, пятая сцена {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // третий уровень, шестая сцена {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // третий уровень, седьмая сцена {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // третий уровень, восьмая сцена { 1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}}};
Вот и все! вы готовы к завершению самой сложной игры в мире. Также ниже прилагается полный код Arduino.
Рекомендуемые:
Первые в мире оптоволоконные часы со свечой: 14 шагов (с изображениями)
Первые в мире оптоволоконные часы со свечой. Я решил сделать жене подарок и у меня возникла оригинальная идея. Мне понравилась идея движущейся скульптуры, и после долгих размышлений я пришел к концепции механических часов, которые мерцали и мигали с помощью кристаллов, свечей и
"Простейший в мире" нейрализатор-сборка (Люди в черном ластике памяти): 10 шагов (с изображениями)
"Самый простой в мире" Neuralizer-build (Men in Black Memory Eraser): Вы собираетесь на костюмированную вечеринку всего через несколько дней, но у вас все еще нет костюма? Тогда эта сборка для вас! Этот реквизит с солнцезащитными очками и черным костюмом завершит ваш костюм «Мужчины в черном». Он основан на простейшей из возможных электронных схем
Самый маленький в мире Bluetooth-динамик из старых деталей: 8 шагов (с изображениями)
Самый маленький в мире Bluetooth-динамик из старых деталей: если вам понравился этот проект, подумайте о голосовании за него, чтобы выиграть конкурс Trash to Treasure здесь - https://www.instructables.com/contest/trashytreasure2020/ В этой инструкции вы узнаете, как сделать ультра-крошечный самодельный bluetooth-динамик, который
Сломанные наушники к вашей самой ценной паре за 99 очков и легкая пайка: 3 шага
От сломанных наушников к вашей самой ценной паре для 99p и немного простой пайки: есть несколько руководств по ремонту вилок и проводов на сломанных наушниках, но в них отсутствует гораздо более простой подход - просто заменить провод на один из дешевого набора с ebay. Ремонт наушников и штекеров сложен и вряд ли будет
Симулятор игры для смартфона - играйте в игры для Windows, используя IMU для управления жестами, акселерометр, гироскоп, магнитометр: 5 шагов
SmartPhone Game Simulator - играйте в игры для Windows, используя IMU управления жестами, акселерометр, гироскоп, магнитометр: поддержите этот проект: https://www.paypal.me/vslcreations, сделав пожертвование на программы с открытым исходным кодом & поддержка дальнейшего развития