Содержание статьи
- Тестовое задание: аналог классической игры Asteroids (компания «Кефир!»)
- Тестовое задание: Крестики-нолики (компания Digital Universe)
- Тестовое задание: аналог игры «Пузыри» (компания Playrix)
- Тестовое задание «Фейерверк» (фирма Playrix)
- Тестовое задание: аналог игры «Тир» (компания Playrix)
- Тестовое задание: разработать игру — подобие настольной Mancala
- Заключение
Несколько месяцев назад я уже делился частью своей коллекции тестовых заданий, которые ставят перед соискателями на позицию программиста в индустрии gamedev. И надо сказать, получил неплохой фидбэк! Вижу, что разработка игр серьезно интересует нашего читателя, и не только потому, что в игровой индустрии можно заработать неплохие деньги. Похоже, что для этой области народного хозяйства более чем актуальна мудрость, приписываемая Конфуцию: «Выберите себе работу по душе, и вам не придется работать ни одного дня».
Тестовое задание: аналог классической игры Asteroids (компания «Кефир!»)
Задача: разработать клон игры Asteroids. Вкратце: Asteroids настолько древняя игра, что она даже старше меня — седовласого игродела. Классический Asteroids был разработан в 1979 году в компании Atari для игровых автоматов.
Предмет тестового задания. Игровой мир представляет собой часть космоса, в которой пользователь управляет космическим кораблем, смотря на него сверху. Корабль перемещается в области экрана, не выходя за его пределы (сталкиваясь с границами при их достижении). В сцене присутствуют также дрейфующие астероиды и комические тарелки. Первые имеют разнообразный в определенных пределах размер, кроме того, они могут перемещаться в любом направлении с различной (в разумных границах) скоростью. При столкновении с астероидами космический корабль взрывается (или погибает, кому как больше нравится). После своего появления в игровой сцене летающие тарелки всегда преследуют космический корабль и если догоняют, то уничтожают его. Это описание более-менее классической части, объединяющей все клоны Asteroids.
Итак, по заданию, кроме всего перечисленного, надо добавить такие вещи. У космического корабля есть два вида оружия: пули и лазер. Запас пуль бесконечен. С их помощью НЛО можно подбить одним выстрелом, а если ими попасть по астероиду, то он раскалывается на два меньших куска, продолжающих дрейфовать в космическом пространстве с произвольно выбранной скоростью и направлением. Эти части полноценного астероида при следующем попадании уничтожаются с первого раза.
Второй тип оружия — лазер. Он должен иметь лимит на количество выстрелов: изначально у корабля есть десять лазерных выстрелов. Когда игрок их истратит, запас лазерного оружия медленно восполняется. С помощью лазера и астероиды, и летающие тарелки уничтожаются с одного попадания.
Каждый астероид сталкивается друг с другом и соответственно меняет направление движения.
В игре надо реализовать специальные эффекты (particle effects), служащие для визуализации различных взрывов.
Все это имеет отношение к геймплею. Кроме этого, надо реализовать мало-мальский GUI. В него должны входить в качестве HUD’а: текстовые надписи, показывающие набранные очки, которые увеличиваются в момент поражения астероидов и тарелок, и количество лазерных снарядов (самовосстанавливающееся значение).
Когда геймерский корабль терпит крушение, надо вывести окно, в котором будет показано количество набранных очков, и предоставить игроку выбор между началом игры заново и выходом, то есть закрытием приложения.
Техническая часть тестового задания. Можно использовать любой доступный игровой движок на свой выбор. Арт компания не выдает, следовательно, весь контент для игры нужно нарисовать самому или, на худой конец, использовать свободный.
![Оригинальный Asteroids 1979 года](https://xakep.ru/wp-content/uploads/2015/08/1439363360_4df3_1.png)
![](https://xakep.ru/wp-content/uploads/2015/08/000_Cover_v-210x280.jpg)
Хакер #199. Как взломали SecuROM
Тестовое задание: Крестики-нолики (компания Digital Universe)
Крестики-нолики на Unreal Engine 4 (адское пекло, стрельба по воробьям из пушки) — это тестовое задание в компании Digital Universe. В общем-то, из этого предложения все понятно. Дополнительно надо разработать простенький искусственный интеллект. Пусть, например (не имеет принципиальной разницы), игрок ходит за крестики, а ИИ — за нолики. Хотя арт не выдается, смоделить крестик и нолик в том же Blender — не проблема. Еще надо добавить меню, которое появляется в случае победы одной из сторон или ничьей (бессмысленное продолжение игры — невозможность хода), имеющее две кнопки: New Game, Quit. Соответственно, нажатие первой кнопки перезапускает игру, второй — закрывает приложение.
Обрати внимание, что используемый движок строго определен. Но после того, как в начале года Unreal Engine 4 стал абсолютно бесплатным (впрочем, и раньше его можно было свободно использовать в любительских проектах), это перестало быть проблемой.
![Крестики-нолики](https://xakep.ru/wp-content/uploads/2015/08/1439363371_cd52_2.jpg)
Тестовое задание: аналог игры «Пузыри» (компания Playrix)
В целом «Пузыри» выглядят следующим образом. В двумерном пространстве имеется изначально заданное количество точек, каждая из которых движется по игровому полю хаотично (в любом направлении, с любой скоростью — в разумных пределах), при этом они не сталкиваются, но отскакивают от границ окна приложения. Когда игрок щелкает по игровому полю мышью, то место, где был сделан клик, становится центром растущего круга. Вырастая до заданного предела за условный период, круг определенное время остается с максимальным радиусом, а потом начинает быстро уменьшаться. Достигнув минимального размера, он исчезает. В течение всего времени, пока круг виден на экране, точки, соприкоснувшиеся с ним, удаляются, а на их местах появляются такие же раздувающиеся круги, которые живут по идентичному алгоритму. Игрок может создавать новые круги, пока на игровом поле присутствует хотя бы одна окружность. В момент, когда исчезает последний круг, игра завершается. И тогда должно появиться модальное окошко, в котором надо отобразить общее число точек, а также количество удаленных. Одновременно при появлении этого меню должна быть возможность перезапуска игры с начала.
Это общее представление игры «Пузыри». Описанное тестовое задание предлагается компанией Playrix. Для его выполнения компания выдает собственный движок вместе с документацией, чтобы соискателю было что покурить. Вдобавок, кроме движка, выдается редактор эффектов (EffectEditor, тоже с документацией). EffectEditor поставляется с несколькими эффектами и текстурами, чтобы соискателю можно было разобраться, что в этом редакторе к чему. Поскольку визуальные эффекты повышают привлекательность игры, при проверке задания внимание будет уделено не только коду (применению ООП и используемым алгоритмам). Имея общее представления об игре «Пузыри», программист должен сам развить идею, выбрать арт и создать по этой механике по-другому выглядящую игру. Кроме того, выдается две заготовки, соответственно, для Visual Studio 2008 и VS 2012, одну из которых следует использовать для начала разработки своей игры, в зависимости от используемой версии студии. Предлагаемая заготовка включает пример вывода текстуры, которая перемещается вместе с курсором мыши и двумя простыми particle-эффектами, созданными в EffectEditor, один из которых следует за мышью, а второй запускается по щелчку правой кнопкой мыши.
После того как игра будет соответствовать описанной выше механике (круги будут создаваться, расти, уменьшаться, исчезать, точки — перемещаться и соударяться с окружностями, чтобы самоуничтожиться и породить новый круг), в игру надо будет добавить два particle-эффекта. Первый эффект должен представлять собой шлейф, следующий за каждой точкой. Он должен существовать на протяжении всей жизни точки и уничтожаться в момент смерти родительской точки, то есть при ее соприкосновении с кругом. Таким образом, количество экземпляров эффекта-шлейфа равно количеству точек. Второй эффект должен представлять собой взрыв или вспышку, которая происходит в момент столкновения точки с кругом. То есть этот эффект визуально подчеркивает событие коллизии. Оба эффекта необходимо создать самостоятельно в EffectEditor.
Исходные значения (количество точек, присутствующих на экране и участвующих в физическом взаимодействии; период, за который родившийся круг достигает своего максимального размера; время, которое круг висит на экране, достигнув лимита на размер) считываются в начале выполнения игры из файла input.txt.
Для полноты картины надо добавить надпись, отображающую количество набранных очков (например, «Score: X», где X обозначает очки), а также всплывающие при уничтожении точки надписи, которые показывают полученный бонус (после появления они должны быстро увеличиваться, а затем так же быстро уменьшаться).
Техническая часть тестового задания. Поскольку движок написан на C++, то дорабатывать шаблон тебе предстоит на этом замечательном языке. Игровой движок содержит поддержку всех необходимых либ, следовательно, включает всю нужную функциональность для загрузки изображений и particle effects, так что изобретать колесо тебе не придется.
Тестовое задание «Фейерверк» (фирма Playrix)
Суть этого тестового задания заключается в разработке фейерверка с задаваемым уровнем вложенности. Уровень вложенности здесь означает число распадов и взрывов, которое порождается изначально выпущенным зарядом. Когда пользователь щелкает левой кнопкой мыши в области окна приложения, в данных координатах должен быть создан фейерверк. Он выглядит следующим образом: из стартовых координат вверх вылетает начальный заряд, через некоторое время он взрывается и распадается на заданное количество дочерних зарядов, которые разлетаются в разные стороны. Каждый дочерний заряд повторяет судьбу материнского заряда, которым был порожден. Число таких итераций определяется уровнем вложенности. Необходимо сделать возможность одновременного запуска нескольких фейерверков, каждый из которых выполняется по описанному алгоритму.
Для выполнения тестового задания (разработки приложения фейерверка) компания выдает свой движок вместе с документацией и редактором эффектов EffectEditor, тоже включающим документацию и примеры.
Поведение фейерверка (полет зарядов, их взрывы-распады, создание новых зарядов, генерация эффектов) реализуется в коде. Для выполнения задания дается шаблон, включающий вывод текстуры и реализацию эффекта и предназначенный для разных версий студии (выбирается по желанию).
После того как описанная основа будет готова, надо прикрутить пару particle-эффектов, которые тебе предстоит создать в EffectEditor (программа несколько странная, но вполне рабочая и со своими обязанностями справляется). Первый эффект представляет собой шлейф, следующий за зарядом. Этот эффект необходимо прикреплять к каждому заряду, в том числе дочернему. Второй эффект должен возникать в момент распада заряда, например он может представлять собой взрыв. Этот эффект может быть одним на все случаи жизни, но лучше, если для распадов на разных уровнях будет свой особенный эффект. Не забывай, что оценивается не только качество кода, умение использовать ООП и паттерны проектирования, но и визуальная составляющая твоей игры!
Приложение «Фейерверк» содержит заранее определенные значения, которые надо прочитать из файла в начале работы программы. Это количество уровней вложенности фейерверка и число частиц, на которое распадается заряд при взрыве.
Техническая составляющая точно такая же, как в предыдущем задании.
![Фейерверк](https://xakep.ru/wp-content/uploads/2015/08/1439363392_3ff8_3.jpg)
Тестовое задание: аналог игры «Тир» (компания Playrix)
Как в двух прошлых случаях, для выполнения тестового компания выдает свой движок, написанный на C++. В нем очень активно используется boost и множество других библиотек.
Игра «Тир» выглядит примерно следующим образом. По игровому полю хаотично движется любое (заданное изначально) количество мишеней. Для разнообразия они могут быть представлены любыми предметами. Мишени должны перемещаться с рандомной скоростью в случайных направлениях. В нижней части игрового поля по центру расположена пушка (или любое другое стреляющее устройство — что подскажет твоя бурная фантазия). Она должна изменять угол выстрела (направление дула) в направлении координат курсора мыши. В момент, когда игрок нажимает левую кнопку мыши, из дула пушки вылетает снаряд и следует по вектору, заданному углом поворота пушки. Снаряд должен лететь достаточно быстро. Интересной идеей будет добавить внешние силы, влияющие на отклонение снаряда от начальной траектории: например, ими могут служить порывы ветра, если пушка наземная, или течение, если действия игры разворачиваются под водой. Когда объект-мишень поражен выпущенным пушкой снарядом, он уничтожается и исчезает. Главная задача юзера — подбить как можно больше мишеней. На это отводится ограниченное и заранее определенное количество времени. Когда время истечет или будут подбиты все мишени, должно появиться окно, в котором необходимо отобразить общее количество мишеней и число сбитых. Кроме того, здесь же должна предлагаться возможность перезапустить уровень игры с восстановлением всех объектов и их начальных значений.
Когда алгоритм для игры будет реализован (то есть игра будет работать как надо), для добавления зрелищности необходимо в EffectEditor создать пару эффектов и приаттачить их к игре. Первый эффект должен представлять собой шлейф, идущий за снарядом и пропадающий в момент поражения им мишени (данный эффект создается для каждого снаряда). Второй эффект визуализирует момент попадания снаряда по мишени, другими словами, представляет собой взрыв.
При загрузке игры из текстового файла считываются следующие начальные значения: число мишеней, которые присутствуют в игре в начале, скорость снаряда и длительность игры. Эти сведения можно записать в файл в виде «имя значения = число», например так: TotalTime = 60. Таким образом, длительность игры должна составить 60 с.
Техническая составляющая задания точно такая же, как у двух предыдущих.
Тестовое задание: разработать игру — подобие настольной Mancala
Чего только не придумают игроделы, чтобы вынести мозг программистам-соискателям! В наших краях Mancala мало известна, однако кое-где за рубежом, особенно в восточных странах, эта настольная игра, отдаленно напоминающая нарды, очень популярна. Соискателю предлагается воплотить ее в цифре. К слову, цифровая версия популярна на Западе. В данном случае компания выдает весь арт, который будет использоваться в процессе разработки игры. Это уже радует. В целом его очень много: не только статические изображения доски, лунок и кристаллов, но и последовательности активных изображений — анимации.
Как и в нардах, для игры в манкалу используется специальная доска. И на этом, пожалуй, сходство между играми заканчивается. Существует много разновидностей манкалы, в данном конкретном случае надо разработать магическую манкалу, в которой можно применять заклинания. Правила таковы. В игре принимают участие два игрока. На доске для манкалы расположены десять активных ячеек: два ряда по пять ячеек, у каждого игрока свой ряд. Дополнительно справа от основных ячеек игрока находится прямоугольное углубление — калах, куда попадают выигранные кристаллы, но об этом чуть позже. В начале игры (в соответствии с заданием) в каждую ячейку помещаются по четыре кристалла. Участники ходят по очереди. Игрок щелкает на одной из своих ячеек, из нее забираются все кристаллы и плавно раскладываются по одному по соседним ячейкам в направлении против часовой стрелки. Полет и раскладывание кристаллов надо запрограммировать. Кроме того, надо учитывать, сколько кристаллов находится в каждой ячейке, и выводить это количество рядом с ней. В калах так же, как в ячейку, помещается один кристалл, затем кристаллы раскладываются в ячейки противоположной стороны, вражеский калах пропускается. Когда все кристаллы из ячейки разложены, право хода переходит к оппоненту. Однако, если последний кристалл попадает в калах, право хода остается у текущего игрока. Если последний кристалл игрока попадает в пустую ячейку его ряда, то из противоположной ячейки оппонента забираются все кристаллы и вместе со своим кристаллом переносятся в калах. Цель игры — поместить в свой калах больше кристаллов, чем соперник. Количество кристаллов в калахе тоже должно отображаться на игровом поле.
Игра заканчивается, когда какая-то из сторон не может сделать хода. Кристаллы в калахах подсчитываются, сравниваются, и на экран выводится сообщение о выигрыше или проигрыше.
Также необходимо реализовать простенький ИИ, умеющий делать ходы и использовать магические заклинания. От тебя не требуется разработать прогнозирующую машину, но твой ИИ должен зарабатывать кристаллы.
Дополнительно к стандартным правилам в магической манкале необходимо реализовать заклинания, для которых выдаются статические изображения и последовательности картинок для создания анимаций. Заклинания должны быть представлены в виде картинок рядом с игровой доской; для их применения должна быть возможность перетаскивать их на любую ячейку, как свою, так и противника. На использование магии тратится мана, которая должна восполняться после успешных ходов игрока. Использование магии считается за ход. Надо реализовать четыре вида заклинаний: огонь, заморозка, молния, телепорт, каждая со своей анимацией и последствиями исполнения. Использование огня уничтожает в ячейке один кристалл; заморозка замораживает на один ход один или два кристалла (то есть их нельзя выбрать); молния уничтожает от нуля до двух кристаллов; с помощью телепорта можно переместить один кристалл из выбранной ячейки в любую другую.
В заключение нужно добавить GUI пользователя: окошки для вывода сведений о победе и проигрыше и для вывода информации, кто делает следующий ход. Когда ход делает ИИ, все ячейки должны быть заблокированы.
Во многом это тестовое задание предлагается для того, чтобы работодатель понял, насколько быстро программист может разобраться в новой для себя предметной области. Конечно, будут учитываться и способности алгоритмизации, и выбор подходящей технологии (движка), так как средства программной реализации остаются на усмотрение соискателя.
![Настольная (аналоговая) Mancala](https://xakep.ru/wp-content/uploads/2015/08/1439363419_e686_4.jpg)
Победитель от компании Custis
Славим Виктора Святоху из Хабаровска, успешно решившего все задания!
Заключение
Несмотря на кризис, игровая индустрия все еще на подъеме. Нужны новые сотрудники, с новым взглядом на вещи, с новым мировоззрением. Тем не менее отбор довольно суров. Поэтому соискателю надо тщательно подготовиться как к собеседованию, так и к выполнению тестового задания; нужно быть эрудированным в широком спектре вопросов и технологий. Сегодня мы описали шесть тестовых заданий, предлагаемых соискателю на позицию программиста в игровой индустрии. Это поможет тебе быть в курсе заданий, предоставляемых игровыми студиями, а также повысить свой программерский левел.
В одном из следующих номеров мы обязательно рассмотрим решение какой-то из задачек. Так что до встречи на страницах ][!