1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

Логическая игра на android и другие платформы

Тема в разделе "Разработки форумчан", создана пользователем rrrFer, 17 фев 2015.

Наш партнер Genesis Hackspace
  1. rrrFer

    rrrFer Гость

    Логическая игра - ремейк классического "полного квадрата".
    Написана на C++, Qt, работает под Windows, Linux и Android.

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

    Исходный код игры выложен на bitbucket (можно скачать архив или использовать git): https://bitbucket.org/rrrfer-admin/hedgehog
    Игрушка выложена на гугл маркет: https://play.google.com/store/apps/details?id=org.qtproject.example.hedgenhog
    Процесс разработки игры описан (старая версия).

    По коду то, что сейчас лежит на маркете и в репозитории отличается от описания (по ссылке выше) во многом, поэтому опишу основные моменты.

    Игра состоит из уровней, которые хранятся в базе данных (SQLite). Однако, описывать уровень в базе не очень удобно - поэтому ресурсом является (встраивается в бинарник) небольшой файл с уровнями. При запуске игры информация из файла добавляется в базу, если в базе уже есть такой уровень (по ключу) - то ничего изменено не будет, иначе - будет добавлена запись. Т.е. чтобы добавить уровень достаточно добавить строку в файл.

    В базе данных хранится информация об уровнях - они могут быть пройдены. открыты или закрыты. Для работы с БД используется шаблон проектирования "фасад".

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

    Затем, игра разделяется на ряд экранов - экран помощи (с демоигрой, где есть подсказки), экран меню (выбор уровня) и экран игры.

    Для управления экранами сейчас используется стек виджетов.

    Виджет меню состоит из кнопок. Кнопка соответствует уровню и должна отражать его состояние (которое хранится в БД). В связи с этим БД нужна и кнопке и виджету игры, поэтому с базой уровней используется шаблон проектирования Singleton.

    В старой версии (которая описана) нарушался принцип инверсии зависимостей (DIP) - при движении ежика по игровому полю, поле отслеживала положение ежика и стен лабиринта и управляла его поведением. Из за этого добавить новый тип клеток игрового поля было трудно. Сейчас (см. в репозитории) еж сам перемещается и обращается к блокам, в которые собирается попасть чтобы узнать как они должны изменить его состояние.

    Логическая игра на android и другие платформы
     
    #1 rrrFer, 17 фев 2015
    Последнее редактирование: 17 фев 2015
  2. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.433
    Симпатии:
    31
    Забавно :) Снимаю шляпу за такую работу в качестве хобби. Буду играть на телефоне.
    По коду ничо сказать не могу, не мне тебя учить писать на ц++ :)

    Не совсем понятно зачем 2 бд в прилаге, SQLite и что-то еще? O_0
    Уровни сам придумывал?
    --- Добавлено 17 фев 2015. Первое сообщение размещено 17 фев 2015 ---
    Еще не понятно, почему маркет пишет, что игра не совместима с Android 2.3 ? Что в ней такого, что работает только на 4.4?
     
  3. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.433
    Симпатии:
    31
    А чо подсказка только для первого уровня работает?
     
  4. rrrFer

    rrrFer Гость

    Подсказка - это демо уровень. Т.е. чтобы юзер смог понять что именно от него требуют и потыкать на примере.

    9 Уровней придумал сам, 18 уровней взял из другой игры. Я там баловался с кодом (ну ты читал про DIP) и получилась достаточно гибкая штуковина. Я учился :) Сейчас без труда можно добавить новый тип тучки (будет еще 9 новых уровней).

    А вообще это писалось чтобы учиться, привести красивые примеры на блог. Ну например сейчас я планирую статью по SOLID и там будет пример из этой игры (по DIP). Я в последнее время прочитал кучу книг по проектированию и везде вижу, что описывается весьма уныло и часто очень спорно - поэтому пишу статьи. Но еще в книгах обычно очень неудачные примеры - я вот с двух книг Р. Мартина и книги М. Фаулера и статьи на мелкософте не понял (или понял, но "не прочувствовал" разницу между ISP и DIP). Без примеров тут нельзя ИМХО.
     
  5. rrrFer

    rrrFer Гость

    Ну смотри.
    1) Запустил ты игру, одна должна загрузить уровни.
    2) Уровни должны быть расположены на локальном компьютере (ведь не всегда есть интернет)

    внутри программы уровень у меня выглядит так:
    Код ( (Unknown Language)):
    <номер сета> <номер уровня на сете><состояние уровня><данные уровня>
    3) на ПК можно хранить эту инфу в файле, а можно в БД, но на андроиде - программа не может создать локальный файл, они использует лишь БД и там это решено как-то системно

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

    Потому что при обновлении надо ДОБАВИТЬ данные так, чтобы НЕ ЗАТЕРЕТЬ результаты которые уже есть (т.е. юзер прошел ряд уровней, обновился и не должно все сброситься).

    5) обновление под андройдом - это всегда загрузка нового .apk файла, т.е. ты не сможешь просто так добавить данные в БД, тебе придется грузить целый apk (а база данных, которая была у юзера с рекордами - останется старой)

    итак, загрузил ты новый .apk, но база с уровнями еще старая. Надо достать из apk новые уровни и запихать их в базу, которая на телефоне. В каком формате хранить данные внутри apk? - я храню в текстовом, мне это кажется удобнее и разумнее, т.к. это неизменяемые данные.

    Т.е. уровни я описываю в таком формате (это первые 2 уровня):
    Код ( (Unknown Language)):
    1 1 5 5 ......*...........*......
    1 2 5 5 *..........*.......*..*..
    А при запуске, открываю файл (который в ресурсах, а не на диске), считываю оттуда строки и впихиваю их в базу:
    Код (C++):
    void LevelDB::loadLevelsFromFile(QString filename) {
      QFile file(filename);
      QTextStream ifst(&file);
      file.open(QIODevice::ReadOnly);

      while (ifst.atEnd() == false) {
        int nSet, nLevel, n, m;
        QString data;

        ifst >> nSet >> nLevel >> n >> m >> data;
        if (ifst.status() == QTextStream::Status::ReadPastEnd)
          break;
        insert(nSet, nLevel, n, m, data, LevelStatus::Closed);
      }
      emit updated();
    }
    6) базы две, а не одна, т.к. я не думаю, что информацию о настройках стоит хранить в той же базе, что и уровни. В Qt есть специальная фича (QSettings) для хранения настроек, но я написал свою, т.к. встроенный вариант хранит по-разному (на андроид он использует SQLite, на Windows - использует реестр, а в linux - .ini-файлы) - я ну маю что это хорошо (особенно с реестром).
     
  6. rrrFer

    rrrFer Гость

    Вообще, основные проблемы при написании игрушек, я так понял, в художниках.
    Последний арт (который сейчас на маркете) обошелся мне в 4 тысячи. Это не дорого, но сначала мне обещали "сделаю так, что будет выглядеть на 20 тысяч, а еще сделаю.... и еще....", а потом "ну оно и выглядит на 4 тысячи".

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

    Но а перед тем, как найти того, кто нарисовал за 4 тысячи я пообщался с парой десятков художников, которые просили за 4 анимации тучки и 5 анимаций ежика от 30 до 150 тысяч рублей (в среднем тысяч 80). Пока я с ними общался я вообще пожалел что не умею рисовать ежиков, т.е. это однозначно выгоднее чем программировать.
     
  7. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.433
    Симпатии:
    31
    не могу пройти:stena::bigtears:
     
  8. rrrFer

    rrrFer Гость

    Ты ж программист :) - не можешь пройти сам, всегда можешь написать программу, которая сделает это.
    На каком уровне застрял то?
     
  9. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    428
    Симпатии:
    4
    игра довольно занимательная
    но есть ещё,что улучшать)
     
  10. rrrFer

    rrrFer Гость

    Да, есть багтрекер на битбукете. Сейчас надо как минимум:
    - поправить ошибку в демоигре;
    - добавить возможность "поделиться результатом в соцсетях" после прохождения уровня;
    - добавить еще 9 уровней (с новым видом тучки, который уже нарисован художником).

    По теме статьи собираюсь написать еще одну статью и потом перейти к следующей (хочу аналог picmi написать, т.к. я залип в нее на несколько дней). Писать хочу на QML, если есть желание поучаствовать - присоединяйся ))
     
  11. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.433
    Симпатии:
    31
    Добавить больше подсказок1один1один1
     
  12. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.433
    Симпатии:
    31
    И даже возможность купить за пару центов подсказку. И заработать миллион денег.
     
  13. rrrFer

    rrrFer Гость

    Один товарищ, уже давал такую идею. Но тут подсказка - это начальное положение ежика только. Но как по мне, если начальное положение выбрано - то задача уже слишком простая (даже не детский сад). Ну потому что изначально есть максимум 4 варианта движения (вверх, вниз, влево, вправо), после первого хода будет максимум 2 варианта движения, а дальше - чаще всего один вариант.

    Ну я подумаю над подсказками чтобы подсвечивать сектор, в котором может быть начальная позиция, но вряд-ли....
    Делать ее платной уж точно не собираюсь, деньги с нее я получаю с блога (статьи интересные получились), пусть и мало совсем, но явно больше чем возможно получить с подсказок или с рекламы внутри игры...
     
Загрузка...

Поделиться этой страницей