Здесь будут подсказки и замечания по стратегии, когда таковая будет выработана
Есть двухмерная карта размерами от 2х2 до 1000х1000 клеток. Каждая клетка карты представляет собой один из следущих элементов ландшафта:
Кроме того на карте находятся игровые объекты, которые могут перемещаться:
На момент последнего хода собрать как можно больше овец в своем загоне.
Очки подсчитываются по следующей формуле:
I = <изначальное кол-во овец в загоне игрока>; M = <изначальное кол-во овец на территории игрока>; C = <кол-во овец в загоне на конец игры>; if (C == I) { score = 0; } else if (C < I) { score = -10 * (I - C) / I } else { score = 10 * C / M; }
Если по-простому, то:
dogBarkingR
и меньше от вашей и ваша собака гавкает, то:
indignant
) и не может гавкать ближайшие dogScaryTurns
ходов, начиная со следующегоpanic
) и не может ходить и гавкать ближайшие dogScaryTurns
ходов, начиная со следующегоdogBarkingR
и меньше, то указанное в пунктах 2 и 3 работает для обеих. Возможно, обе испугаются и застынут. Возможно одна из них только потеряет дар речи.
dogBarkingR
от другой собаки того же игрока, отменяет испуг сделанный на предыдущих ходах.
sheepStandBy
ходов от начала игры, потом делают ход, потом сново ждут то же число ходов, и т.д. Зная sheepStandBy
можно рассчитать будет ли овца ходить в ход N
или нет по формуле: N % (sheepStandBy+1) == 0
. Подразумевается что номер хода N отсчитывается с 1
dogBarkingR
от овцы, овца пугается и ближайшие sheepScaryTurns
ходов двигается без остановок в сторону противоположную той, откуда раздался лай.
sheepScaryTurns - 1
ходов.
Игровой сервер слушает порт 3002. Клиент должен подключиться к этому порту (используя обычные сокеты), после чего клиент и сервер могут обмениваться командами
Команда со стороны клиента - это строка, состоящая из имени команды и аргументов, разделенных пробелами, завершающаяся символом перевода строки (\n)
<команда>[ <аргумент 1>[ ...]]\n do 4 move left\n end\n
Команда со стороны сервера - это строка, состоящая из имени команды и одного аргумента, представляющего собой JSON-подобную структуру одного из двух видов:
<команда> "<строка 1>"[,"<строка 2>"[...]]
<команда> "<ключ 1>"="<значение 1>"[,"<ключ 2>"="<значение 2>"[...]]
Все команды и их аргументы регистрозависимы!
Ниже приведен список всех команд и их синтаксиса, а так же пример общения сервера и клиента
join <username> join <username> #<hub>
Клиент регистрируется на сервере, изъявляя желание играть от имени игрока <username>
в хабе <hub>
. Если хаб не задан, то подразумевается хаб по умолчанию
Каждый хаб на игровом сервере может иметь свой набор карт и свои правила распределения игроков по играм
Сервер возвращает либо error
либо wait
и подбирает подходящую игру и соперников для клиента
wait
Сервер сообщает, что клиент успешно зарегистрирован и теперь должен ждать, пока сервер подберет подходящую игру и соперников
start "rows":"<rows>","cols":"<cols>",...
Сервер сообщает о начале игры и передает структуру с информацией об игре. В структуру всегда входят следующие значения
rows
cols
players
you
players
)dogVisibilityR
dogBarkingR
dogVisibilityR
sheepScaryTurns
dogScaryTurns
sheepStandBy
turnsLimit
x1
, x2
, y1
, y2
landscape "<строка 1>"[,"<строка 2>"[...]]
Сервер присылает полную карту местности, но без местоположения овец и собак, в виде массива строк. Каждая строка - это строка карты, каждый символ - ячейка карты
Для карты используются следующие символы:
#
^
.
1
, 2
, 3
, 4
start
как аттрибут you
state "turn":"<turn>"
Сервер присылает сообщение state
перед очередным ходом, указывая номер хода. Номер хода начинается с 1, последний ход имеет номер turnsLimit
#Собака obj "id":"<id>","x":"<x>","y":"<y>","type":"Dog","owner":"<playerId>","action":"move|panic|indignant"[,"voice":"barking"] #Овца obj "x":"<x>","y":"<y>","type":"Sheep","action":"standBy|move|panic","direction":"left|down|right|up" #Неизвестный лающий объект obj "x":"<x>","y":"<y>","voice":"barking"
Сервер присылает по одной команде obj для каждого объекта, который:
dogVisibilityR
)В качестве аргумента передается структура, содержащая следующую информацию об объекте:
x
, y
обязательныеtype
owner
players
. Только для собакaction
action
может принимать следующие значенияaction | Для собаки | Для овцы |
---|---|---|
standBy | Не бывает | Овца в этот ход собирается остаться на месте |
move | Обычное состояние для собаки | Овца в этот ход собирается перемещаться в сторону direction |
panic | Собака напугана, и не может двигаться и лаять в этот ход | Овца напугана в этот ход и собирается перемещаться в сторону direction |
indignant | Собака возмущена, и не может лаять в этот ход | Не бывает |
direction
voice
barking
и присутствовать только для собакСервер извещает клиента о том, что информация обо всех объектах была передана, и теперь клиент может совершать ход
#Двигаться do <dogId> move left|right|up|down #Гавкать do <dogId> bark
Клиент сообщает серверу действие, которое совершает собака игрока с указанным идентификатором. Идентификатор берется из сообщения obj
пришедшее с сервера.
За один ход игрок может переместить каждую собаку один раз и гавкнуть каждой из собак
<dogId> <warning>
Присылается сервером если команда do
не может быть выполнена. Например, эта собака уже ходила в этот ход, или она напугана и не может перемещаться
Клиент сообщает серверу, что ход завершен
Сервер сообщает клиенту о том, что игра окончена
Сервер присылает это сообщение при любой ошибке. Может возникнуть в любой момент
> join bot1 < wait < start "you":1,"rows":40,"cols":40,"players":2,"x1":0,"x2":19,"y1":0,"y2":19,"waitForTurn":300000,"dogVisibilityR":"4","dogBarkingR":"4","sheepStandBy":"4","sheepScaryTurns":"4","turnsLimit":100,"dogScaryTurns":"4","ownSheepsCount":10,"maxSheepsCount":12 {cols=40, waitForTurn=300000, sheepStandBy=4, dogBarkingR=4, y1=0, y2=19, you=1, x2=19, rows=40, x1=0, dogScaryTurns=4, turnsLimit=100, players=2, sheepScaryTurns=4, ownSheepsCount=10, dogVisibilityR=4, maxSheepsCount=12} < landscape "........................................","........................................","........................................","........................................","######..................................","#1111#..................................","#1111...................................","#1111#..................................","######..................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","....................######..............","....................#2222#..............","....................#2222...............","....................#2222#..............","....................######..............","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................","........................................" < state "turn":1 < obj "id":134,"type":"Dog","x":5,"y":6,"owner":1,"action":"move" < turn > do 134 move down > do 134 bark > end < warning 134 Cannot move to 5, 7 - there is a non traversable landscape or another object < state "turn":2 < obj "id":134,"type":"Dog","x":5,"y":6,"owner":1,"action":"move","voice":"barking" < turn > do 134 move right > do 134 bark > end < state "turn":3 < obj "id":134,"type":"Dog","x":6,"y":6,"owner":1,"action":"move","voice":"barking" < obj "voice":"barking","x":24,"y":26 < turn > do 134 move up > do 134 bark > end < finished
Доступен по адресу http://ai.actimind.com/. Для игроков используется порт 3002
Хабы, работающие на официальном сервере:
Соревнование проходит в несколько фаз:
Бета-тестирование (идет сейчас)
Опубликована первая версия правил и игровой сервер. Можно писать ботов и участвовать в боях с другими игроками.
цель этапа: тестирование сервера, оценка адекватности правил и предлагамых карт
окончание этапа: 31 декабря 2012
Подготовка
Публикуется окончательная версия правил и игровой сервер, дальнейшие изменения в них исключаются, за исключением фикса багов.
Цель этапа: дать участникам время подготовить и потестировать бота для соревнования
Турнир
Создаются турнирные карты, производится запись на турнир. После чего проводится серия игр со всеми участниками турнира.
Цель этапа: определить победителя!
Нужна ли нам помощь? Конечно же да!. Если у вас есть желание && возможность помочь - то вот что можно сделать:
Пишите - alexey.grishin@actimind.com. Баги можно постить прямо на github