Инструкция по участию
Шаг 1. Зарегистрироваться
Для участи необходимо зарегистрироваться.
Шаг 2. Скачать языковой пакет
Скачайте пакет для языка Java со страницы Языковые пакеты. Этот пакет содержит необходимые файлы для работы вашей стратегии. Распакуйте его в каталог с исходным кодом вашего проекта. Выполнение программы начинается с класса Runner, который отвечат за подключение к проверяющей системе. В начале работы он создаёт экземпляр класса вашей стратегии MyStrategy и каждый тик запрашивает ваши действия, вызывая метод getAction
Шаг 3. Скачать Local Runner
В разделе Утилиты находится приложение Local Runner, которое позволяет локально на вашем компьютере запустить тестовые игры. Для настройки игры используется файл config.properties. Это текстовый файл, в котором описано в формате client#=<тип клиента>, какие стратегии используются для каждого игрока, Тип клиента может принимать следующие значения:
- Empty - пустая стратегия, которая ничего не делает;
- QuickStart - простая стратегия, расчищающая стены по мере удаленности от стартового положения;
- TCP:port - стратегия, подключающаяся к серверу по протоколу TCP на порту port. По умолчанию, клиент из раздела языковые пакеты подключается к порту 7827;
- Mouse - стратегия, которая следует за курсором и расставляет бомбы по нажатию на левую кнопку мыши.
Для тестирования нужно сначала запустить сервер с помощью файлов start.bat/start.sh, а потом к нему подключить TCP клиентов в порядке от первого до последнего
Шаг 3. Озакомиться с правилами
В разделе Правила приведены правила соревнования. Также в разделе Языковые пакеты приведено описание всех классов, которые вы можете использовать при написании вашей стратегии.
Шаг 4. Написать свою стратегию
Подведение вашего бота задаётся вашей стратегией из файла MyStrategy.java. В языковом пакете приведена пустая стратегия, которая не совершает никаких действий:
import model.*; public class MyStrategy extends Strategy { @Override public Action getAction(Player player, World world) { Action action = new Action(); return action; } }
Изменим её так, чтобы игроки, которые находятся в левой половине игрового поля (они имеют номера 0 и 3), двигались вправо, а находящиеся в правой — влево.
import model.*; public class MyStrategy extends Strategy { @Override public Action getAction(Player player, World world) { Rules rules = getRules(); Action action = new Action(); double dir = (player.playerId == 0 || player.playerId == 3) ? 1.0 : -1.0; action.speedX = dir * rules.PLAYER_MAX_SPEED; action.speedY = 0.0; return action; } }
Такая стратегия будет двигаться вправо/влево и застревать, когда упрётся в препятствие. Чтобы пройти дальше, а также получить очки, необходимо размещать бомбу. Реализуем следующую стратегию: в начальный момент движемся влево/вправо, пока не приблизимся к стене достаточно близко. После этого разместим бомбу и попробуем от неё убежать в противоположном направлении, а затем переждать взрыв.
import model.*; public class MyStrategy extends Strategy { @Override public Action getAction(Player player, World world) { Rules rules = getRules(); Action action = new Action(); double dir = (player.playerId == 0 || player.playerId == 3) ? 1.0 : -1.0; action.speedX = dir * rules.PLAYER_MAX_SPEED; action.speedY = 0.0; boolean anyBombPlaced = false; for(Bomb b: world.getBombs()) if(b.getOwner() == player.playerId) anyBombPlaced = true; boolean anyWallNearby = false; for(Obstacle obj: world.getObstacles()) if(obj.type == WorldObjectType.BrickWall && Math.abs(obj.getX()-player.getX()) + Math.abs(obj.getY()-player.getY()) < 1.5 * rules.BRICK_SIZE) anyWallNearby = true; boolean anyExplosionPresent = false; for(Explosion e: world.getExplosions()) if(e.getCreators().contains(player.playerId)) anyExplosionPresent = true; if(anyExplosionPresent) action.speedX = action.speedY = 0.0; else if(anyBombPlaced) action.speedX *= -1; else if(anyWallNeaby) action.drop = true; return action; } }
Здесь мы сначала перебираем все бомбы и проверяем, принадлежат ли хотя бы одна из них нам. После этого перебираем стены и вычисляем растояние от центра игрока до центра стены (использованно Манхэттенское расстояние). Если хотя бы одна из стен находится ближе, чем 1.5 * 30 = 45 единиц, то запоминаем, что стена рядом. Дальше перебираем, есть ли на арене взрывы, к которым мы имеем отношение. В зависимости от того, какие у нас получились результаты, мы меняем действие игрока.
Шаг 4. Отправьте свою стратегию
Отправить стратегию можно на странице Мои стратегии. Ваша стратегия будет скомпилирована и в случае успешной компиляции будет автоматически использоваться при создании игр с вашим участием.
Присылать нужно только файлы, которые относятся к вашей стратегии. Изменения в файлах модели и служебных файлах будут проигнорированы. В простейшем случае это только файл MyStrategy.java. Если же вы добавили новые файлы, то их можно прислать вместе с MyStrategy.java в виде ZIP архива.