Совмещаем «детский» микроконтроллер и настольные игры

Подарили мне недавно Micro: Bit. Который для обучения школьников, от BBC и сейчас имеет возрастающую популярность (особенно после того, как китайцы пообещали вот-вот сделать его клон дешевле раза в два). Я сам знаком с Arduino, был одним из пионеров, который у нас в стране показал, как скрестить Arduino со средой Scratch и эта платка… меня на первых порах не заинтересовала. Но чуть позже родилась идея:, а не скрестить ли ее с настольными играми?

Я сам автор «настолок», их фанат. И наличие достаточно дружелюбной среды программирования (изначально плата программируется на Python и Java, но есть блочная среда с симулятором) заставило попробовать реализовать эту идею.

Сразу предупрежу — я не программист! И это хорошо, так как мои изыскания сможет повторить даже школьник младших классов и любой из вас. И сделать себе «кастомное» устройство, помогающее и упрощающее жизнь с настольными играми.

oy4kblrkx0ocryum76l3lvmfh9g.png
Первой в голову пришла идея реализовать обычные игральные кубики D6 (которые от 1 до 6). Сказано-сделано. Запустив среду makecode.microbit.org я набросал простую программу, которая при нажатии кнопки А генерирует случайное число от 1 до 6 и выводит его на светодиодную матрицу устройства.

Для «украшения» кода добавил пару картинок «генерации» кубика и вуаля. Готов простой электронный кубик.

vycfe5ynv9scohmoi26cru-fgt0.png

А если надо кубик D12? Генерируем случайное число до 12. А D20? До 20 конечно-же. Но проблема в том, что на «экране» помещается только одна цифра и две цифры прокручиваются, но только один раз по команде вывода их на матрицу. Что делать? Пришлось добавлять переменную хранения результата, циклы показа и повторять значение последнего броска кости по нажатию на кнопку B.

r1bdbm7ch1lbbkjoib3mgixmuhm.png

Заменив событие нажатия кнопки на считывание «тряски» (в Micro: Bit есть акселерометр) можно сделать процесс «бросания» более реалистичным.

А если надо бросить два кубика? Задача стала интересней. Плюс захотелось сделать игральные кубики как положено с точками. Благо матрица (размером 5×5) состоит из достаточно далеко расположенных светодиодов и если их зажигать даже рядом, то можно легко различить, где «единичка», а где «шестерка».

Теперь я делал «игральные кубики» для игр типа Монополии и Колонизаторы (где кидают 2 кубика) или Мачи Коро (где при игре надо кидать один или два кубика D6). Но проблема встала в отображении этих бросков.

Как я написал выше, матрица у Micro: Bit 5×5. Для отображения обычного шестигранного кубика нам нужно 3×3 светодиода.

hxf3ms2zs5--_utqdt1f8mcbrcy.png

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

Обнаружив, что команда while плохо сочетается со считыванием событий нажатия кнопок и написав костыльную систему из переменных и их проверки я получил нужный мне результат. По нажатию на кнопку А генерировался один кубик, на B — два кубика, A+B выключали экран и приводили систему в начальное состояние.

Также решил «подрихтовать» генератор случайных чисел по простой формуле dice = round (random (от 50 до 649)/100). «Кубики» стали выпадать чуть реалистичней.

Итоговый «монстрокод» получился вот такой (код непосредственно вывода графики кубиков не влез, так как он уходит далеко вниз).

ip58mjcvnzacncun4ilgqxf28ea.png

А результат работы можно глянуть на видео:


Уже что-то интересное. Причем за счет сдвига по углам можно последовательно выводить аж 5 кубиков и их можно достаточно легко считать последовательно.

А можно сделать что-то еще? В моей новой настольной игре «Карточная лига Пароботов» кубики будут использоваться для двух вещей: определение бонуса для игроков в текущем раунде и определение команды для роботов-ботов на игровом поле. Поэтому было решено реализовать следующее:

  1. Счетчик раундов (их всего 8)
  2. Определение Бонуса в текущем раунде (кнопка А)
  3. Определение команды Бота (кнопка B)
  4. Переход к следующему раунду (повторное нажатие кнопки А)


Я реализовал «кастомные» кубики, выводя на экран сразу символ выпавшей карты бонуса (или N, если его нет) и инфографики команд Бота — стрелок перемещения (вперед, назад, повороты влево-вправо, удар и защита).

zuobvz42-1wqbov5v6icducnn-m.png

Как работает программа видно на видео:


Так как загружать в Micro: Bit просто (достаточно подключить его через микро-USB к компьютеру и перекинуть в корень появившегося диска hex-файл программы), я сделал у себя на сайте страницу, где хочу размещать готовые «пресеты» для разных настольных игр: www.simplerobot.org/elektronika

Там можно найти как готовые hex-файлы, так и ссылку на исходные коды. Пользуйтесь на здоровье. Купить плату же можно в той же Амперке или «у китайцев» на Али.

Что хочется еще сделать? Во-первых «отвязать» плату от внешнего питания, прикрутив к ней шилд для батареек.

1q6fa_omlvv2ascnob6rds4laro.png

Во-вторых попробовать реализовать на основе платы «аутомату» для игры в одиночку с компьютерным соперником и задействовать встроенный компас и акселерометр.

Если вы создадите свою кастомную программу для настольной игры и пришлете ее мне, с удовольствие размещу ее на сайте. Или могу сделать по вашему запросу (в меру моих способностей и ограничений платы).

Habrahabr.ru прочитано 5559 раз