
Совсем скоро стартует Google AI Challenge Ants. Два дня назад уже был анонс на хабре про это состязание:
http://habrahabr.ru/blogs/sport_programming/130457/
. Для тех, у кого есть желание поучаствовать или хотя бы просто узнать поподробнее, как это делается, я написал этот «Быстрый Старт».
Из статьи вы узнаете как запустить у себя на машине игру, написать своего первого бота и запустить две копии бороться друг против друга.
Я использую Linux (Debian), но на сайте также есть комплект и для Windows (в системе должен быть установлен Python).
Пример бота я приведу на языке Perl, но это никак не отменяет полезности статьи для тех, кто пишет на другом языке.
В комплекте от aichallenge есть уже готовые боты, написанные на языках: Java, PHP, C#, Python.
Более того, сейчас на сайте вы можете скачать стартовый пакет для написания своего бота на языках:
C#, C++, Common Lisp, D, Go, Java, JavaScript, Lua, OCaml, Pascal, Perl, PHP, Python, Ruby, Scala.
В скором времени будут добавлены и эти языки:
C, Clojure, CoffeeScript, Erlang, Groovy, Haskell, Visual Basic.
И да. Вы можете одновременно запускать сражение ботов, написанных на разных языках программирования.
Напутствие
Даже если у вас мало опыта в программировании и вы считаете, что вам ничего не светит, все равно рекомендую попробовать свои силы хотя бы на локальной машине. Как минимум, вы увидите образец хорошего стиля программирования и получите такой полезный навык программиста, как работа с чужим кодом.
И кстати, гугл обещает какие-то специальные призы студентам-первокурсникам.
Ну что ж, приступим.
Что нужно для старта?
В первую очередь, вот ссылка на официальный сайт, где есть вся полезная информация: http://beta.aichallenge.org/
Для написания своего бота понадобится стартовый пакет. На странице
http://beta.aichallenge.org/starter_packages.php выбираете свой язык программирования и скачиваете архив. Я выбрал Perl:
$ wget http://beta.aichallenge.org/starter_packages/perl_starter_package.zip
Распаковываем, например, в каталог MyBot:
$ unzip -d MyBot perl_starter_package.zip
Archive: perl_starter_package.zip
inflating: MyBot/Ants.pm
inflating: MyBot/MyBot.pl
inflating: MyBot/MyBot.pm
inflating: MyBot/Position.pm
inflating: MyBot/README.md
Это простая, но уже рабочая версия бота! Можно ее запускать в действие. Но сначала расскажу что для чего нужно.
Битва происходит на прямоугольном участке. На участке есть земля, вода, еда, муравейники и, собственно, главные действующие лица — муравьи.
Игра пошаговая.
Ваш бот — это программа, которая в бесконечном цикле (один цикл — один шаг) получает состояние игрового поля и возвращает новое положение для своих муравьев.
Ваш бот — это коллективный разум всех ваших муравьев, он знает все, что знают ваши муравьи. На каждом цикле бот для каждого вашего муравья должен определить следующий шаг, куда пойдет муравей: север, юг, восток, запад или останется на месте. Все. В этом заключается вся суть игры.
Теперь обратимся к реализации. Реализация бота находится в файле MyBot.pm.
Файлы Ants.pm и Position.pm — необходимые файлы для взаимодействия с игровым миром. Файл MyBot.pl — файл для запуска бота.
Вся работа по написанию бота будет происходить в файле MyBot.pm.
И главная функция здесь — это:
sub create_orders {
my $self = shift;
for my $ant ($self->my_ants) {
my @food = $self->nearby_food($ant);
for my $f (@food) {
my $direction = $self->direction($ant, $f);
next unless $self->passable(
Position->from($ant)->move($direction)
);
$self->issue_order( $ant, $direction );
last;
}
}
}
Это именно та функция, которая вызывается на каждом шаге.
В ней для каждого муравья из всех ваших муравьев
for my $ant ($self->my_ants) {
что-то делается… и в итоге дается указание системе:
$self->issue_order( $ant, $direction );
что этот муравей пойдет в эту сторону.
Все. А кто куда пойдет — это уже ваша фантазия. В данном примере муравей пойдет за первой попавшейся доступной едой.
Но я обещал что мы попробуем написать своего бота. И чтобы урок был простым, мы напишем самый простой, но и самый бесполезный вариант — муравей будет ходить случайным образом.
Но прежде чем приступать, нужно разобраться где мы будем смотреть на баталии наших ботов.
На официальном сайте предлагается специальный комплект: Ants game visualizer, написанный на Python.
Версия для Linux/MacOS: http://beta.aichallenge.org/tools.tar.bz2
Версия для Windows: http://beta.aichallenge.org/tools.zip
Берем:
$ wget http://beta.aichallenge.org/tools.tar.bz2
Распаковываем:
$ tar -xjvf tools.tar.bz2
Смотрим. В корне папки есть два shell-скрипта с говорящими названиями:
play_one_game.sh
play_one_game_live.sh
Чтобы понаблюдать за процессом, нам понадобится файл play_one_game_live.sh.
Посмотрим внимательно:
#!/usr/bin/env sh
./playgame.py -So --player_seed 42 --end_wait=0.25 --verbose --log_dir game_logs --turns 1000 --map_file maps/maze/maze_9.map "$@" \
"python sample_bots/python/HunterBot.py" \
"python sample_bots/python/LeftyBot.py" \
"python sample_bots/python/HunterBot.py" \
"python sample_bots/python/LeftyBot.py" |
java -jar visualizer.jar
При запуске игры:
$ ./play_one_game_live.sh
откроется визуализатор, в котором вы увидите большое поле с 4-мя муравейниками и можете понаблюдать за битвой.
Как уже видно из кода, воевать здесь будут 4 питон-бота, идущих в комплекте с визуализатором. Помимо питон-ботов, как я уже говорил, есть боты, написанные на C#, Java и PHP.

Первый шаг сделан. Отлично! Что дальше?
А дальше мы хотим подключить своего Perl-бота к игре. Будем изменять скрипт.
Строчка «python sample_bots/python/HunterBot.py» представляет из себя команду для запуска вашего бота. Результатом работы этой команды должен стать запущенный процесс, который будет принимать входные данные и выдавать результат. Таким образом здесь может быть любая ваша программа, написанная на любом языке программирования.
В моем случае — программа которая запускает моего бота — MyBot.pl.
Создадим каталог sample_bots/perl и скопируем все нужные файлы нашего бота из стартового комплекта в этот каталог:
$ cp MyBot/*.pl MyBot/*.pm tools/sample_bots/perl/
Бот есть. Выберем карту попроще. Карты находятся в каталоге maps. Каждая карта — это текстовый файл. В первых трех строчках стоят размеры и количество игроков на карте.
Будьте внимательны, запускайте ровно столько игроков, сколько указано в карте!
Я выбрал небольшую карту с двумя игроками:
maps/example/tutorial1.map
Вношу изменения в файл запуска play_one_game_live.sh:
#!/usr/bin/env sh
./playgame.py -So --player_seed 42 --end_wait=0.25 --verbose --log_dir game_logs --turns 1000 --map_file maps/example/tutorial1.map "$@" \
"python sample_bots/python/HunterBot.py" \
"perl sample_bots/perl/MyBot.pl" |
java -jar visualizer.jar
Все готово. Можем запускать и наблюдать за игрой нашего бота.

Пишем бота, который ходит случайным образом
Приступим к реализации задачи. Открываем файл MyBot.pm и удаляем все лишнее из функции sub create_orders. Отправная точка будет такая:
sub create_orders {
my $self = shift;
for my $ant ($self->my_ants) {
$self->issue_order( $ant, $direction );
}
}
Она пока не рабочая, т.к. у нас не определено $direction. Если посмотреть код функции issue_order (она находится в файле Ants.pm), то мы узнаем что она принимает в качестве второго аргументы букву: N, S, W или E (север, юг, запад или восток).
Создадим массив из букв, и для каждого муравья возьмем произвольный элемент этого массива. Таким образом каждый муравей на каждом шаге пойдет в неизвестном никому направлении.
Язык perl дает соблазн написать все это в пару строчек, но т.к. статья рассчитана на разный тип и уровень программистов, то распишу это так:
sub create_orders {
my $self = shift;
my @directions = qw(N S W E);
for my $ant ($self->my_ants) {
my $index = int (rand (4));
$self->issue_order( $ant, $directions[$index] );
}
}
Сохраняемся, выбираем себе противника, запускаем и наблюдаем как наших слепых котят пожирают злобные безжалостные муравьи соперника.

Ну что ж. Бот готов, хоть и глупый, но зато свой. Дело за малым: добавить боту интеллекта, научить его искать пищу, воевать, и можно отправлять его за победой. Тут наши пути расходятся.
Функции для поиска еды и соперников оставляю на самостоятельное изучение. Смотрите файл Ants.pm.
И в заключении хочется сказать пару слов про регистрацию.
Правильная ссылка на регистрацию вот: beta.aichallenge.org/submit.php
На сайте в некоторых местах дана неправильная ссылка (видимо на прошлый чемпионат), что меня спугнуло вначале и я чуть было не бросил эту затею.
После регистрации можно загрузить исходный стартовый пакет, как есть, в архиве, для того чтобы ваше имя как можно раньше появилось в рейтингах.
До встречи на поле боя!