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



Работа со словарями


Имея некоторый опыт работы с БД 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-словарями


Так как не для всех слов в словарях было толкование, то и тут пришлось извращаться. Написал процедуру, которая с неким интервалом обращается к онлайн словарям и вытягивает описание. Понять логику работы процедуры поможет простейший пример:


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;

Результат последнего запрос спрятан под спойлер. Его обработкой занимается написанный мною парсер с использованием регулярных выражений, код которого приводить здесь я не вижу смысла.


Результат запроса rst
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Словари и энциклопедии на Академике</title>
    <meta name="Description" content="Словари и энциклопедии на Академике" />
    <!--meta http-equiv="Content-Language" content="ru" /-->
    <meta name="Keywords" content="Словари, Энциклопедии, поиск, термины, описания" />
    <meta name="inmobi-site-verification" content="b8995e33d3169f217a2278195a66e8c3">
    <script type="text/javascript" src="/js/adfox.asyn.code.ver3.js"> </script>
        <!--[if IE]>
    <meta http-equiv="cleartype" content="on" />
    <meta http-equiv="msthemecompatible" content="no"/>
    <![endif]-->

    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">

    <meta name="revisit-after" content="15 days" />
    <meta name="rating" content="safe for kids" />
    <meta property="og:title" content="" />
    <meta property="og:type" content="article" />
    <meta property="og:url" content="" />
    <meta property="og:image" content="/images/Logo_social_ru.png?3" />
    <meta property="og:description" content="Словари и энциклопедии на Академике" />
    <meta property="og:site_name" content="Словари и энциклопедии на Академике" />
    <link rel="search" type="application/opensearchdescription+xml" title="Словари и энциклопедии на Академике" href="/dicsearch.xml" />
    <meta name="ROBOTS" content="NOINDEX, FOLLOW" />

<!-- DFP   -->

<script type='text/javascript'>
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
(function() {
var gads = document.createElement('script');
gads.async = true;
gads.type = 'text/javascript';
var useSSL = 'https:' == document.location.protocol;
gads.src = (useSSL ? 'https:' : 'http:') +
'//www.googletagservices.com/tag/js/gpt.js';
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(gads, node);
})();
</script>

<script type='text/javascript'>
// --== Google DFP ==--
googletag.cmd.push(function() {
googletag.defineSlot('/59581491/top_bnr', [[728, 90], [970, 90]], 'div-gpt-ad-topline').addService(googletag.pubads());
googletag.defineSlot('/59581491/right-top', [240, 400], 'div-gpt-ad-right-top').addService(googletag.pubads());
//googletag.defineSlot('/59581491/right_bnr', [240, 400], 'div-gpt-ad-right-1').addService(googletag.pubads());
//googletag.defineSlot('/59581491/right_bnr', [240, 400], 'div-gpt-ad-right-2').addService(googletag.pubads());

// Установим переменные таргетинга для всей страницы
googletag.pubads().setTargeting("lang", "ru");      // ru, en, de, es, fr
googletag.pubads().setTargeting("pageType", "search");      // main, article, search, book, contents
googletag.pubads().setTargeting("segment", "");        // Рекламный сегмент

googletag.pubads().collapseEmptyDivs();

googletag.pubads().enableSingleRequest();
googletag.enableServices();
});
</script>
<!-- /DFP   -->

<style type="text/css">div.hidden,#TerminsNavigationBar,#ad_bottom,#ad_right,#ad_top,#ad_top2,#contextmenu,#dic-query,#footer ul+div,#lang,#langbar,#logo img.h,#restrictions,#search-box .translate-lang,#search-tabs,#sharemenu,#t-direction-head,#top-menu,#translate-arrow,.smm,div.autosuggest{display:none}p,ul{list-style-type:none;margin:0 0 15px}ul li{margin-bottom:6px}.content ul{list-style-type:disc}*{padding:0;margin:0}body,html{height:100%}body{padding:0;margin:0;color:#000;font:14px Helvetica,Arial,Tahoma,sans-serif;background:#fff;line-height:1.5em}a{color:#0d44a0;text-decoration:none}h1{font-size:24px;margin:0 0 18px}h2{font-size:20px;margin:0 0 14px}h3{font-size:16px;margin:0 0 10px}h1 a,h2 a{color:#454545!important}#page{margin:0 auto;min-height:100%;position:relative;padding-top:105px;width:745px;padding-right:255px}* html #page{height:100%}#header{position:relative;height:122px}#logo{float:left;margin-top:21px;width:125px}#logo a.img{width:90px;margin:0 0 0 16px}#logo a.img.logo-en{margin-left:13px}#logo a{display:block;font-size:12px;text-align:center;word-break:break-all}#site-title{padding-top:35px;margin:0 0 5px 135px}#site-title a{color:#000;font-size:18px;font-style:italic;display:block;font-weight:400}#search-box{margin-left:135px;border-top-right-radius:3px;border-bottom-right-radius:3px;padding:4px;position:relative;background:#abcf7e;min-height:33px}#search-box.dic{background:#896744}#search-box table{border-spacing:0;border-collapse:collapse;width:100%}#search-box table td{padding:0;vertical-align:middle}#search-box table td:first-child{padding-right:3px}#search-box table td:last-child{width:1px}#dic-query,#search-query,.translate-lang{padding:6px;font-size:16px;border:1px solid #949494;width:100%;box-sizing:border-box;height:32px;margin:0;background:#fff;float:left;border-radius:0!important}#search-button{width:70px;height:32px;text-align:center;border:1px solid #7a8e69;border-radius:3px;background:#e0e0e0}#search-tabs{display:block;margin:0 15px 0 135px;padding:0;list-style-type:none}#search-tabs li{float:left;min-width:70px;max-width:140px;padding:0 15px;height:23px;line-height:23px;background:#bde693;text-align:center;margin-right:1px}#search-box.dic+#search-tabs li{background:#C9A784}#search-tabs li:last-child{border-bottom-right-radius:3px}#search-tabs li a{color:#353535;font-style:italic;font-size:12px;display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}#search-tabs li.active{height:22px;line-height:23px;position:relative;background:#abcf7e;border-bottom-left-radius:3px;border-bottom-right-radius:3px}#search-box.dic+#search-tabs li.active{background:#896744}#search-tabs li.active a{color:#fff}#content{clear:both;margin:30px 0;padding-left:15px}#content a{text-decoration:underline}#content .breadcrumb{margin-bottom:20px}#search_links,#search_sublinks{margin-bottom:8px;margin-left:-8px}#search_links a,#search_sublinks a{padding:3px 8px 1px;border-radius:2px}#search_links a.active,#search_sublinks a.active{color:#000!important;background:#bde693;text-decoration:none!important}.term{color:#8b4513}@media (max-width:767px){.hideForMobile{display:none}#header{height:auto}#page{padding:5px;width:auto}#logo{float:none;width:144px;text-align:left;margin:0;padding-top:5px}#logo a{height:44px;overflow:hidden;text-align:left}#logo img.h{display:initial;width:144px;height:44px}#logo img.v{display:none}#site-title{padding:0;margin:10px 0 5px}#search-box,#search-tabs{clear:both;margin:0;width:auto;padding:4px}#search-box.translate #search-query{width:100%;margin-bottom:4px}#search-box.translate #td-search{overflow:visible;display:table-cell}ul#search-tabs{white-space:nowrap;margin-top:5px;overflow-x:auto;overflow-y:hidden}ul#search-tabs li,ul#search-tabs li.active{background:0 0!important;box-shadow:none;min-width:0;padding:0 5px;float:none;display:inline-block}ul#search-tabs li a{border-bottom:1px dashed green;font-style:normal;color:green;font-size:16px}ul#search-tabs li.active a{color:#000;border-bottom-color:#fff;font-weight:700}ul#search-tabs li a:hover,ul#search-tabs li.active a:hover{color:#000}#content{margin:15px 0}}#search_results{margin-left:23px}.terms-list .item{float:left;margin:2px 0 0 -108px;position:relative;width:100px;color:#898989;font-size:11px;text-align:right}</style>
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" sizes="16x16" />
    <link rel="shortcut icon" href="/images/icon.ico" type="image/x-icon" sizes="32x32" />
    <link rel="shortcut icon" href="/images/icon.ico" type="image/x-icon" sizes="48x48" />

<!--[if lt IE 9]>
 <script type="text/javascript" src="/js/html5shiv.js"></script>
<![endif]-->

<!--[if lte IE 8]>
    <script type="text/javascript" src="/js/ierange.js"></script>
<![endif]-->

<!--[if lte IE 6]>
    <script type="text/javascript" src="/js/ie-hover-pack.js"></script>
<![endif]-->

<!--  test -->
<!-- Yandex -->
<script type="text/javascript"><!--
yandex_site_charset = 'UTF-8';
// Размер шрифтов
var yandex_ad_fontSize = 1;
// Настройки объявлений Директа
var yandex_direct_fontColor = '000000';
var yandex_direct_titleColor = '0000CC';
var yandex_direct_siteurlColor = '006600';
var yandex_direct_linkColor = '0000CC';
function yandex_direct_print(){ }
// Настройки объявлений Маркета
var yandex_market_fontColor = '000000';
// var yandex_market_BorderColor = 'E3D8F4';
var yandex_market_BorderColor = 'FFFFFF'; // 'E3D8F4';
var yandex_market_BgColor = 'FFFFFF'; // 'F5F1FB';
var yandex_market_headerBgColor = 'FFFFFF';
var yandex_market_catColor = '777278';
var yandex_market_offerlinkColor = '0B57AC';
var yandex_market_linkColor = '0B57AC';
function yandex_market_print(){ }
// Настройки Спец. размещения
var yandex_premium_fontColor = '000000';
var yandex_premium_titleColor = '0000CC';
var yandex_premium_siteurlColor = '006600';
function yandex_premium_print(){ }
var yandex_r = Math.round(Math.random() * 100000);
//--></script>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
  (adsbygoogle = window.adsbygoogle || []).push({
    google_ad_client: "ca-pub-8594606551930257",
    enable_page_level_ads: true
  });
</script>

<script type="text/javascript" async src="https://relap.io/api/v6/head.js?token=JLTNw8NHQr9CHRgd"></script>
<script type="text/javascript">
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-2754246-1', 'auto');
  ga('require', 'displayfeatures');

//  ga('set', 'dimension1', '');
  ga('set', 'dimension2', 'search');
//  ga('set', 'campaignKeyword', dimensionValue1);

  ga('send', 'pageview', {'dimension1':''});
</script>

<script type="text/javascript">
    if(typeof(console) == 'undefined' ) console = {};
    if(typeof(console.log) == 'undefined' ) console.log = function(){};
    if(typeof(console.warn) == 'undefined' ) console.warn = function(){};
    if(typeof(console.error) == 'undefined' ) console.error = function(){};
    if(typeof(console.time) == 'undefined' ) console.time = function(){};
    if(typeof(console.timeEnd) == 'undefined' ) console.timeEnd = function(){};
    Academic = {};
    Academic.sUserLanguage = 'ru';
    Academic.sDomainURL = '';
    Academic.sMainDomainURL = 'http://dic.academic.ru/';
    Academic.sTranslateDomainURL = 'http://translate.academic.ru/';
        Academic.Lang = {};
    Academic.Lang.sTermNotFound = 'Термин, отвечающий запросу, не найден';
</script>

</head>
<body>
    <div id="page">
            <div id="header">
                <div id="logo">
                    <a href="http://dic.academic.ru">
                        <img src="/images/Logo.png" class="v" alt="dic.academic.ru" width="88" height="68" />
                        <img src="/images/Logo_h.png" class="h" alt="dic.academic.ru" width="88" height="68" />
                        <br />
                        dic.academic.ru                 </a>
                </div>
                    <ul id="top-menu">
                        <li id="lang">
                            <a href="#" class="link">RU</a>

                            <ul id="lang-menu">
                            <li><a href="http://www.enacademic.com">EN</a></li>
<li><a href="http://www.deacademic.com">DE</a></li>
<li><a href="http://www.fracademic.com">FR</a></li>
<li><a href="http://www.esacademic.com">ES</a></li>
                            </ul>
                        </li>
                        <!--li><a class="android" href="http://dic.academic.ru/android.php">Android версия</a></li-->
                        <!--li><a class="apple" href="http://dic.academic.ru/apple.php">iPhone/iPad версия</a></li-->
                        <li><a class="add-fav link" href="#" onClick="add_favorite(this);">Запомнить сайт</a></li>
                        <li><a href="http://partners.academic.ru/partner_proposal.php" target="_blank">Словарь на свой сайт</a></li>
                        <!--li><a href="#">Форум</a></li-->
                    </ul>
                    <h2 id="site-title">
                        <a href="http://dic.academic.ru">Словари и энциклопедии на Академике</a>
                    </h2>

                    <div id="search-box">
                        <form action="http://dic.academic.ru/searchall.php" method="get" name="formSearch">

<table><tr><td id="td-search">

                            <input type="text" name="SWord" id="search-query" required="1"
                            value="биология"
                            title="Введите текст для поиска по словарям и энциклопедиям" placeholder="Введите текст для поиска по словарям и энциклопедиям"
                            autocomplete="off" autofocus>

<div class="translate-lang">
    <select name="from" id="translateFrom">
                <option value="xx">Все языки</option><option value="ab">Абхазский</option><option value="ad">Адыгейский</option><option value="az">Азербайджанский</option><option value="ay">Аймара</option><option value="ai">Айнский язык</option><option value="ak">Акан</option><option value="sq">Албанский</option><option value="al">Алтайский</option><option value="en">Английский</option><option value="ar">Арабский</option><option value="an">Арагонский</option><option value="hy">Армянский</option><option value="rp">Арумынский</option><option value="at">Астурийский</option><option value="af">Африкаанс</option><option value="bb">Багобо</option><option value="eu">Баскский</option><option value="ba">Башкирский</option><option value="be">Белорусский</option><option value="bg">Болгарский</option><option value="bu">Бурятский</option><option value="cy">Валлийский</option><option value="wr">Варайский</option><option value="hu">Венгерский</option><option value="vp">Вепсский</option><option value="hs">Верхнелужицкий</option><option value="vi">Вьетнамский</option><option value="ht">Гаитянский</option><option value="el">Греческий</option><option value="ka">Грузинский</option><option value="gn">Гуарани</option><option value="gd">Гэльский</option><option value="da">Датский</option><option value="dl">Долганский</option><option value="pr">Древнерусский язык</option><option value="he">Иврит</option><option value="yi">Идиш</option><option value="in">Ингушский</option><option value="id">Индонезийский</option><option value="ik">Инупиак</option><option value="ga">Ирландский</option><option value="is">Исландский</option><option value="es">Испанский</option><option value="it">Итальянский</option><option value="yo">Йоруба</option><option value="kk">Казахский</option><option value="kc">Карачаевский</option><option value="ca">Каталанский</option><option value="qy">Квенья</option><option value="qu">Кечуа</option><option value="ky">Киргизский</option><option value="zh">Китайский</option><option value="go">Клингонский</option><option value="kv">Коми</option><option value="ko">Корейский</option><option value="cr">Кри</option><option value="ct">Крымскотатарский</option><option value="kp">Кумыкский</option><option value="ku">Курдский</option><option value="km">Кхмерский</option><option value="la">Латинский</option><option value="lv">Латышский</option><option value="ln">Лингала</option><option value="lt">Литовский</option><option value="lb">Люксембургский</option><option value="mu">Майя</option><option value="mk">Македонский</option><option value="ms">Малайский</option><option value="ma">Маньчжурский</option><option value="mi">Маори</option><option value="mj">Марийский</option><option value="mc">Микенский</option><option value="mf">Мокшанский</option><option value="mn">Монгольский</option><option value="nu">Науатль</option><option value="de">Немецкий</option><option value="nl">Нидерландский</option><option value="og">Ногайский</option><option value="no">Норвежский</option><option value="oa">Орокский</option><option value="os">Осетинский</option><option value="ot">Османский</option><option value="pi">Пали</option><option value="pm">Папьяменто</option><option value="pa">Пенджабский</option><option value="fa">Персидский</option><option value="pl">Польский</option><option value="pt">Португальский</option><option value="ro">Румынский, Молдавский</option><option value="ru">Русский</option><option value="sa">Санскрит</option><option value="se">Северносаамский</option><option value="sr">Сербский</option><option value="ld">Сефардский</option><option value="sz">Силезский</option><option value="sk">Словацкий</option><option value="sl">Словенский</option><option value="sw">Суахили</option><option value="tl">Тагальский</option><option value="tg">Таджикский</option><option value="th">Тайский</option><option value="tt">Татарский</option><option value="tw">Тви</option><option value="bo">Тибетский</option><option value="tf">Тофаларский</option><option value="tv">Тувинский</option><option value="tr">Турецкий</option><option value="tk">Туркменский</option><option value="ud">Удмурдский</option><option value="uz">Узбекский</option><option value="ug">Уйгурский</option><option value="uk">Украинский</option><option value="ur">Урду</option><option value="uu">Урумский</option><option value="fo">Фарерский</option><option value="fi">Финский</option><option value="fr">Французский</option><option value="hi">Хинди</option><option value="hr">Хорватский</option><option value="cu">Церковнославянский (Старославянский)</option><option value="ch">Чаморро</option><option value="ke">Черкесский</option><option value="ck">Чероки</option><option value="ce">Чеченский</option><option value="cs">Чешский</option><option value="cv">Чувашский</option><option value="cn">Шайенского</option><option value="sv">Шведский</option><option value="cj">Шорский</option><option value="sx">Шумерский</option><option value="ev">Эвенкийский</option><option value="gw">Эльзасский</option><option value="mv">Эрзянский</option><option value="eo">Эсперанто</option><option value="et">Эстонский</option><option value="ya">Юпийский</option><option value="sh">Якутский</option><option value="ja">Японский</option> </select>
</div>
<div id="translate-arrow"><a>&nbsp;</a></div>
<div class="translate-lang">
    <select name="to" id="translateOf">
                <option value="xx">Все языки</option><option value="ab">Абхазский</option><option value="av">Аварский</option><option value="ad">Адыгейский</option><option value="az">Азербайджанский</option><option value="ay">Аймара</option><option value="ai">Айнский язык</option><option value="sq">Албанский</option><option value="al">Алтайский</option><option value="en">Английский</option><option value="ar">Арабский</option><option value="hy">Армянский</option><option value="af">Африкаанс</option><option value="eu">Баскский</option><option value="ba">Башкирский</option><option value="be">Белорусский</option><option value="bg">Болгарский</option><option value="hu">Венгерский</option><option value="vp">Вепсский</option><option value="vd">Водский</option><option value="vi">Вьетнамский</option><option value="ht">Гаитянский</option><option value="gl">Галисийский</option><option value="el">Греческий</option><option value="ka">Грузинский</option><option value="da">Датский</option><option value="pr">Древнерусский язык</option><option value="he">Иврит</option><option value="yi">Идиш</option><option value="iz">Ижорский</option><option value="in">Ингушский</option><option value="id">Индонезийский</option><option value="ga">Ирландский</option><option value="is">Исландский</option><option value="es">Испанский</option><option value="it">Итальянский</option><option value="yo">Йоруба</option><option value="kk">Казахский</option><option value="kc">Карачаевский</option><option value="ca">Каталанский</option><option value="qy">Квенья</option><option value="qu">Кечуа</option><option value="zh">Китайский</option><option value="go">Клингонский</option><option value="ko">Корейский</option><option value="ct">Крымскотатарский</option><option value="kp">Кумыкский</option><option value="ku">Курдский</option><option value="km">Кхмерский</option><option value="la">Латинский</option><option value="lv">Латышский</option><option value="ln">Лингала</option><option value="lt">Литовский</option><option value="jp">Ложбан</option><option value="mu">Майя</option><option value="mk">Македонский</option><option value="ms">Малайский</option><option value="mt">Мальтийский</option><option value="mi">Маори</option><option value="mj">Марийский</option><option value="mf">Мокшанский</option><option value="mn">Монгольский</option><option value="de">Немецкий</option><option value="nl">Нидерландский</option><option value="no">Норвежский</option><option value="os">Осетинский</option><option value="pi">Пали</option><option value="pm">Папьяменто</option><option value="pa">Пенджабский</option><option value="fa">Персидский</option><option value="pl">Польский</option><option value="pt">Португальский</option><option value="ps">Пушту</option><option value="ro">Румынский, Молдавский</option><option value="ru" selected>Русский</option><option value="sr">Сербский</option><option value="sk">Словацкий</option><option value="sl">Словенский</option><option value="sw">Суахили</option><option value="tl">Тагальский</option><option value="tg">Таджикский</option><option value="th">Тайский</option><option value="ta">Тамильский</option><option value="tt">Татарский</option><option value="tr">Турецкий</option><option value="tk">Туркменский</option><option value="ud">Удмурдский</option><option value="uz">Узбекский</option><option value="ug">Уйгурский</option><option value="uk">Украинский</option><option value="ur">Урду</option><option value="uu">Урумский</option><option value="fo">Фарерский</option><option value="fi">Финский</option><option value="fr">Французский</option><option value="hi">Хинди</option><option value="hr">Хорватский</option><option value="cu">Церковнославянский (Старославянский)</option><option value="ch">Чаморро</option><option value="ck">Чероки</option><option value="ce">Чеченский</option><option value="cs">Чешский</option><option value="cv">Чувашский</option><option value="sv">Шведский</option><option value="cj">Шорский</option><option value="ev">Эвенкийский</option><option value="gw">Эльзасский</option><option value="mv">Эрзянский</option><option value="eo">Эсперанто</option><option value="et">Эстонский</option><option value="sh">Якутский</option><option value="ja">Японский</option> </select>
</div>
<input type="hidden" name="did" id="did-field" value="" />
<input type="hidden" id="search-type" name="stype" value="0" />

</td><td>

                            <button id="search-button">Найти!</button>

</td></tr></table>

                        </form>

                        <input type="text" name="dic_query" id="dic-query"
                        title="Интерактивное оглавление. Вводите нужный Вам термин" placeholder="Интерактивное оглавление. Вводите нужный Вам термин"
                        autocomplete="off" autofocus>

                    </div>
                     <ul id="search-tabs">
                                                 <li data-search-type="0" id="interpretations" class="active"><a href="#" onclick="return false;">Толкования</a></li>
                         <li data-search-type="1" id="translations" ><a href="#" onclick="return false;">Переводы</a></li>
                         <li data-search-type="10" id="books"  ><a href="#" onclick="return false;">Книги</a></li>
                         <!-- li data-search-type="11" id="cinemas" ><a href="#" onclick="return false;">Фильмы</a></li -->
                     </ul>
                </div>

    <div id="ad_top2"><div class="banner"></div><!--BETWEEN SSP CODE V2.0 START--><script type="text/javascript">var between_type="adj";document.write('<script type = "text/javascript" src = "http://cache.betweendigital.com/sections/149534.js"></scr'+'ipt>')</script><!--BETWEEN SSP END-->
</div>          <div id="content">

<div id="search_results">

                        <h1 id="title">биология</h1>
<div id="search_links">                     <a class="active" >Толкование</a>
                        <a href="http://translate.academic.ru/биология/ru/">Перевод</a>
                        <a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=10">Книги</a>
                        <a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=11">Фильмы</a>
</div><!----><ul class="terms-list" id="found_articles">
<li><p><span class="item">1</span> <strong><a href="http://big_medicine.academic.ru/2478/%D0%91%D0%98%D0%9E%D0%9B%D0%9E%D0%93%D0%98%D0%AF">БИОЛОГИЯ</a></strong> — БИОЛОГИЯ. Содержание: I. История биологии.............. 424 Витализм и машинизм. Возникновение эмпирических наук в XVI XVIII вв. Возникновение и развитие эволюционной теории. Развитие физиологии в XIX в. Развитие клеточного учения. Итоги XIX века …</p>
<p class="src"><a href="http://big_medicine.academic.ru/">Большая медицинская энциклопедия</a></p>
</li>
<li><p><span class="item">2</span> <strong><a href="http://dic.academic.ru/dic.nsf/dic_fwords/7704/%D0%91%D0%98%D0%9E%D0%9B%D0%9E%D0%93%D0%98%D0%AF">БИОЛОГИЯ</a></strong> — (греч., от bios жизнь, и logos слово). Наука о жизни и ее проявлениях у животных и растений. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910. БИОЛОГИЯ греч., от bios, жизнь, и logos, слово. Учение о жизненной силе.&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/dic_fwords/">Словарь иностранных слов русского языка</a></p>
</li>
<li><p><span class="item">3</span> <strong><a href="http://dic.academic.ru/dic.nsf/dic_biology/627/%D0%91%D0%98%D0%9E%D0%9B%D0%9E%D0%93%D0%98%D0%AF">БИОЛОГИЯ</a></strong> — (от био... и ...логия), совокупность наук о живой природе. Предмет Б. все проявления жизни: строение и функции живых существ и их природных сообществ, распространение, происхождение и развитие, связи друг с другом и с неживой природой. Задачи Б.&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/dic_biology/">Биологический энциклопедический словарь</a></p>
</li>
<li><p><span class="item">4</span> <strong><a href="http://dic.academic.ru/dic.nsf/enc3p/72882">БИОЛОГИЯ</a></strong> — (от био... и ...логия) совокупность наук о живой природе об огромном многообразии вымерших и ныне населяющих Землю живых существ, их строении и функциях, происхождении, распространении и развитии, связях друг с другом и с неживой природой.&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/enc3p/">Большой Энциклопедический словарь</a></p>
</li>
<li><p><span class="item">5</span> <strong><a href="http://illustrated_dictionary.academic.ru/1345/%D0%91%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">Биология</a></strong> — (от био... и ...логия), совокупность наук о живой природе. Биология изучает строение и функции организмов и их сообществ, происхождение, распространение, развитие, связи организмов друг с другом и с неживой природой. Биология устанавливает&#8230; …</p>
<p class="src"><a href="http://illustrated_dictionary.academic.ru/">Иллюстрированный энциклопедический словарь</a></p>
</li>
<li><p><span class="item">6</span> <strong><a href="http://epistemology_of_science.academic.ru/79/%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">биология</a></strong> —         БИОЛОГИЯ (от греч. bio жизнь и logos слово, учение) совокупность наук о жизни во всем разнообразии проявления ее форм, свойств, связей и отношений на Земле. Впервые термин был предложен одновременно и независимо друг от друга в 1802&#8230; …</p>
<p class="src"><a href="http://epistemology_of_science.academic.ru/">Энциклопедия эпистемологии и философии науки</a></p>
</li>
<li><p><span class="item">7</span> <strong><a href="http://dic.academic.ru/dic.nsf/ecolog/2771/%D0%91%D0%98%D0%9E%D0%9B%D0%9E%D0%93%D0%98%D0%AF">БИОЛОГИЯ</a></strong> — (от био... и ..логия), совокупность наук о живой природе. Предметом изучения биологии является жизнь во всех ее проявлениях. Термин “биология” предложили Ж. Б. Ламарк и Г. Р. Тревиранус независимо друг от друга (1802). Экологический&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/ecolog/">Экологический словарь</a></p>
</li>
<li><p><span class="item">8</span> <strong><a href="http://gallicismes.academic.ru/6493/%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">биология</a></strong> — и, ж. biologie f. 1. Комплекс научных дисциплин о живой природе, о закономерностях органической жизни. БАС 2. Ему &LT; Антуану Батисту Пьеру Антуану де Моне шевалье де Ламарк&GT;.. принадлежала заслуга введения в научный обиход самого термина&#8230; …</p>
<p class="src"><a href="http://gallicismes.academic.ru/">Исторический словарь галлицизмов русского языка</a></p>
</li>
<li><p><span class="item">9</span> <strong><a href="http://dic.academic.ru/dic.nsf/ntes/492/%D0%91%D0%98%D0%9E%D0%9B%D0%9E%D0%93%D0%98%D0%AF">БИОЛОГИЯ</a></strong> — БИОЛОГИЯ, наука о жизни и живых организмах. К ней относятся ботаника, зоология, экология, физиология, цитология, генетика, таксономия, эмбриология и микробиология. Все эти отрасли науки посвящены изучению происхождения, истории, строения,&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/ntes/">Научно-технический энциклопедический словарь</a></p>
</li>
<li><p><span class="item">10</span> <strong><a href="http://dic.academic.ru/dic.nsf/ushakov/747586">БИОЛОГИЯ</a></strong> — БИОЛОГИЯ, биологии, мн. нет, жен. (от греч. bios жизнь и logos учение). Общее учение о жизни органического мира. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/ushakov/">Толковый словарь Ушакова</a></p>
</li>
<li><p><span class="item">11</span> <strong><a href="http://dic.academic.ru/dic.nsf/ogegova/12178">БИОЛОГИЯ</a></strong> — БИОЛОГИЯ, и, жен. Совокупность наук о живой природе, о закономерностях органической жизни. Космическая б. (изучающая жизнедеятельность организмов в условиях космоса). | прил. биологический, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю.&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/ogegova/">Толковый словарь Ожегова</a></p>
</li>
<li><p><span class="item">12</span> <strong><a href="http://dic.academic.ru/dic.nsf/enc_philosophy/1852/%D0%91%D0%98%D0%9E%D0%9B%D0%9E%D0%93%D0%98%D0%AF">БИОЛОГИЯ</a></strong> — (от греч. bios – жизнь и logos – учение) наука о жизни, основанная на данных психологии, ботаники, зоологии, антропологии. Формы жизни и их структура изучаются морфологией, которая как органология, анатомия и гистология ставит себе целью&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/enc_philosophy/">Философская энциклопедия</a></p>
</li>
<li><p><span class="item">13</span> <strong><a href="http://dic.academic.ru/dic.nsf/dic_synonims/9343/%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">биология</a></strong> — сущ., кол во синонимов: 73 • агробиология (1) • актинобиология (1) • альгология (3) …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/dic_synonims/">Словарь синонимов</a></p>
</li>
<li><p><span class="item">14</span> <strong><a href="http://technical_translator_dictionary.academic.ru/14640/%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">биология</a></strong> — &mdash; [http://www.dunwoodypress.com/148/PDF/Biotech Eng Rus.pdf] Тематики биотехнологии EN biology …</p>
<p class="src"><a href="http://technical_translator_dictionary.academic.ru/">Справочник технического переводчика</a></p>
</li>
<li><p><span class="item">15</span> <strong><a href="http://philosophy_sponville.academic.ru/220/%D0%91%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">Биология</a></strong> —  Биология  ¦ Biologie    Наука о живых организмах и о жизни вообще. Нетрудно заметить, что существование биологии как науки отнюдь не может служить резоном к тому, чтобы жить, и даже к тому, чтобы заниматься биологией. Тем не менее все наши&#8230; …</p>
<p class="src"><a href="http://philosophy_sponville.academic.ru/">Философский словарь Спонвиля</a></p>
</li>
<li><p><span class="item">16</span> <strong><a href="http://genetics_dictionary.academic.ru/913/%D0%91%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_">Биология </a></strong> — * біялогія * biology учение о жизни, включающее в себя систему наук: зоологию, ботанику, генетику, физиологию, экологию и др. Изучает общие и частные закономерности проявления жизни. Основная цель исследования выявление основных свойств,&#8230; …</p>
<p class="src"><a href="http://genetics_dictionary.academic.ru/">Генетика. Энциклопедический словарь</a></p>
</li>
<li><p><span class="item">17</span> <strong><a href="http://dic.academic.ru/dic.nsf/ruwiki/55">Биология</a></strong> — У этого термина существуют и другие значения, см. Биология (значения). Биология (греч. ???????? ???, био, жизнь; др. греч. ?????&#160; учение, наука)&#160; система наук, объектами изучения которой являются живые существа и их взаимодействие с&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/ruwiki/">Википедия</a></p>
</li>
<li><p><span class="item">18</span> <strong><a href="http://dic.academic.ru/dic.nsf/bse/69404/%D0%91%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">Биология</a></strong> — (от Био... и ...Логия         совокупность наук о живой природе. Предмет изучения Б. все проявления жизни: строение и функции живых существ и их природных сообществ, их распространение, происхождение и развитие, связи друг с другом и с неживой&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/bse/">Большая советская энциклопедия</a></p>
</li>
<li><p><span class="item">19</span> <strong><a href="http://dic.academic.ru/dic.nsf/es/8884/%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">биология</a></strong> — и; ж. [от греч. bios жизнь и logos учение] 1. Комплексная наука о живой природе и закономерностях органической жизни. / Об отдельных направлениях или разделах этой науки. Молекулярная, космическая б. // Учебный предмет, излагающий эту науку.&#8230; …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/es/">Энциклопедический словарь</a></p>
</li>
<li><p><span class="item">20</span> <strong><a href="http://dic.academic.ru/dic.nsf/enc_medicine/4642/%D0%91%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F">Биология</a></strong> — I Биология (греч. bios жизнь + logos учение) совокупность естественных наук о жизни как особом явлении природы. Предметом изучения служат строение, функционирование, индивидуальное и историческое (эволюция) развитие организмов, взаимоотношения их …</p>
<p class="src"><a href="http://dic.academic.ru/contents.nsf/enc_medicine/">Медицинская энциклопедия</a></p>
</li>
</ul>
<div class="page-nav">
<strong>Страницы </strong>
<ul class="arrow">
    <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=1"><span>Следующая</span>&nbsp;&#8594;</a></li>
</ul>
<ul>
  <li class="active">1</li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=1">2</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=2">3</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=3">4</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=4">5</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=5">6</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=6">7</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=7">8</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=8">9</a></li>
  <li><a href="/searchall.php?SWord=%D0%B1%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F&amp;stype=0&amp;btype=1&amp;p=9">10</a></li>
</ul>
</div>

</div>

            </div>
    <div id="ad_bottom">
<div style="text-align: center;">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 336x280, создано 08.10.08 -->
<ins class="adsbygoogle"
     style="display:inline-block;width:740px;height:280px"
     data-ad-client="ca-pub-8594606551930257"
     data-ad-slot="6157433105"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>

<div class="banner"></div>

<!-- Яндекс.Директ -->
<div id="yandex_ad"></div>
<script type="text/javascript">
(function(w, d, n, s, t) {
    w[n] = w[n] || [];
    w[n].push(function() {
        Ya.Direct.insertInto(48186, "yandex_ad", {
            ad_format: "direct",
            font_size: 1,
            type: "grid",
            limit: 4,
            title_font_size: 3,
            links_underline: true,
            site_bg_color: "FFFFFF",
            header_bg_color: "FEEAC7",
            title_color: "0000CC",
            url_color: "006600",
            text_color: "000000",
            hover_color: "0066FF",
            sitelinks_color: "0000CC",
            favicon: true,
            no_sitelinks: false
        });
    });
    t = d.getElementsByTagName("script")[0];
    s = d.createElement("script");
    s.src = "//an.yandex.ru/system/context.js";
    s.type = "text/javascript";
    s.async = true;
    t.parentNode.insertBefore(s, t);
})(window, document, "yandex_context_callbacks");
</script>

</div>
    <div id="footer">
                <div id="liveinternet">
                    <!--LiveInternet counter--><script type="text/javascript"><!--
                    document.write("<a href='http://www.liveinternet.ru/click' "+
                    "target=_blank style='border-bottom: none;'><img src='http://counter.yadro.ru/hit?t44.6;r"+
                    escape(document.referrer)+((typeof(screen)=="undefined")?"":
                    ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
                    screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
                    ";h"+escape(document.title.substring(0,80))+";"+Math.random()+
                    "' alt='' title='LiveInternet' "+
                    "border='0' width='31' height='31'><\/a>")
                    //--></script><!--/LiveInternet-->
                </div>

<div id="restrictions">16+</div>

                &copy; Академик, 2000-2014

<ul>
            <li>
                Обратная связь:
                <a id="m_s" href="#">Техподдержка</a>,
                <a id="m_a" href="#">Реклама на сайте</a>
            </li>
</ul>
<div>

            <a href="http://partners.academic.ru/partner_proposal.php">Экспорт словарей на сайты</a>, сделанные на PHP, <div class="img joom"></div> Joomla, <div class="img drp"></div> Drupal, <div class="img wp"></div> WordPress, MODx.
</div>

    </div>

    <script async src="/js/academic.min.js?150324" type="text/javascript"></script>

    <!--script type="text/javascript" src="/js/cl.js"></script>
    <script src="/js/select2/select2.min.js"></script-->

    <!--script type="text/javascript" src="https://apis.google.com/js/plusone.js"-->
            <!--/script-->

<div id="ad_right">
    <div class="banner">

<div id='div-gpt-ad-right-top' style='width:240px; height:400px;'>

    <script type='text/javascript'>
    googletag.cmd.push(function() { googletag.display('div-gpt-ad-right-top'); });
    </script>
    </div>

</div>

<div class="banner">

<!-- Yandex.Premium 21881 -->
<div id="yandex_premium_21881"></div>
<script type="text/javascript"><!--
(function(w, d, n, s, t) {
   function renderDirect () {
       Ya.Direct.insertInto("21881", "yandex_premium_21881", {
            ad_format: "premium",
            type: "vertical",
            limit: 3,
            favicon: true,
            no_sitelinks: false,
            sitelinks_color: "0000CC",
            title_font_size: 3,
            font_size: 1,
            site_bg_color: "FFFFFF",
            title_color: "0000CC",
            text_color: "000000",
            url_color: "006600",
            hover_color: "0000CC",
            links_underline: true,

            search_text: "биология",
            search_page_number: 1
        });
    }

    w[n] = w[n] || []; w[n].push(renderDirect); 
    t = d.getElementsByTagName("script")[0];
    s = d.createElement("script");
    s.type = "text/javascript";
    s.src = "//an.yandex.ru/system/context.js";
    s.async = true;
    t.parentNode.insertBefore(s, t);
})(window, document, "yandex_context_callbacks"); //--></script>

</div> 

<!--AdFox START-->
<!--dic.academic.ru-->
<!--Площадка: dic.academic.ru / * / *-->
<!--Тип баннера: 240x400-->
<!--Расположение: <верх страницы>-->
<!-- ________________________AdFox Asynchronous code START__________________________ --> 
<script type="text/javascript"> 
<!--
if (typeof(pr) == 'undefined') { var pr = Math.floor(Math.random() * 4294967295) + 1; }
if (typeof(document.referrer) != 'undefined') {
  if (typeof(afReferrer) == 'undefined') {
    afReferrer = encodeURIComponent(document.referrer);
  }
} else {
  afReferrer = '';
}
var addate = new Date();

var dl = encodeURIComponent(document.location);
var pr1 = Math.floor(Math.random() * 4294967295) + 1;

document.write('<div id="AdFox_banner_'+pr1+'"><\/div>');
document.write('<div style="visibility:hidden; position:absolute;"><iframe id="AdFox_iframe_'+pr1+'" width=1 height=1 marginwidth=0 marginheight=0 scrolling=no frameborder=0><\/iframe><\/div>');

AdFox_getCodeScript(1,pr1,'//ads.adfox.ru/247068/prepareCode?pp=g&amp;ps=cfov&amp;p2=fifz&amp;pct=a&amp;plp=a&amp;pli=a&amp;pop=a&amp;pr=' + pr +'&amp;pt=b&amp;pd=' + addate.getDate() + '&amp;pw=' + addate.getDay() + '&amp;pv=' + addate.getHours() + '&amp;prr=' + afReferrer + '&amp;dl='+dl+'&amp;pr1='+pr1);
// -->
</script> 
<!-- _________________________AdFox Asynchronous code END___________________________ -->

<div class="banner"></div>

<!--BETWEEN SSP CODE V2.0 START--><script type="text/javascript">var between_type="adj";document.write('<script type = "text/javascript" src = "http://cache.betweendigital.com/sections/153110.js"></scr'+'ipt>')</script><!--BETWEEN SSP END-->

<div  class="banner"></div><br />

<div>
<div>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 160x600, создано 09.10.08 -->
<ins class="adsbygoogle"
     style="display:inline-block;width:160px;height:600px"
     data-ad-client="ca-pub-8594606551930257"
     data-ad-slot="0137252453"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</div>
</div>

<div id="ad_top">
    <div class="banner" style="text-align: center;">

<div id='div-gpt-ad-topline' style='width:970px; height:90px;'>
    <script type='text/javascript'>
    googletag.cmd.push(function() { googletag.display('div-gpt-ad-topline'); });
    </script>
</div>

<!-- R-48186-8 Яндекс.RTB-блок  -->
<div id="yandex_ad_R-48186-8"></div>
<script type="text/javascript">
    (function(w, d, n, s, t) {
        w[n] = w[n] || [];
        w[n].push(function() {
            Ya.Context.AdvManager.render({
                blockId: "R-48186-8",
                renderTo: "yandex_ad_R-48186-8",
                async: true
            });
        });
        t = d.getElementsByTagName("script")[0];
        s = d.createElement("script");
        s.type = "text/javascript";
        s.src = "//an.yandex.ru/system/context.js";
        s.async = true;
        t.parentNode.insertBefore(s, t);
    })(this, this.document, "yandexContextAsyncCallbacks");
</script>
</div>
</div>

</div>

<!-- *************** сфинкс IP:  144.76.97.182 ********    -->

<!--  AdRiver code START. Type:extension Site: academic PZ: 0 BN: 0 -->
<script type="text/javascript">
(function(L){if(typeof(ar_cn)=="undefined")ar_cn=1;
var S='setTimeout(function(e){if(!self.CgiHref){document.close();e=parent.document.getElementById("ar_container_"+ar_bnum);e.parentNode.removeChild(e);}},3000);',
    j=' type="text/javascript"',t=0,D=document,n=ar_cn;L='' + ('https:' == document.location.protocol ? 'https:' : 'http:') + ''+L+escape(D.referrer||'unknown')+'&rnd='+Math.round(Math.random()*999999999);
function _(){if(t++<100){var F=D.getElementById('ar_container_'+n);
    if(F){try{var d=F.contentDocument||(window.ActiveXObject&&window.frames['ar_container_'+n].document);
    if(d){d.write('<sc'+'ript'+j+'>var ar_bnum='+n+';'+S+'<\/sc'+'ript><sc'+'ript'+j+' src="'+L+'"><\/sc'+'ript>');t=0}
    else setTimeout(_,100);}catch(e){try{F.src="javascript:{document.write('<sc'+'ript"+j+">var ar_bnum="+n+"; document.domain=\""
    +D.domain+"\";"+S+"<\/sc'+'ript>');document.write('<sc'+'ript"+j+" src=\""+L+"\"><\/sc'+'ript>');}";return}catch(E){}}}else setTimeout(_,100);}}
D.write('<div style="visibility:hidden;height:0px;left:-1000px;position:absolute;"><iframe id="ar_container_'+ar_cn
    +'" width=1 height=1 marginwidth=0 marginheight=0 scrolling=no frameborder=0><\/iframe><\/div><div id="ad_ph_'+ar_cn
    +'" style="display:none;"><\/div>');_();ar_cn++;
})('//ad.adriver.ru/cgi-bin/erle.cgi?sid=189955&target=top&bt=43&pz=0&tail256=');
</script>
<!--  AdRiver code END  -->

<!--script src="//cds.j5t2u9c4.hwcdn.net/s/87520fcb-b4a0-4806-87d0-b559f147126b.js" type="text/javascript"></script>-->

</body>
</html>
<link rel="stylesheet" href="/css/academic.min.css?150325" type="text/css" />

Само собой, результат такой обработки также требует ручной правки.


Разработка приложения


Приложение собиралось в среде разработки кроссплатформенных приложений Marmalade SDK на языке программирования C++. Попытаюсь привести UML-диаграмму, отображающая классы приложения, их основные свойства и методы.



Главный класс приложения, с которым оперирует цикл обработки событий — класс Application.


Класс MainScreen — класс, отвечающий за отрисовку стартового экрана приложения. Выглядит он так:



LevelGroupScreen отвечает за отрисовку таблицы уровней группы:



LevelScreen — отрисовка основного экрана, отвечающего за игровой процесс:



ImageResource — класс, отвечающий за манипуляцию с изображениями-иконками.


Класс Application содержит указатели на все эти классы скринов, а так же на класс ImageResource.


При вызове Application.Init() последовательно создает экземпляры этих классов и инициализирует их.


Атрибут ActiveScreen хранит информацию о том, какой из экранов сейчас активен, чтобы при необходимости вызывать на активном экране методы обработки ввода (OnClick, OnMove) и перерисовки (Draw).


Метод UpdateInputзанимается обработкой событий ввода, инициируемых пользователем и передаваемых приложению от операционной системы.


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


Соответственно, при закрытии приложения последовательно вызываются деструкторы всех объектов.


Подводя итоги


Те проблемы, которые я увидел в исходном приложении, я решил в своем:


  • поддержка книжной и альбомной ориентации экрана;
  • возможность масштабировать шрифт;
  • выделение слова при повторном вводе;
  • сортировка слов по длине (по убыванию) и алфавиту;
  • поддержка жестов, в том числе и zoom-жестов;
  • огромное количество уровней.

Для тех, кому интересна реализация: Android, iOS.

Поделиться с друзьями
-->

Комментарии (13)


  1. Temirkhan
    12.09.2016 20:36
    +1

    Как-то раз мне было скучно и я запилил на js что-то похожее(https://github.com/TemirkhanN/wc-game). Правда, с удивлением, обнаружил, что никак не могу адекватный алгоритм поиска конечного числа возможных слов найти… Вы просто бьете слова на составляющие буквы и проверяете их вхождение числовой «составляющей»?


    1. akk0rd87
      12.09.2016 20:45

      Да, у меня числовые составляющие заранее предрасчитаны. А поиск потом идет по условию join-а двух таблиц, где i_row — «главное» слово, t — очередное сравниваемое.

              where t.word_id <> i_row.word_id
              and t.а <= i_row.а
              and t.б <= i_row.б
              and t.в <= i_row.в
              and t.г <= i_row.г
              and t.д <= i_row.д
              and t.е <= i_row.е
              and t.ж <= i_row.ж
              and t.з <= i_row.з
              and t.и <= i_row.и
              and t.й <= i_row.й
              and t.к <= i_row.к
              and t.л <= i_row.л
              and t.м <= i_row.м
              and t.н <= i_row.н
              and t.о <= i_row.о
              and t.п <= i_row.п
              and t.р <= i_row.р
              and t.с <= i_row.с
              and t.т <= i_row.т
              and t.у <= i_row.у
              and t.ф <= i_row.ф
              and t.х <= i_row.х
              and t.ц <= i_row.ц
              and t.ч <= i_row.ч
              and t.ш <= i_row.ш
              and t.щ <= i_row.щ
              and t.ъ <= i_row.ъ
              and t.ы <= i_row.ы
              and t.ь <= i_row.ь
              and t.э <= i_row.э
              and t.ю <= i_row.ю
              and t.я <= i_row.я   
      


      1. akk0rd87
        12.09.2016 20:59

        Все это считается на Oracle. Потом для приложения в текстовые файлы уже выгружаются «главные» слова с подобранным списком «подчиненных» слов.


        1. Temirkhan
          12.09.2016 21:17

          Я думаю, есть ли более изящные пути решения проблемы.


          1. akk0rd87
            12.09.2016 21:18

            Какие?


            1. Temirkhan
              12.09.2016 22:13

              Javascript, мягко говоря, не мой конек, но я после Вашего поста пришел к следующему решению:

                  //dictionary - массив всех слов в словаре
                  
                  var getPossibleCombinations = function(word){
                      var possibleCombinations = [];
                      word = word.toLowerCase();
                      //Перебираем слова в словаре
                      for(var i=0; i<dictionary.length; i++){
                          var tmpBaseWord = word;
                          var tmpBaseWordChars = dictionary[i].toLowerCase().split('');
                          var possibleCombination = true;
              
                          //Перебираем буквы в текущем слове из словаря
                          for(var j = 0; j<tmpBaseWordChars.length; j++){
                              var pos = tmpBaseWord.indexOf(tmpBaseWordChars[j]);
                              //Если буквы из слова нет в "основном" слове, то это слово не относится к возможным комбинациям
                              if(pos === -1){
                                  possibleCombination = false;
                                  break;
                              }
                              //Если буква есть, то вырезаем ее из временного состояния "основного" слова
                              tmpBaseWord = tmpBaseWord.slice(0, pos) + tmpBaseWord.slice(pos+1);
                          }
              
                          //Если слово относится к допустимым(его обработка не прервалась на break;, добавляем его в пул возможных комбинаций
                          if(possibleCombination){
                              possibleCombinations.push(dictionary[i]);
                          }
                      }
              
                      return possibleCombinations;
                  };
              


              1. akk0rd87
                12.09.2016 22:48
                -1

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


    1. DeXPeriX
      13.09.2016 10:24

      А куда-нибудь онлайн выкладывалось? Если из зависимостей только js, то можно хотя бы в ветку gh-pages перенести, чтоб было доступно через github pages


      1. Temirkhan
        13.09.2016 10:38
        +1

        http://temirkhann.github.io/wc-game/


  1. unique_ak
    12.09.2016 23:38

    Похоже, что у marmalade SDK сомнительное будущее. Какие у вас мысли поэтому поводу?


    1. akk0rd87
      12.09.2016 23:41

      Буду присматриваться к другим кроссплатформенным компиляторам с поддержкой C++. Пока что склоняюсь либо к Cocos2d, либо к Unreal Engine.


  1. IvanDobry
    13.09.2016 13:29

    Трудно сделать приложение?


    1. akk0rd87
      13.09.2016 13:42

      Бывает есть над чем повозиться)