Разработка мобильной 2D-игры «Составь слова из слова»
Предыстория
Как-то обычным летним вечером ехал домой с работы в метро и увидел у одного парня игру на планшете, где нужно составлять слова из букв. Скачал ее на свой планшет и начал играть. Поиграв какое-то время, понял, что некоторые особенности можно было бы реализовать поудобнее, и решив, что я могу сделать игрушку минимум не хуже, принялся за реализацию.
Работа со словарями
Имея некоторый опыт работы с БД Oracle, решил что обработку словарей буду вести в ней (Oracle 11.2 XE). Накачал в интернете несколько словарей в виде текстовых файлов с разделителями и с помощью механизма External Table загрузил в БД. Из загруженных слов отобрал 700 существительных длиной 8–10 букв. Это как раз и будут те слова, из букв которых игроки будут вести составление. Далее необходимо для каждого из этих 700 слов подобрать набор слов, которые можно из него составить. Для этого нужно проиндексировать все слова, чтобы можно было делать поиск по вхождению букв.
Создаем вью поверх таблицы со словами:
create or replace view words_parsed_v as
select word,
regexp_count(word, 'а') as а,
regexp_count(word, 'б') as б,
regexp_count(word, 'в') as в,
regexp_count(word, 'г') as г,
regexp_count(word, 'д') as д,
regexp_count(word, 'е') as е,
regexp_count(word, 'ж') as ж,
regexp_count(word, 'з') as з,
regexp_count(word, 'и') as и,
regexp_count(word, 'й') as й,
regexp_count(word, 'к') as к,
regexp_count(word, 'л') as л,
regexp_count(word, 'м') as м,
regexp_count(word, 'н') as н,
regexp_count(word, 'о') as о,
regexp_count(word, 'п') as п,
regexp_count(word, 'р') as р,
regexp_count(word, 'с') as с,
regexp_count(word, 'т') as т,
regexp_count(word, 'у') as у,
regexp_count(word, 'ф') as ф,
regexp_count(word, 'х') as х,
regexp_count(word, 'ц') as ц,
regexp_count(word, 'ч') as ч,
regexp_count(word, 'ш') as ш,
regexp_count(word, 'щ') as щ,
regexp_count(word, 'ъ') as ъ,
regexp_count(word, 'ы') as ы,
regexp_count(word, 'ь') as ь,
regexp_count(word, 'э') as э,
regexp_count(word, 'ю') as ю,
regexp_count(word, 'я') as я
from words;
-- вытащим 5 строк для примера
select * from words_parsed_v where rownum <= 5;
word | а | б | в | г | д | е | ж | з | и | й | к | л | м | н | о | п | р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ы | ь | э | ю | я |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
аквариум | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
акварель | 2 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
траншея | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
генерал | 1 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
диплом | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Далее с использованием этой вью делается нехитрый алгоритм поиска «вложенных» слов для каджого «главного» слова.
Стоит отметить, что кроме автоматической обработки так же не обошлось и без ручного труда по фильтрации всех частей речи, кроме существительных, правка орфографических ошибок и т.д.
Взаимодействие с online-словарями
Так как не для всех слов в словарях было толкование, то и тут пришлось извращаться. Написал процедуру, которая с неким интервалом обращается к онлайн словарям и вытягивает описание. Понять логику работы процедуры поможет простейший пример:
-- Oracle PL/SQL
create or replace function get_url_dic_academic(p_word varchar2) return varchar2 as
begin
return 'http://dic.academic.ru/searchall.php?SWord=' || p_word || '&from=xx&to=ru&did=&stype=';
end;
/
select httpuritype(get_url_dic_academic('биология')).GetClob() as rst
from dual;
Результат последнего запрос спрятан под спойлер. Его обработкой занимается написанный мною парсер с использованием регулярных выражений, код которого приводить здесь я не вижу смысла.
Словари и энциклопедии на Академике
биология
1 БИОЛОГИЯ — БИОЛОГИЯ. Содержание: I. История биологии.............. 424 Витализм и машинизм. Возникновение эмпирических наук в XVI XVIII вв. Возникновение и развитие эволюционной теории. Развитие физиологии в XIX в. Развитие клеточного учения. Итоги XIX века …
2 БИОЛОГИЯ — (греч., от bios жизнь, и logos слово). Наука о жизни и ее проявлениях у животных и растений. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910. БИОЛОГИЯ греч., от bios, жизнь, и logos, слово. Учение о жизненной силе.… …
3 БИОЛОГИЯ — (от био... и ...логия), совокупность наук о живой природе. Предмет Б. все проявления жизни: строение и функции живых существ и их природных сообществ, распространение, происхождение и развитие, связи друг с другом и с неживой природой. Задачи Б.… …
4 БИОЛОГИЯ — (от био... и ...логия) совокупность наук о живой природе об огромном многообразии вымерших и ныне населяющих Землю живых существ, их строении и функциях, происхождении, распространении и развитии, связях друг с другом и с неживой природой.… …
5 Биология — (от био... и ...логия), совокупность наук о живой природе. Биология изучает строение и функции организмов и их сообществ, происхождение, распространение, развитие, связи организмов друг с другом и с неживой природой. Биология устанавливает… …
6 биология — БИОЛОГИЯ (от греч. bio жизнь и logos слово, учение) совокупность наук о жизни во всем разнообразии проявления ее форм, свойств, связей и отношений на Земле. Впервые термин был предложен одновременно и независимо друг от друга в 1802… …
7 БИОЛОГИЯ — (от био... и ..логия), совокупность наук о живой природе. Предметом изучения биологии является жизнь во всех ее проявлениях. Термин "биология” предложили Ж. Б. Ламарк и Г. Р. Тревиранус независимо друг от друга (1802). Экологический… …
8 биология — и, ж. biologie f. 1. Комплекс научных дисциплин о живой природе, о закономерностях органической жизни. БАС 2. Ему < Антуану Батисту Пьеру Антуану де Моне шевалье де Ламарк>.. принадлежала заслуга введения в научный обиход самого термина… …
9 БИОЛОГИЯ — БИОЛОГИЯ, наука о жизни и живых организмах. К ней относятся ботаника, зоология, экология, физиология, цитология, генетика, таксономия, эмбриология и микробиология. Все эти отрасли науки посвящены изучению происхождения, истории, строения,… …
10 БИОЛОГИЯ — БИОЛОГИЯ, биологии, мн. нет, жен. (от греч. bios жизнь и logos учение). Общее учение о жизни органического мира. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 …
11 БИОЛОГИЯ — БИОЛОГИЯ, и, жен. Совокупность наук о живой природе, о закономерностях органической жизни. Космическая б. (изучающая жизнедеятельность организмов в условиях космоса). | прил. биологический, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю.… …
12 БИОЛОГИЯ — (от греч. bios – жизнь и logos – учение) наука о жизни, основанная на данных психологии, ботаники, зоологии, антропологии. Формы жизни и их структура изучаются морфологией, которая как органология, анатомия и гистология ставит себе целью… …
13 биология — сущ., кол во синонимов: 73 • агробиология (1) • актинобиология (1) • альгология (3) …
14 биология — — [http://www.dunwoodypress.com/148/PDF/Biotech Eng Rus.pdf] Тематики биотехнологии EN biology …
15 Биология — Биология ¦ Biologie Наука о живых организмах и о жизни вообще. Нетрудно заметить, что существование биологии как науки отнюдь не может служить резоном к тому, чтобы жить, и даже к тому, чтобы заниматься биологией. Тем не менее все наши… …
16 Биология — * біялогія * biology учение о жизни, включающее в себя систему наук: зоологию, ботанику, генетику, физиологию, экологию и др. Изучает общие и частные закономерности проявления жизни. Основная цель исследования выявление основных свойств,… …
17 Биология — У этого термина существуют и другие значения, см. Биология (значения). Биология (греч. ???????? ???, био, жизнь; др. греч. ????? учение, наука) система наук, объектами изучения которой являются живые существа и их взаимодействие с… …
18 Биология — (от Био... и ...Логия совокупность наук о живой природе. Предмет изучения Б. все проявления жизни: строение и функции живых существ и их природных сообществ, их распространение, происхождение и развитие, связи друг с другом и с неживой… …
19 биология — и; ж. [от греч. bios жизнь и logos учение] 1. Комплексная наука о живой природе и закономерностях органической жизни. / Об отдельных направлениях или разделах этой науки. Молекулярная, космическая б. // Учебный предмет, излагающий эту науку.… …
20 Биология — I Биология (греч. bios жизнь + logos учение) совокупность естественных наук о жизни как особом явлении природы. Предметом изучения служат строение, функционирование, индивидуальное и историческое (эволюция) развитие организмов, взаимоотношения их …
Само собой, результат такой обработки также требует ручной правки.
Разработка приложения
Приложение собиралось в среде разработки кроссплатформенных приложений Marmalade SDK на языке программирования C++. Попытаюсь привести UML-диаграмму, отображающая классы приложения, их основные свойства и методы.
Главный класс приложения, с которым оперирует цикл обработки событий — класс Application.
Класс MainScreen — класс, отвечающий за отрисовку стартового экрана приложения. Выглядит он так:
LevelGroupScreen отвечает за отрисовку таблицы уровней группы:
LevelScreen — отрисовка основного экрана, отвечающего за игровой процесс:
ImageResource — класс, отвечающий за манипуляцию с изображениями-иконками.
Класс Application содержит указатели на все эти классы скринов, а так же на класс ImageResource.
При вызове Application.Init () последовательно создает экземпляры этих классов и инициализирует их.
Атрибут ActiveScreen хранит информацию о том, какой из экранов сейчас активен, чтобы при необходимости вызывать на активном экране методы обработки ввода (OnClick, OnMove) и перерисовки (Draw).
Метод UpdateInputзанимается обработкой событий ввода, инициируемых пользователем и передаваемых приложению от операционной системы.
Каждый из экранов при необходимости может обратиться к ImageResource для получения из памяти того или иного изображения.
Соответственно, при закрытии приложения последовательно вызываются деструкторы всех объектов.
Подводя итоги
Те проблемы, которые я увидел в исходном приложении, я решил в своем:
- поддержка книжной и альбомной ориентации экрана;
- возможность масштабировать шрифт;
- выделение слова при повторном вводе;
- сортировка слов по длине (по убыванию) и алфавиту;
- поддержка жестов, в том числе и zoom-жестов;
- огромное количество уровней.
Для тех, кому интересна реализация: Android, iOS.