четверг, 15 ноября 2012 г.

HabraWars - все новое, хорошо забытое старое...

Уже какой день не утихают бои на виртуальных просторах конкурса по программированию AI. На хабре появилась статья - разбор полетов одного из участников.

Ни для кого не секрет, что CodeTanks - это упрощенная версия Robocode. Новизной и инновациями данный конкурс не блещет, но он все же интересен и я рад что там принимал участие.

А я тем временем, серфя просторы интернета, на ткнулся на посты на Хабре, датированные 2009м годом. Оказывается был проведен турнир по аналогичным боям на Javascript в http://habrawars.appspot.com

Забавная вещь, хотя не блещет красотой и физикой, в отличие от Robocode и CodeTanks, но тоже интересна и даже затягивает. Роботы скорее напоминают конкурсных BEAM-роботов.

После закрытия песочницы CodeTanks можно будет оттачивать свое мастерство в этом варианте лайт-версии Robocode. Лично я стал фанатом такого рода игрушек и кто знает, может такие простые забавы вырастут в участие в Robocode.




Пример кода хабраварс:

// Этот код будет обрабатываться внутри класса
// Здесь можно задавать переменные, которые будут доступны во время всей симуляции
this.target_id -1;

// Метод action - основная функция, которая вызывается при обработке каждого фрейма
// self - объект со свойствами вашего робота (id, x, y, angle, health, energy)
// enemyTanks - массив с объектами свойств противников (аналогично self)
this.action function(selfenemyTanksshellsworld{
//*
    // Уворачиваемся от снарядов
    for (var 0shells.lengthi++)
    {
        var shell get_shot_destination(shells[i]);        
        // Если снаряд должен попасть рядом с нами, уворачиваемся
        if (Math.sqrt(Math.pow(self.shell.x2Math.pow(self.shell.y2)70)
        {
            var shot_dir get_direction(self.xself.yshell.xshell.y);
            // Выбираем направление, противоположное точки попадания снаряда
            var get_angle_control(self.angleshot_dir 180);
            // Месть!
            this.target_id shells[i].shooter;
            return [1afalse0];            
        }   
    }    
//*/    
    // Если не осталось противников - просто движемся вперед
    if (enemyTanks.length == 0)
        return [0.50false0];    

    // Если ещё не выбрана цель или нашей цели больше нет, выбираем цель случайным образом
    // target_id - это ID цели, а не её индекс в массиве enemyTanks (индексы могут меняться)
    if (this.target_id == -|| !get_enemy_by_id(this.target_idenemyTanks))
        this.target_id enemyTanks[Math.round(Math.random((enemyTanks.length 1))].id;
    
    // Переменная target будет содержать объект из списка enemyTanks со свойствами цели.
    var target get_enemy_by_id(this.target_idenemyTanks);

    // Вычисляем под каким углом относительно нас находится цель
    var target_dir get_direction(self.xself.ytarget.xtarget.y);

    // Вычисляем угол, на который нужно повернуться (от -1 до 1)
    var get_angle_control(self.angletarget_dir);
    
    // Расстояние до цели
    var range Math.sqrt(Math.pow(self.target.x2Math.pow(self.target.y2));

    // Если нет энергии для выстрела и мы слишко близко - убегаем от противника
    if (self.energy 65 && range 500)
        -a;
    
    // Если угол между нами и целью < 1 градуса и расстояние < 800 - стреляем
    var fire angle_size(self.angletarget_dir&& range 800;
    
    // Возвращаем управление [скорость от 0 до 0.5, угол поворота от -1 до 1, огонь true или false, дальность огня (положительное число)]
    return [0.5afirerange];
}

Комментариев нет:

Отправить комментарий