Как создавалось приложение MafiaDroid

Рассказывает создатель приложения MafiaDroid для Android


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

Игра является результатом изучения теории игр Мафия с точки зрения математики. И очень нежелательного, но пока обязательного атрибута — один человек должен быть ведущим.

Весь процесс разработки можно разделить на две большие части:

  • Ядро с реализацией минимально необходимой логики;
  • Реализация на Android.

(Разработка ядра очень простая, но, по-моему, в ней есть много интересных моментов, и для описания нужен отдельный рассказ, поэтому сейчас только Android.)

Предисловие — «а с чего всё началось…»

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

Чтобы стало понятно о чём конкретно идёт речь, расскажу правила, по которым играли именно мы:

Вся игра разбита на два процесса.

  • «Ночь» — игроки в закрытую выполняют свои функции:
    • идёт подсчёт «выживших»;
    • умершие выбывают из игры;
    • если условия победы не выполнены — наступает день.
  • «День» — игроки обсуждают в открытую, кого они хотят «казнить»:
    • идёт подсчёт «выживших»;
    • умершие выбывают из игры;
    • если условия победы не выполнены, наступает ночь.

И так, пока не объявится победитель (или ничья).

Теперь про само приложение.

Есть готовая библиотека (библиотека классов Java. То самое ядро в виде .jar, которое я собрал в NetBeans) с реализованными и работающими элементами: игроки, роли, действия.

Осталось реализовать логику на аппарате и дизайн. Обычно, при реализации какого-либо проекта, я решаю комплекс задач. Желательно изучать новое. А здесь попробовать новые фичи дизайна (перелистывания экранов, если конкретно, работа с ViewFlipper и SeekBar), логирование, прикручивание GoogleAnalitics, прикручивание AdMob с рекламой.

Разработка длилась около 6-ти месяцев (включая ядро). Всё из-за занятости на основной работе. Но получалось умело использовать комбинацию Acer Aspire One + Debian + NetBeans + Git. (Работал тогда выездным, и ядро писалось «на коленке» в NetBeans.) Проект именно для смартфона писался в Android Studio дома.

pic0

Внешний вид приложения

Фичи, которые я использовал и про которые узнал:

  • Т.к. версия всё ещё тестируется, для особо любопытных был прикручен отладочный лог с подробным выводом действий всех игроков и результатов игры. По пути /mnt/sdcard/Mafia создаётся файл (название выбирается в зависимости от даты).
  • GoogleAnalytics и AdMob имеют инструменты, позволяющие отслеживать действия, совершённые пользователями на их телефонах, и выдавать эту информацию разработчику (AdMob ещё платит за рекламу, но я пока не разбирался по поводу вывода денег). У меня получилось подключить и настроить эти службы. Есть несколько подводных камней, которые не описываются в стандартных туториалах. Хочу поделиться опытом:
    • Для отслеживания действий с рекламой необходим «код отслеживания», так вот, он необходим не один, а для каждого рекламного элемента (баннер, видео и т.д.). И необходимо сначала каждый элемент, который вы хотите использовать в приложении, зарегистрировать на сайте AdMob. Потом на него сгенерируется уникальный ключ (в мане от гугла написано просто «ключ» и понимай как хочешь). И вот ещё ссылка на stackoverflow, где я получил ответ (наткнулся на это обсуждение на 5-7 странице поиска, в этом обсуждении человек задаёт вопрос по поводу этих непоняток, а потом сам отвечает и описывает как он допёр до этих сверхочевидных преобразований).
    • Как оказалось, любопытство и кривые руки берут своё. Моя реализация по идее должна была позволять одному игроку ночью делать все его грязные делишки, а после передавать телефон другому игроку, и тот должен был как-либо разблокировать доступ к личной информации. Была поставлена кнопка «Проснуться» (как блок). На деле она случайно нажималась ещё до передачи нужному человеку. Поэтому теперь блок представляет из себя сложный SeekBar, который необходимо передвинуть, строго схватившись за рычажок и протянув ровно до конца. Если процесс прервётся, то придётся начинать сначала. А если сделать всё правильно, то вы увидите, как на фоне просыпается рожица.pic0
    • Также слайдер пришлось добавить для персонажей без действий, чтобы такого человека было сложнее вычислить. Как оказалось, после этого игроки, которые поняли как и что делать, просто выбирают жертву и стреляют. Теперь это занимает 3 секунды. А когда телефон попадает мирному жителю, после 10 секунд можно услышать матные комментарии в сторону неудобного слайдера. Так что эта система скорее нуждается в доработке, чем идеальна.
    • Ролей для игры нужно указывать конкретное количество (роли == игроки). Поэтому была идея реализовать для каждой NumberPicker. Он является стандартным элементом в Android и включает в себя систему хранения и изменения значений (самый простой его вид — это целые числа в заданном диапазоне — то, что доктор прописал). Роли выводились в списке а для каждой нужно было вставлять в элемент списка NumberPicker. Самое интересное, что его старая версия содержит текст и две кнопки, а вот новая содержит систему с пролистыванием и красивым выводом. Оказывается, новый конфликтует своим вертикальным скролом с родительским вертикальным скролом. Его можно настроить, но это делается очень неудобно, и в итоге получается неприятный инструмент, который не будет выполнять своих функций, но будет отторгать нажатия пальцев хозяина. Совет — проверяйте функционал приложения на разных версиях андроида.pic0
    • ViewFlipper оказался очень даже приятным для ознакомления. Огромной пользы я от него не получил, но научился им пользоваться и создал два экрана в меню предподготовки Игроки/Роли, между которыми можно перемещаться, пролистывая пальцем по экрану. Реализация мне показалась интересной. Я немного поколдовал и сделал из этого выезжающие из края экрана уведомления (в данном приложении они будут выезжать внизу и будут с красным текстом).
    • Самым сложным для меня, пожалуй, стал процесс блокирования персонажей. Свобода создаёт возможность такого конфликта: две роли заблокируют друг друга (получается если блокировка сработает, то она не сработает 0_о и наоборот — замкнутый круг). В реальной мафии нет правил по поводу того, что одна роль важнее другой. Поэтому подобные случаи нужно обговаривать заранее и у меня не получилось однозначно обыграть данную ситуацию так, чтобы не изменять и правила мафии и мою систему.
    • Для создания иконок в приложении (иконки кнопок +/-, иконки ДЕНЬ/НОЧЬ и тд) я использовал сервис Android Asset Studio — очень удобный инструмент для создания иконок для сразу 5 размеров экранов. Так же есть дополнительные инструменты по типу nine-patch. Все результаты можно скачать в виде архива с папкой res, в которой уже правильно размещены все изображения которые вам необходимы (чтобы добавить изображения можно просто перекинуть в папку с проектом папку res). Всем советую не тратить время на велосипеды, а пользоваться готовыми онлайн сервисами по типу этого, если такое возможно.

Данная версия бесплатная и имеет в себе специально урезанный функционал. Можно выбрать не более 15ти игроков. На выбор только 4 роли (Мафия, Доктор, Комиссар, Мирный житель) и есть ограничения по количеству игроков и ролей. Также есть строгие правила о количестве мафии относительно городских. Все эти параметры нельзя менять, но планируется подарить эти и ещё несколько дополнительных возможностей в платной версии приложения. Мой функционал позволяет реализовать главную идею — кастомизацию ролей и правил игры внутри приложения. Чтобы стало понятно, например, можно будет создавать такие сложные роли, как «внебрачный ребёнок босса». Он является городским жителем, но при этом на проверку он определяется как мафия, и ещё мафия не может его убить.

Ядро лежит на гитхабе (проект NetBeans). Само приложение на GooglePlay.

Приложение уже тестировалось на моих друзьях и логических ошибок выявлено не было. Буду благодарен за помощь в поиске багов :)

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

pic0

Внешний вид приложения

Спасибо!