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

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

  1. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Логическая игра - ремейк классического "полного квадрата".
    Написана на 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) - при движении ежика по игровому полю, поле отслеживала положение ежика и стен лабиринта и управляла его поведением. Из за этого добавить новый тип клеток игрового поля было трудно. Сейчас (см. в репозитории) еж сам перемещается и обращается к блокам, в которые собирается попасть чтобы узнать как они должны изменить его состояние.

    [​IMG]
     
    #1 rrrFer, 17 фев 2015
    Последнее редактирование модератором: 17 фев 2015
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

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

    Не совсем понятно зачем 2 бд в прилаге, SQLite и что-то еще? O_0
    Уровни сам придумывал?
    [DOUBLEPOST=1424182402,1424182316][/DOUBLEPOST]Еще не понятно, почему маркет пишет, что игра не совместима с Android 2.3 ? Что в ней такого, что работает только на 4.4?
     
  3. vital

    vital Больной Компом Детектед
    Команда форума Web Team

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Подсказка - это демо уровень. Т.е. чтобы юзер смог понять что именно от него требуют и потыкать на примере.

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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Ну смотри.
    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 Well-Known Member
    Команда форума C\C++ Team

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

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

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

    vital Больной Компом Детектед
    Команда форума Web Team

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Ты ж программист :) - не можешь пройти сам, всегда можешь написать программу, которая сделает это.
    На каком уровне застрял то?
     
  9. Whatka

    Whatka Well-Known Member

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

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

    vital Больной Компом Детектед
    Команда форума Web Team

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

    vital Больной Компом Детектед
    Команда форума Web Team

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

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

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