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

  • Автор темы Автор темы rrrFer
  • Дата начала Дата начала
R

rrrFer

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

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

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

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

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

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

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

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

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

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

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

ScreenShot-e1408266688719.png
 
Последнее редактирование:
Забавно :) Снимаю шляпу за такую работу в качестве хобби. Буду играть на телефоне.
По коду ничо сказать не могу, не мне тебя учить писать на ц++ :)

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

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

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

внутри программы уровень у меня выглядит так:
Код:
<номер сета> <номер уровня на сете><состояние уровня><данные уровня>

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

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

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

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

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

Т.е. уровни я описываю в таком формате (это первые 2 уровня):
Код:
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-файлы) - я ну маю что это хорошо (особенно с реестром).
 
Вообще, основные проблемы при написании игрушек, я так понял, в художниках.
Последний арт (который сейчас на маркете) обошелся мне в 4 тысячи. Это не дорого, но сначала мне обещали "сделаю так, что будет выглядеть на 20 тысяч, а еще сделаю.... и еще....", а потом "ну оно и выглядит на 4 тысячи".

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

Но а перед тем, как найти того, кто нарисовал за 4 тысячи я пообщался с парой десятков художников, которые просили за 4 анимации тучки и 5 анимаций ежика от 30 до 150 тысяч рублей (в среднем тысяч 80). Пока я с ними общался я вообще пожалел что не умею рисовать ежиков, т.е. это однозначно выгоднее чем программировать.
 
игра довольно занимательная
но есть ещё,что улучшать)
 
игра довольно занимательная
но есть ещё,что улучшать)
Да, есть багтрекер на битбукете. Сейчас надо как минимум:
- поправить ошибку в демоигре;
- добавить возможность "поделиться результатом в соцсетях" после прохождения уровня;
- добавить еще 9 уровней (с новым видом тучки, который уже нарисован художником).

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!