- PVSM.RU - https://www.pvsm.ru -
Компания Hola [1] объявляет долгожданный летний конкурс по программированию! Победителей ожидают призы:
Авторы интересных решений будут приглашены на собеседования.
Условия конкурса на английском языке размещены на GitHub [3]. Ниже — перевод на русский язык.
Поиграем в текстовую игру! Несомненно, вы распознаете в ней клон классической видеоигры, впервые изданной в 1984 году.
Ваша цель — написать искусственный интеллект, который играет в эту игру, принимая решения вместо человека. Игра будет проходить в реальном времени, и у вашего скрипта будет столько же времени на принятие решений, сколько у человека.
Мы рекомендуем запустить скрипт game/jsdash.js [5] и сыграть в игру несколько раз перед тем, как читать дальше. (Примечание: мы разрабатывали и тестировали игру под xterm в Linux. В других системах может работать, а может и не работать.)
Клавишами-стрелочками можно перемещаться в четырёх направлениях. Зелёная буква A
— это вы. Можно перемещаться через пустое пространство или землю (:
), толкать камни (O
) по горизонтали в пустое пространство и собирать алмазы (*
). Через кирпичи (+
) и сталь (#
) пройти невозможно. Камни и алмазы падают, когда остаются без опоры, а также скатываются вбок друг с друга и с кирпичей. Падающие предметы убивают игрока. Бабочки (анимация /|-
) взрываются при соприкосновении с игроком, от удара падающим предметом, а также будучи запертыми без возможности передвижения. Взрыв бабочки поглощает любые материалы, кроме стали, и может убить игрока. После взрыва образуются алмазы, которые можно собрать.
За каждый взятый алмаз начисляется 1 очко. Если собрать 3 алмаза с промежутками не более 2 секунд, в дополнение к очкам за каждый из них, начисляется 3 призовых очка. Если продолжать быстро собирать алмазы, не делая промежутков длиннее 2 секунд, то начисляется 5 очков после пятого алмаза, 7 очков после седьмого (в дополнение ко всем предыдущим премиям), и так далее для каждого простого числа. За убитую бабочку начисляется 10 очков при условии, что игрока не убило взрывом.
Ограничение времени игры — 2 минуты. Можно прервать игру раньше, нажав Q, Esc или Ctrl-C; набранные очки при этом не теряются. Клавиша P позволяет приостановить игру.
Остаток времени, очки и сообщения о призовых цепочках (hot streak) отображаются в строке состояния под игровым полем.
Механика нашей игры в целом соответствует образцу 1984 года (она известна благодаря подробному описанию на фан-сайте Boulder Dash [6]), однако для простоты мы решили использовать не все типы объектов. Самое большие отличия — описанная выше система начисления очков и то, что на уровне нет выхода. Цель игры — набрать как можно больше очков, прежде чем игра закончится смертью персонажа или по истечению времени. Если вас интересуют подробности игровой механики, читайте исходный код модуля game.js [7].
Решение представляет собой модуль Node.js без зависимостей. Модуль должен экспортировать одну функцию:
play(screen)
Игра загрузит модуль и вызовет функцию play
один раз, передав начальное состояние игры в качестве параметра screen
. Оно представляет собой массив строк, по одной на каждую строку экрана с верхней до нижней, включая строку состояния. Строки будут содержать в точности то, что вы видите на экране, только без раскраски в ANSI-цвета (игру можно увидеть в таком режиме на консоли, если запустить её с параметром --no-color
). Функция play
должна быть генератором. Чтобы сделать ход, она должна сгенерировать (yield) значение 'u'
, 'd'
, 'r'
или 'l'
для шага вверх, вниз, вправо или влево соответственно. Ещё можно сгенерировать 'q'
или просто завершить работу генератора (return), чтобы окончить игру досрочно (набранные очки при этом не теряются). Если сгенерировать любое другое значение, это означает ход «остаться на месте». Пытаться идти в направлении, в котором двигаться невозможно (например, в стену) не запрещено: персонаж просто останется на месте. После каждого yield содержимое массива screen
обновляется, и ваш код может снова его проанализировать для принятия дальнейших решений.
Если ваша функция возбудит исключение, то игра закончится с результатом 0 очков. Это не помешает вашей программе играть и набирать очки на других уровнях.
Ваш скрипт будет запускаться в отдельном процессе. Даже если он зависнет, это не замедлит ход игры (при этом персонаж будет стоять на месте).
Состояние игры обновляется раз в 100 мс. Если функция play
будет генерировать команды быстрее, то персонаж будет двигаться 10 раз в секунду. После каждой команды генератор будет блокироваться на инструкции yield
до конца рануда длиной в 100 мс. Если функция «думает» над ходом дольше, чем 100 мс, она начинает пропускать ходы, и тогда персонаж будет оставаться на месте в те раунды, когда функция не успела сделать ход. В этом случае генератор также не увидит некоторых промежуточных состояний экрана. Например, если скрипт «задумается» на 250 мс между двумя инструкциями yield
, то не увидит двух состояний экрана, а персонаж останется неподвижным на два раунда; таким образом, будут упущены две возможности сделать ход, которые были бы, если бы программа работала быстрее. После этого генератор будет заблокирован на 50 мс до конца раунда, и сгенерированная им команда будет выполнена.
Очень простой пример работающего скрипта искусственного интеллекта приведён в файле game/example.js [8]. Каждый раунд он находит все возможные ходы (направления, в которых по соседству с позицией игрока находятся пустое пространство, земля, камень, который можно сдвинуть, или алмаз) и выбирает один из них случайным образом. Обычно этот скрипт убивается вскоре после начала игры.
Скрипт jsdash.js [5], который мы предоставляем на GitHub, — это не только интерактивная игра, но и мощный инструмент для тестирования. Запустите его с параметром --help
, чтобы узнать обо всех его возможностях.
Каждое присланное нам решение будет запущено по меньшей мере на 20 автоматически сгенерированных уровнях. Участник, чьё решение наберёт наибольшую сумму очков на всех уровнях, будет признан победителем. Мы оставляем за собой право увеличить число уровней (для всех участников), если это потребуется для того, чтобы исключить «ничью» между лидерами; если и это не поможет, победит тот, кто прислал своё решение раньше.
При тестировании каждого решения будет использоваться один и тот же набор затравочных значений (seeds) для генератора псевдослучайных чисел, чтобы программы всех участников получали одни и те же уровни. При запуске ваших решений мы будем использовать настройки по умолчанию:
jsdash.js --ai=submission.js --log=log.json
Тем не менее, мы рекомендуем обратить внимание на весь набор доступных параметров командной строки, которые могут помочь вам в отладке.
По окончанию конкурса будут опубликованы записи игр каждого решения на каждом из тестовых уровней. Эти записи можно воспроизвести такой командой:
jsdash.js --replay=log.json
Для отправки решений пользуйтесь формой на нашем сайте [4]. По электронной почте решения не принимаются!
Поскольку код решений часто бывает сгенерированным, минимизированным или оттранслированным с другого языка, форма содержит также поле для отправки архива с исходными тестами. Если код сгенерирован, включите туда генератор; если он минимизирован, включите исходную версию; если код переведён с CoffeeScript или другого языка, включите код на том языке, на котором он написан. Желательно также включить в архив файл README с кратким описанием подхода к решению (по-английски). Архив должен быть в формате tar.gz, tar.bz2 или zip. Содержимое архива будет опубликовано, но не будет протестировано (мы тестируем только JS-файл, который вы отправляете вне архива).
Максимальный размер JS-файла установлен в 64 МиБ. Это произвольно выбранная цифра, которая существует в основном для того, чтобы чьё-нибудь «решение» одномоментно не заполнило нам диск. Если ваше решение правда больше 64 МиБ, напишите нам, и мы увеличим ограничение.
Если у вас есть вопросы по условию задачи или проблемы с отправкой решения, напишите, пожалуйста, комментарий или письмо [2].
Желаем удачи всем участникам!
Автор: Hola
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/259461
Ссылки в тексте:
[1] Hola: https://hola.org
[2] наш адрес: mailto:challengejs+habrahabr@hola.org
[3] на GitHub: https://github.com/hola/challenge_jsdash
[4] этой формы: https://hola.org/challenges/jsdash
[5] game/jsdash.js: https://github.com/hola/challenge_jsdash/blob/master/game/jsdash.js
[6] фан-сайте Boulder Dash: http://www.bd-fans.com/FanStuff.html#Programming
[7] game.js: https://github.com/hola/challenge_jsdash/blob/master/game/game.js
[8] game/example.js: https://github.com/hola/challenge_jsdash/blob/master/game/example.js
[9] Источник: https://habrahabr.ru/post/332176/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.