• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Логическая игра на 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
 
Последнее редактирование:
V

vital

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

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

vital

А чо подсказка только для первого уровня работает?
 
R

rrrFer

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

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

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

rrrFer

Не совсем понятно зачем 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-файлы) - я ну маю что это хорошо (особенно с реестром).
 
R

rrrFer

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

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

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

Whatka

игра довольно занимательная
но есть ещё,что улучшать)
 
R

rrrFer

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

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

vital

Добавить больше подсказок1один1один1
 
V

vital

И даже возможность купить за пару центов подсказку. И заработать миллион денег.
 
R

rrrFer

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

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

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