Оглавление "Программирование для игр"

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

Для разогрева возьмём аккорды в основном виде - трезвучия и септаккорды. Эти аккорды состоят из терций – интервалы с тремя ступенями, которые бывают большие и малые. Трезвучия состоят из двух терций, а септаккорды – из трёх. Для получения всех аккордов переберём все варианты расположения терций в аккордах. Два интервала дадут 4 варианта, а три – 8.

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

У нас есть три позиции для расположений интервалов. При этом возможны такие состояния: большая терция - “b”, малая - “m” и нет ничего - “”. В любой из позиций может отсутствовать интервал, но тогда в двух оставшихся позициях интервалы должны быть. Название аккорда кодируется последовательностью букв.

Трезвучия:

bm – мажорное трезвучие
mb – минорное трезвучие
bb – увеличенное трезвучие
mm – уменьшённое трезвучие

Септаккорды

mmm – уменьшенный
mmb – полууменьшенный
mbm – малый минорный
mbb – большой минорный
bmm – малый мажорный (доминантсептаккорд)
bmb – большой минорный
bbm – увеличенный
bbb –

У bbb нет названия, потому что это не септаккорд. В четырёхголосном изложении это увеличенное трезвучие с удвоенной примой. Отсюда возникает ещё одно условие: если в первых двух позициях стоит ”b”, то в последней должно быть только “m” или ””.

Для хранения данных выберем формат JSON с набором свойств:

{
“bm”:”мажорное трезвучие”,
“mb”:”минорное трезвучие”,
…,
“bbm”:”увеличенный септаккорд”
}

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



Это что это за непонятная куча блоков? После запуска проекта с таким решением выяснится две проблемы: синтезатор речи произносит букву ”е” в слове ”септаккорд” как ”е”, что режет слух, а вместо случайной выборки аккордов чаще всего выпадают трезвучия, как имеющие три, а не один вариант генерации. Например, мажорное трезвучие получится из строк ”nbm“, “bnm“ и “bmn“ после замены символа “n“ на пустую строку.

С этим вариантом можно было бы ещё повозится, но уже сейчас видны проблемы. Хотелось сделать приложение ”крутым” со случайной генерацией терций, а в результате получилась куча блоков, для исправления нюансов работы которой придётся городить ещё одну кучу блоков. Одним словом, зашли в болото и безопаснее выбрать другой путь, а “ломить” через него.

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

“бм:мажорное трезвучие,мб:минорное трезвучие,бб:увеличенное трезвучие,мм:уменьшённое трезвучие,ммм:уменьшенный сэптаккорд,ммб:полууменьшенный сэптаккорд,мбм:малый минорный сэптаккорд,мбб:большой минорный сэптаккорд,бмм:малый мажорный сэптаккорд,бмб:большой минорный сэптаккорд,ббм:увеличенный сэптаккорд”

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

Блочный код проекта


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

Для компактности вида я не стал вводить функции start и getName, но и так понятно, что на этапе инициализации мы создаём список пар с разделителем ":", а при нажатии на полноэкранном холсте происходит генерация случайного индекса, получение по нему элемента, разбиение элемента на список пар и озвучивание последнего значения пары. Воспроизведение слова "сэптаккорд" звучит ещё хуже. Остановимся на "китайском" звучании и произведём обратную замену на "септаккорд".

При необходимости можно озвучивать не название аккорда, а его интервальный состав. В этом случае получить первый элемент пары можно по индексу first или 1.

Для увеличения функциональности приложения добавьте в проект случайную генерацию названия ноты, от которой нужно строить аккорд. Ещё более сложное приложение получится, если дополнить варианты аккордов их обращениями. И для чего так себя напрягать? Об этом мы узнаем на следующем занятии.