Всем принтов, здравствуйте!
По профессии я учитель информатики, но тащусь по разработке, алгоритмизации и программированию, просто мёдом не корми, дай что-нибудь пописать.
В последние несколько лет замечаю ужасную, с моей точки зрения, тенденцию. Даже ученики десятого-одиннадцатого класса очень слабо разбираются в арифметике. «Не чувствуют числа», я себе так говорю. Школьники помладше - там вообще тёмный лес. Без калькулятора большинство из них мало на какие вычисления способны :(
Дело даже не в знании формул и каких-то манипуляций с этими самыми формулами. Проблемой является элементарное неумение считать «на лету» без калькулятора, хотя бы числа в пределах сотни-другой. А в программировании много математики, и от меня требуют детей научить. Нет, слово «требуют» - это одна сторона вопроса, скорее, официальная. Мне самому, как преподавателю, приятно, когда мои же воспитанники делают успехи, добиваются, удивляют... и когда с ними можно начать обсуждать и продвигать какие-то интересные идеи в коде.
Решил встать на святой путь борьбы за сильную арифметику. Как? Сделать головоломку! Суть которой достаточно проста - манипулируй числами и добивайся единичек. Механика проста: есть два вида чисел - оранжевые и синие. Оранжевые, тёплые, - положительные числа. Синие, холодные, отрицательные.
То есть если к положительному 15 прибавить отрицательное 3, то результатом будет 12. А если прибавить отрицательное 14, то получится искомая единица.
Комбинации могут быть совершенно простыми (на первых уровнях), и неявными, требующими некоторых перестановок. Например, суммирования чисел 3, 4, 5 и вычитания из результата числа 11: вжух! Появилась единица.
Операции инициируются перетягиванием чисел одно на другое; под игровым полем есть очередь следующих чисел.
Чтобы немного разнообразить игру, ввёл «инверсию». Это поле, получающееся при результате -1 (например, +10 -11). Предназначение поля - инверсия знака перемещённого на него числа.
Чтобы усложнить процесс - ввёл правило: единица должна быть получена не позднее, чем за три перемещения. Иначе проигрыш. И получать единицы можно только на определённых местах, они обозначены зелёными линиями под фишками (горизонталь и вертикаль, горизонталь и вертикаль без угловых, главная и побочная диагонали в зависимости от сложности).
Искренне надеюсь, что эта нехитрая головоломка по самопальным правилам немного разовьёт чувство числа у детей (да и у взрослых), буду благодарен за подсказки и комментарии.
Технически: реализовано на LibGDX. Текстуры, звуки, вся «анимация» - моё, из инструментов Android Studio, Gimp и Audacity. Предложил друзьям написать музыку, что они и сделали (спасибо большое!)
Схематично алгоритм прост. Есть двумерный массив, хранящий классы фишек. Числа для всех, кроме последнего, уровней берутся из заранее подготовленных «датасетов» (слово громкое).
Уровень с рандомом - генерация с таким расчётом, чтобы при математике всех присутствующих в игре чисел всегда получалась единица.
И дальше в ход вступает элементарное перетаскивание объектов. Сложностей, в общем, не возникало. Самое длинное по времени - около двух недель - обрабатывал правила головоломки, чтобы они стали интересны хотя бы мне :)
Алгоритм и реализация не так сложны, как рождение идеи и правил головоломки.
Первую версию написал с "делением и умножением" вместо "сложения и вычитания". Результирующие числа получались огромными и неявными, было очень сложно подбирать комбинации для получения единицы.
Перешёл на "сложение и вычитание", ввёл экспериментальные «бриллианты», появляющиеся в том случае, если в результате операции получался ноль. Но что с этим нулём делать так и не придумал, выпилил (закомментировал). Сейчас нули получать нельзя.
Первоначально «инверсия» работала как «чёрная дыра». Суть «чёрной дыры» заключалась в «проглатывании» единичек. Обобщённое правило звучало так: надо получить единицу, закинуть в чёрную дыру и так 15 раз. Было довольно сложно, ведь сначала надо получить чёрную дыру, потом единицу... даже я, не жалующийся на арифметику, дымился в поисках комбинаций так, чтобы за три хода была сделана либо дыра, либо единица.
Механику выпилил (закомментировал :D)
Сейчас единицы автоматически улетают с поля, когда собираются по четыре штуки на означенных выше "зелёных линиях сборки" (ничего умней не придумал, чего уж...)
Для привлечения внимания сделал небольшой «сервер», хранящий рекорды всех пользователей. Можно сравнить свои достижения с достижениями других игроков. Всё анонимно и без регистраций (передаются только номера уровней и очки).
В общем, мораль истории проста: не так сложно реализовать игру, как придумать и продумать идею, которая будет более-менее работоспособна.
А ещё большая мораль: продумывайте всё от начала и до конца! Иначе уложите кучу времени на доделки и переделки.
Затрачено времени: две недели на программный код и валяние на диване с тестированием программы, две недели на идею, в итоге проект забрал месяц работы по вечерам.
Спасибо большое за внимание, этой мой первый пост, и я робею странной робостью и трепещу неземных трепетом перед взором старших коллег, надеюсь на снисхождение :)
Игра бесплатная, но с рекламой перед запуском, начиная со старших уровней. Страница головоломки в Google Play: https://play.google.com/store/apps/details?id=ru.vgtrofimov....