Постановка проблемы

Допустим, мы хотим построить систему команд для игры покер. Но при этом желательно, чтобы она подходила и для других карточных игр, ведь когда-нибудь мы захотим реализовать и их. Более того, хорошо бы реализовать клиент так, чтобы он управлялся с картами без привязки конкретно к покеру, а подходил бы и для дурака, и для преферанса и т.д. Различия в правилах игры существуют только на сервере, а клиент просто получает и отображает всегда одни и те же команды: add, move, remove и другие.

Да и почему только карточных? Разве команды add, move, remove не подойдут для match-3 или стратегий? Для какой игры они вообще могут не подойти, если только в игре есть что перемещать? Вот и получается, что всегда можно подобрать такую достаточно общую и абстрактную систему команд, которая была бы универсальна и подходила для абсолютно всех жанров. Реализация была бы, конечно, везде разная, но названия и параметры — одинаковыми. А значит, не нужно держать у себя в голове кучу протоколов и не нужно тратить время на раскачку, когда переходишь к разработке другой игры. Так, можно одному программисту разрабатывать и поддерживать сразу несколько жанров и не чувствовать себя несчастным по этому поводу. Не говоря уже о серии игр одного жанра.

Чтобы сделать такой универсальный протокол, а затем и фреймворки для каждого жанра на его основе, нужно разобраться во всем жанровом разнообразии, привести его в систему. Чем мы сейчас и займемся.

Деление игр

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

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

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

Например, из логики следует, что какой бы предмет мы ни взяли, для всего можно взять его отрицание. Если есть А, значит, есть и не-А. Если есть быстрое — есть и небыстрое, есть стратегии — есть и нестратегии. Всем миром правит раздвоенность — дихотомия. Это значит, что если не знаешь на какие категории поделить элементы системы, дели все на А и не-А — на стратегии и нестратегии, на быстрые игры и небыстрые, вдумчивые и невдумчивые и так далее. Если не подошел один критерий, примени другой. И так пока однажды в 6 утра в полусне на тебя не снизойдет озарение.

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

С точки зрения разработки игр данное разделение является также корневым. Достаточно сказать, что пошаговую игру можно реализовать даже совсем без графики и GUI, в одной командной строке (CLI), так как все события там происходят по очереди, друг за другом. С играми реального времени все иначе. Там все объекты существуют и меняют мир вокруг себя параллельно, в одно и то же время. Поэтому нужно каждое мгновение показывать игроку их текущее состояние, чтобы он успевал ориентироваться и вовремя реагировать на события. Ясно, что для таких игр предъявляются совершенно иные требования не только к программисту, но и к производительности компьютера, а в случае онлайн-режима, то и пропускной способности сети.

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

Вычленение жанров

Второе положение, которое можно позаимствовать из философии — это то, что нет нигде той ясной границы, где заканчиваются стратегии и начинаются нестратегии. В каждой игре есть элементы стратегии, даже в гонках. Другое дело, что в гонках элементы стратегии несущественны, случайны, а потому их можно отбросить, и гонки останутся гонками. А вот если эти элементы отбросить в Цивилизации, то она перестанет быть Цивилизацией, а станет чем-то другим (гонками?:)).

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

Например, есть игра кости (крэпс), есть рулетка, есть слоты — это чистые игры на ставки. Игрок только ставит на то или иное поле, но исход розыгрыша от него никак не зависит. Все зависит только от случайно выпавшего числа или комбинации чисел. Также есть дурак, пьяница, девятка. Тут тоже все понятно — чистые карточные игры. Убери карты, и игры не станет.

Но куда определить покер, который объединяет в себе и ставки, и карты? А видеопокер? Решить непросто, но возможно. Допустим, мы уберем ставки из покера. Тогда игра многое потеряет, но останется все же покером. По-прежнему будут производиться раздачи и определяться победители. Хоть и без особого интереса. Но если убрать карты, то не будет ничего. Ставки останутся, но определить, какая из них выиграла уже не получится. Поэтому покер — карточная игра со ставками, а не игра на ставки с картами. Другими словами, сущность покера лежит в картах.

Другое дело — видеопокер. Тут ставки — это тот существенный момент, который определяет всю игру. Карты — лишь способ показывать комбинации чисел, своего рода изощренные кости с 52 значениями вместо 6, и выпадающие без повторений. Измени карты на вишенки, получим слоты, на кубики — крэпс (с изменением возможных комбинаций, естественно, изменяются и правила).

Эволюция жанров

Далее, диалектика как наука о развитии говорит нам, что ничего не появляется вдруг, а все происходит из чего-то. Это чего-то, в свою очередь, произошло из своего чего-то и так — до начала Вселенной. И понять какой-либо предмет можно, только проследив всю историю его эволюции от простого плазменного облака первых секунд существования нашего мира. Иначе говоря, всякий предмет нужно брать в развитии и во всем многообразии его форм. И это касается абсолютно всех вещей — как материальных, так и идеальных.

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

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

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

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

Раз в сложной игре содержится некая другая, более простая игра, то если мы реализуем эту простую, то, считай, уже частично сделана и та сложная. Поэтому, если мы последовательно будем двигаться от простейшего жанра ко все более и более сложным, мы сможем с наименьшими усилиями реализовать их все. А имея перед глазами всю систему жанров, мы сможем при написании кода сразу учитывать все то, с чем нам придется столкнуться в будущем. В частности мы можем заранее продумать единую систему команд, чтобы ее потом не пришлось кардинально переделывать (хотя не будем обманываться — куда ж без переписываний).

Если мы выработали способ писать "реюзабельный" (reusable) код, то такой эволюционный подход кардинально сокращает время на разработку. Также, в качестве побочного продукта мы получаем готовые игры других жанров в виде бонуса. Так, прежде чем реализовать квест, нам наверное нужно показать экран с разными игровыми элементами на нем, состояние которых можно изменять (Dress-Up, поиск отличий), реализовать возможность переходить в другие скрины, складывать предметы в инвентарь (поиск предметов). Вот так, мы еще только начали делать квест, а три других жанра уже готовы.

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

Классификация

Теперь, когда мы можем соединить идею деления игр на пошаговые и реального времени с идеей выстраивания всех жанров в единую последовательность от простого к сложному. В результате мы можем прийти к выводу, что одна половина этого ряда будет пошаговыми играми, а другая — реального времени. Мы уже выяснили, что пошаговые проще реализовать, они требуют меньше вычислительных ресурсов компьютера и меньшей скорости реакции (интенсивности работы мозга) пользователей. Поэтому пошаговые игры можно признать как более простые и разместить их в начале ряда, а реального времени — в конце.

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

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

Точно так же и вторая большая группа, где мир существует в реальном времени, может быть условно поделена на те, где важна скорость выполнения действий, и на те, где важнее правильность принятых решений. То есть на чисто реального времени (спортивные, большинство ролевых игр (RPG), стратегий реального времени (RTS)) и на игры с элементами пошаговых (бомбермены, лабиринты, динамичные match-3 (Zuma), аркады). К последним также можно отнести стратегии, которые хоть и существуют в реальном времени, но действия в них выполняются настолько постепенно, что момент отдания приказа не способен существенно повлиять на исход игры (фермы, Settlers, tower defence и их аналоги). Также сюда можно отнести RPG, где упор делается больше на диалогах, чем на сражениях.

Игры пошаговые с элементами реального времени и реального времени с элементами пошаговых являются переходными ступенями между "чистыми" жанрами. Поэтому каждую большую группу можно поделить на чистые и переходные игры. В результате мы получим такую классификацию по степени увеличения сложности:

  1. Пошаговые:

    • а. Чистые (с анимацией действия);

    • б. Переходные (с симуляцией действия — с элементами игр реального времени).

  2. Реального времени:

    • а. Переходные (отложенного действия — с элементами пошаговых);

    • б. Чистые (мгновенного действия).

Главный принцип классификации
Главный принцип классификации

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

Мы же сделаем это только для чисто пошаговых, чтобы найти самый простой жанр из всех. Начинающему знание простейшего типа игр поможет быстрее написать свою первую настоящую игру, профессионалам — послужит критерием для отбора самого необходимого функционала в фреймворк. Если что-то (например, аудио или локализация) нужны в самой примитивное игре, то они будут нужны и во всех прочих. Также это может стать основанием к дальнейшей систематической разработке фреймворков для всех ключевых жанров, что важно, например, для владельцев порталов, вроде NewGrounds или ArmorGames.

Поиск простейшего жанра

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

Если абстрагироваться от правил и логики, которые у каждой игры уникальные, то остается то общее, на что можно опереться при следующем разделении на категории. А именно — на отображение (View), а точнее, организацию игрового поля.

Игровое поле бывает двух видов:

  • произвольное (поиск предметов, квесты, игры на ставки, карточные) и

  • упорядоченное (сапер, крестики-нолики, шахматы, match-3, стратегии).

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

Если посмотреть на все чисто пошаговые игры на произвольном поле, то все их можно разбить на три основные группы:

  • условные квесты,

  • игры на ставки,

  • карточные игры.

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

В играх на ставки, аналогично, управляются стопки фишек, которые нужны лишь для визуального отображения суммы поставленной игроком. Операций тут поменьше: собирать в стопки и перемещать из одной стопки в другую. Поэтому игры на ставки будем считать жанром попроще, чем карточные.

В квестах система управления игровыми элементами реализовать еще легче. Там вообще перемещение элементов — это скорее исключение. Большая их часть остается на своих местах и лишь изменяет свое состояние. А если они и перемещаются, то, как правило, по одному.Видно, что из трех самые простые — это квесты. Чтобы не ходить вокруг да около, сразу расположим основные жанры данной группы по порядку:

  1. Одевалки (Dress-Up) — изменение состояния одежки (переключение кадров анимации).

  2. Раскраски (Coloring) — изменение состояния объекта в виде задания выбранного цвета.

  3. Поиск отличий (Spot the Difference) — изменение прозрачности объектов, добавляются условия выигрыша и проигрыша.

  4. Поиск предметов (Hidden Objects) — объекты можно перемещать в инвентарь.

  5. Квесты (Quest) — поиск предметов + использование этих предметов. Можно изменять состояние объектов и выполнять разные условия, чтобы продвинуться дальше. Состояние одних предметов может зависеть от состояния других.

Жанры 2-4 — обычно такая же форма рассказывания некоей истории со сменами локаций, как и квесты, только в более упрощенном виде. Поэтому всех их можно условно причислить к подразделениям квестов. Одевалки сюда можно отнести по схожести механики. И там, и там объекты могут менять свое состояние. Только в Dress-Up это делается максимально примитивным образом. Также можно воспринимать Dress-Up игру как один из эпизодов квеста. Только этот эпизод никуда не ведет, а существует просто ради самого себя.

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

Резюме

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

Мы не стали идти от отдельных жанров, ища куда бы определить каждый тип игры, но вместо этого делили все игры в мире на две равные части, а те — еще раз на две. Оба раза мы пользовались одним и тем же критерием: ближе ли игра к пошаговым или к играм реального времени.

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

Вместо этого мы объединили все игры по признаку организации игрового поля, что является общим определяющим моментом для всех игр данного рода. В результате у нас получилось две взаимоисключающие группы: игры на произвольном и на упорядоченном поле. Раз они взаимно исключают друг друга, значит, они разделяют общее основание — способ организации игрового поля. А раз противоположности имеют общее основание, то они образуют противоречие.

Противоречие — это как раз то, что нам надо. Противоречие — это то, посредством чего все развивается. Это двигатель прогресса. Есть противоречие — есть развитие. Нет противоречия — нет развития. Вся Вселенная, жизнь, общество развивалось путем возникновения и разрешения противоречий. И раз оно у нас есть, значит, мы идем правильным путем.

В любом противоречии что-то идет логически раньше, а что-то позже. Что-то проще, а что-то сложнее. В данном случае проще игры на произвольном поле, хоть отдельные представители данной группы и будут сложнее отдельных представителей противоположной группы. Например, квесты сложнее крестиков-ноликов, если создавать их как отдельные игры. Но если мы создаем фреймворк для всех игр на произвольном поле и отдельный фреймворк для всех игр на поле в клетку, то отдельные реализации игр будет создавать одинаково просто. Поэтому имеет смысл сравнивать сложность только самих фреймворков. Для контроля можем также сравнить самую сложные игры каждой группы: покер и Цивилизация. Думаю, ответ очевиден.

Вот вкратце суть нашего метода. Далее с его помощью закончить классификацию по всем остальным подгруппам будет уже не так трудно.

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


  1. Aleksandr-JS-Developer
    14.07.2022 16:38

    ок...