Это документация для моего окончательного проекта интеграции в классе CSC 2364 в LSU.

Схема проекта

Основанная на игре Simon Says, цель этой игры состоит в том, чтобы повторить рисунок, который показывает компьютер, и который становится длиннее с каждым ходом. Игроку показаны четыре фигуры: красный круг, желтый квадрат, синий треугольник и длинный зеленый прямоугольник, напоминающий пробел. Первые фигуры соответствуют трем кнопкам, подключенным к Elegoo Uno, а зеленый прямоугольник соответствует пробелу.

При наличии нескольких доступных режимов особенности игры могут различаться. «Бесконечный режим» просто дает игроку неограниченное время, чтобы попытаться следовать шаблону. Если что-то не так, игра окончена, и узор будет расти бесконечно. «Временные уровни» настраиваются, позволяя игроку выбирать количество времени, уровни и даже используемые цвета. Как и в бесконечном режиме, если игрок ошибется один раз, игра окончена. Но если они преодолеют указанное количество уровней, они выиграют!

Примеры Arduino Simone

Вы также можете щелкнуть здесь, чтобы просмотреть видео проекта, работающего на YouTube, при этом показывая элементы управления! Кстати об элементах управления…

Элегоо Уно

В этом проекте Elegoo Uno использовался в качестве кнопок для ввода круга, квадрата и треугольника. Ниже вы можете увидеть три кнопки, подключенные с правой стороны платы, а также три светодиода с левой стороны платы. Светодиоды слева загораются в соответствии с их формой на экране. Кроме того, после проигрыша загорался красный светодиод. Если игра была выиграна (только уровни на время), загорался синий светодиод.

Код

Весь код доступен в моем GitHub для просмотра в необработанном виде.

Код Arduino был очень простым. Arduino будет постоянно отправлять значения кнопок на p5, в то время как p5 будет отправлять обновления светодиодам Uno всякий раз, когда их нужно активировать.

Код p5 значительно сложнее, включая 977 строк кода по состоянию на 9 мая 2022 года. Хотя я не буду вдаваться в мучительные подробности, в игре использовалась переменная «gameState», которая следовала за оператором switch в функции отрисовки. Благодаря этому каждое меню могло вести к следующему, просто изменяя переменную gameState при нажатии кнопки. Шаблоны были созданы с использованием массивов длиной 100. Теоретически это означает, что в Бесконечном режиме есть ограничение в 100 уровней, но, насколько мне известно, максимальный уровень, которого можно достичь без читерства, — это 19 уровень. Один массив инициализируется целым числом от 0 до 3 для представления четырех фигур (0 = прямоугольник, 1 = круг, 2 = квадрат, 3 = треугольник), а другой инициализируется значением -1. Затем игра считывает значения массива одно за другим и подсвечивает значение, выбранное в данный момент, пока не будет показан весь шаблон. Затем пользователь может ввести свой шаблон. Это просто присваивает пользовательскому массиву значение, соответствующее кнопке, которую нажимает пользователь. Каждый ввод проверяется в режиме реального времени, поэтому, если нажать не ту кнопку, игра мгновенно отправит пользователя на экран Game Over.

Тон.js

Звук был интегрирован с помощью Tone.js. Для стартового экрана использовался очень простой джингл с использованием PolySynth и PluckSynth. Он также повторно используется на экране Game Over, но темп замедляется, и с помощью PluckSynth воспроизводится другой трек, чтобы придать теме другой ритм. Это можно посмотреть в видео по ссылке выше.

Игра также воспроизводит короткий сигнал всякий раз, когда нажимается кнопка, и для каждой фигуры, когда отображается их рисунок. При этом используется отдельный PolySynth.

Мысли о будущем развитии

Я чувствую, что есть разные способы сделать игру более качественной и разнообразить удовольствие.

  • Создать режим VS. Это, пожалуй, самый простой и захватывающий способ изменить игру. В этом режиме два пользователя будут играть друг против друга, каждый добавляя паттерн в каждом цикле. Для реализации режима VS потребуется лишь слегка измененный код, при котором код проверяет совпадение первых n значений массива, затем записывает последнее значение в массив и переключается на ход следующего игрока. Это почти было включено в текущий проект, но из-за нехватки времени пришлось отказаться. (Кнопка «Не трогай меня» теперь находится на своем месте.)
  • Реализовать динамический звук: я считаю, что звуки, воспроизводимые при нажатии каждой кнопки, можно изменить для воспроизведения мелодии. Однако я хотел начать этот проект с каждой кнопки, связанной с определенным тоном, чтобы пользователь мог лучше отслеживать шаблон. Таким образом, если бы мелодия была реализована, она, скорее всего, выделялась бы как отдельный режим или даже отдельная опция, которую можно было бы включить.

Спасибо, что прочитали! Если у вас есть рекомендации по этому проекту, дайте мне знать!