//habrawars script for bot
//http://h...content-available-to-author-only...r.ru/post/75928/
//http://h...content-available-to-author-only...t.com/game/
// Этот код будет обрабатываться внутри класса
// Здесь можно задавать переменные, которые будут доступны во время всей симуляции
this.target_id = -1;
var memRange = undefined;
var d = 0;
// Метод action - основная функция, которая вызывается при обработке каждого фрейма
// my_state - объект со свойствами вашего робота (id, x, y, angle, health, energy)
// enemies - массив с объектами свойств противников (аналогично my_state)
this.action = function(my_state, enemies, shots, params) {
// Если не осталось противников - просто движемся вперед
if (enemies.length == 0)
return [0.5, 0, false, 0];
// Если ещё не выбрана цель или нашей цели больше нет, выбираем цель случайным образом
// target_id - это ID цели, а не её индекс в массиве enemies (индексы могут меняться)
if (!get_enemy_by_id(this.target_id, enemies))
this.target_id = enemies[Math.round(Math.random() * (enemies.length - 1))].id;
// Переменная target будет содержать объект из списка enemies со свойствами цели.
var target = get_enemy_by_id(this.target_id, enemies);
// Вычисляем под каким углом относительно нас находится цель
var target_dir = get_direction(my_state.x, my_state.y, target.x, target.y);
// Вычисляем угол, на который нужно повернуться (от -1 до 1)
var a = get_angle_control(my_state.angle, target_dir);
// Расстояние до цели
var range = Math.sqrt(Math.pow(my_state.x - target.x, 2) + Math.pow(my_state.y - target.y, 2));
if (memRange != undefined){
if( memRange > range ){
d = -20;
} else if ( memRange < range){
d = 30;
} else {
d = 0;
}
}
memRange = range;
//console.log(d);
// Если нет энергии для выстрела и мы слишко близко - убегаем от противника
if (range < 500 && my_state.energy < 65)
a = -a;
// Уворачиваемся от снарядов
for (var i = 0; i < shots.length; i++)
{
var shot_dest = get_shot_destination(shots[i]);
// Если снаряд должен попасть рядом с нами, уворачиваемся
if (Math.sqrt(Math.pow(my_state.x - shot_dest.x, 2) + Math.pow(my_state.y - shot_dest.y, 2)) < 100)
{
var shot_dir = get_direction(my_state.x, my_state.y, shot_dest.x, shot_dest.y);
// Выбираем направление, противоположное точки попадания снаряда
var a2 = get_angle_control(my_state.angle, shot_dir + 140);
// Месть!
if (enemies.length < 2){
this.target_id = shots[i].shooter;
}
var fire = angle_size(my_state.angle, target_dir) < 2 && range < 800;
if ( fire && my_state.energy == 100 )
return [0.5, a, fire , range + d ];
else
return [0.5, a2, false, 0];
}
}
// Если угол между нами и целью < 1 градуса и расстояние < 800 - стреляем
var fire = angle_size(my_state.angle, target_dir) < 1 && range < 800;
// Возвращаем управление [скорость от 0 до 0.5, угол поворота от -1 до 1, огонь true или false, дальность огня (положительное число)]
return [0.5, a, fire, range + d];
}
Ly9oYWJyYXdhcnMgc2NyaXB0IGZvciBib3QKLy9odHRwOi8vaC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uci5ydS9wb3N0Lzc1OTI4LwovL2h0dHA6Ly9oLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi50LmNvbS9nYW1lLwovLyDQrdGC0L7RgiDQutC+0LQg0LHRg9C00LXRgiDQvtCx0YDQsNCx0LDRgtGL0LLQsNGC0YzRgdGPINCy0L3Rg9GC0YDQuCDQutC70LDRgdGB0LAKLy8g0JfQtNC10YHRjCDQvNC+0LbQvdC+INC30LDQtNCw0LLQsNGC0Ywg0L/QtdGA0LXQvNC10L3QvdGL0LUsINC60L7RgtC+0YDRi9C1INCx0YPQtNGD0YIg0LTQvtGB0YLRg9C/0L3RiyDQstC+INCy0YDQtdC80Y8g0LLRgdC10Lkg0YHQuNC80YPQu9GP0YbQuNC4CnRoaXMudGFyZ2V0X2lkID0gLTE7CnZhciBtZW1SYW5nZSA9IHVuZGVmaW5lZDsKdmFyIGQgPSAwOwovLyDQnNC10YLQvtC0IGFjdGlvbiAtINC+0YHQvdC+0LLQvdCw0Y8g0YTRg9C90LrRhtC40Y8sINC60L7RgtC+0YDQsNGPINCy0YvQt9GL0LLQsNC10YLRgdGPINC/0YDQuCDQvtCx0YDQsNCx0L7RgtC60LUg0LrQsNC20LTQvtCz0L4g0YTRgNC10LnQvNCwCi8vIG15X3N0YXRlIC0g0L7QsdGK0LXQutGCINGB0L4g0YHQstC+0LnRgdGC0LLQsNC80Lgg0LLQsNGI0LXQs9C+INGA0L7QsdC+0YLQsCAoaWQsIHgsIHksIGFuZ2xlLCBoZWFsdGgsIGVuZXJneSkKLy8gZW5lbWllcyAtINC80LDRgdGB0LjQsiDRgSDQvtCx0YrQtdC60YLQsNC80Lgg0YHQstC+0LnRgdGC0LIg0L/RgNC+0YLQuNCy0L3QuNC60L7QsiAo0LDQvdCw0LvQvtCz0LjRh9C90L4gbXlfc3RhdGUpCnRoaXMuYWN0aW9uID0gZnVuY3Rpb24obXlfc3RhdGUsIGVuZW1pZXMsIHNob3RzLCBwYXJhbXMpIHsKCiAgICAKICAgIC8vINCV0YHQu9C4INC90LUg0L7RgdGC0LDQu9C+0YHRjCDQv9GA0L7RgtC40LLQvdC40LrQvtCyIC0g0L/RgNC+0YHRgtC+INC00LLQuNC20LXQvNGB0Y8g0LLQv9C10YDQtdC0CiAgICBpZiAoZW5lbWllcy5sZW5ndGggPT0gMCkKICAgICAgICByZXR1cm4gWzAuNSwgMCwgZmFsc2UsIDBdOyAgICAKCiAgICAvLyDQldGB0LvQuCDQtdGJ0ZEg0L3QtSDQstGL0LHRgNCw0L3QsCDRhtC10LvRjCDQuNC70Lgg0L3QsNGI0LXQuSDRhtC10LvQuCDQsdC+0LvRjNGI0LUg0L3QtdGCLCDQstGL0LHQuNGA0LDQtdC8INGG0LXQu9GMINGB0LvRg9GH0LDQudC90YvQvCDQvtCx0YDQsNC30L7QvAogICAgLy8gdGFyZ2V0X2lkIC0g0Y3RgtC+IElEINGG0LXQu9C4LCDQsCDQvdC1INC10ZEg0LjQvdC00LXQutGBINCyINC80LDRgdGB0LjQstC1IGVuZW1pZXMgKNC40L3QtNC10LrRgdGLINC80L7Qs9GD0YIg0LzQtdC90Y/RgtGM0YHRjykKICAgIGlmICghZ2V0X2VuZW15X2J5X2lkKHRoaXMudGFyZ2V0X2lkLCBlbmVtaWVzKSkKICAgICAgICB0aGlzLnRhcmdldF9pZCA9IGVuZW1pZXNbTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogKGVuZW1pZXMubGVuZ3RoIC0gMSkpXS5pZDsKICAgIAogICAgLy8g0J/QtdGA0LXQvNC10L3QvdCw0Y8gdGFyZ2V0INCx0YPQtNC10YIg0YHQvtC00LXRgNC20LDRgtGMINC+0LHRitC10LrRgiDQuNC3INGB0L/QuNGB0LrQsCBlbmVtaWVzINGB0L4g0YHQstC+0LnRgdGC0LLQsNC80Lgg0YbQtdC70LguCiAgICB2YXIgdGFyZ2V0ID0gZ2V0X2VuZW15X2J5X2lkKHRoaXMudGFyZ2V0X2lkLCBlbmVtaWVzKTsKCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10Lwg0L/QvtC0INC60LDQutC40Lwg0YPQs9C70L7QvCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0L3QsNGBINC90LDRhdC+0LTQuNGC0YHRjyDRhtC10LvRjAogICAgdmFyIHRhcmdldF9kaXIgPSBnZXRfZGlyZWN0aW9uKG15X3N0YXRlLngsIG15X3N0YXRlLnksIHRhcmdldC54LCB0YXJnZXQueSk7CgogICAgLy8g0JLRi9GH0LjRgdC70Y/QtdC8INGD0LPQvtC7LCDQvdCwINC60L7RgtC+0YDRi9C5INC90YPQttC90L4g0L/QvtCy0LXRgNC90YPRgtGM0YHRjyAo0L7RgiAtMSDQtNC+IDEpCiAgICB2YXIgYSA9IGdldF9hbmdsZV9jb250cm9sKG15X3N0YXRlLmFuZ2xlLCB0YXJnZXRfZGlyKTsKICAgIAogICAgLy8g0KDQsNGB0YHRgtC+0Y/QvdC40LUg0LTQviDRhtC10LvQuAogICAgdmFyIHJhbmdlID0gTWF0aC5zcXJ0KE1hdGgucG93KG15X3N0YXRlLnggLSB0YXJnZXQueCwgMikgKyBNYXRoLnBvdyhteV9zdGF0ZS55IC0gdGFyZ2V0LnksIDIpKTsKCiAgICBpZiAobWVtUmFuZ2UgIT0gIHVuZGVmaW5lZCl7CiAgICAgICAgaWYoIG1lbVJhbmdlID4gIHJhbmdlICl7CiAgICAgICAgICAgIGQgPSAtMjA7CiAgICAgICAgfSBlbHNlIGlmICggbWVtUmFuZ2UgPCAgcmFuZ2UpewogICAgICAgICAgICBkID0gMzA7ICAgICAgICAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkID0gMDsgIAogICAgICAgIH0gICAgICAgICAKICAgIH0KCiAgICBtZW1SYW5nZSA9ICByYW5nZTsKICAgIC8vY29uc29sZS5sb2coZCk7CiAgICAvLyDQldGB0LvQuCDQvdC10YIg0Y3QvdC10YDQs9C40Lgg0LTQu9GPINCy0YvRgdGC0YDQtdC70LAg0Lgg0LzRiyDRgdC70LjRiNC60L4g0LHQu9C40LfQutC+IC0g0YPQsdC10LPQsNC10Lwg0L7RgiDQv9GA0L7RgtC40LLQvdC40LrQsAogICAgaWYgKHJhbmdlIDwgNTAwICYmIG15X3N0YXRlLmVuZXJneSA8IDY1KQogICAgICAgICAgICBhID0gLWE7CiAgICAKICAgIAogICAgICAgICAvLyDQo9Cy0L7RgNCw0YfQuNCy0LDQtdC80YHRjyDQvtGCINGB0L3QsNGA0Y/QtNC+0LIKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2hvdHMubGVuZ3RoOyBpKyspCiAgICB7CiAgICAgICAgdmFyIHNob3RfZGVzdCA9IGdldF9zaG90X2Rlc3RpbmF0aW9uKHNob3RzW2ldKTsgICAgICAgIAogICAgICAgIC8vINCV0YHQu9C4INGB0L3QsNGA0Y/QtCDQtNC+0LvQttC10L0g0L/QvtC/0LDRgdGC0Ywg0YDRj9C00L7QvCDRgSDQvdCw0LzQuCwg0YPQstC+0YDQsNGH0LjQstCw0LXQvNGB0Y8KICAgICAgICBpZiAoTWF0aC5zcXJ0KE1hdGgucG93KG15X3N0YXRlLnggLSBzaG90X2Rlc3QueCwgMikgKyBNYXRoLnBvdyhteV9zdGF0ZS55IC0gc2hvdF9kZXN0LnksIDIpKSA8IDEwMCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzaG90X2RpciA9IGdldF9kaXJlY3Rpb24obXlfc3RhdGUueCwgbXlfc3RhdGUueSwgc2hvdF9kZXN0LngsIHNob3RfZGVzdC55KTsKICAgICAgICAgICAgLy8g0JLRi9Cx0LjRgNCw0LXQvCDQvdCw0L/RgNCw0LLQu9C10L3QuNC1LCDQv9GA0L7RgtC40LLQvtC/0L7Qu9C+0LbQvdC+0LUg0YLQvtGH0LrQuCDQv9C+0L/QsNC00LDQvdC40Y8g0YHQvdCw0YDRj9C00LAKICAgICAgICAgICAgdmFyIGEyID0gZ2V0X2FuZ2xlX2NvbnRyb2wobXlfc3RhdGUuYW5nbGUsIHNob3RfZGlyICsgMTQwKTsKICAgICAgICAgICAgLy8g0JzQtdGB0YLRjCEKICAgICAgICAgICAgaWYgIChlbmVtaWVzLmxlbmd0aCA8IDIpewogICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfaWQgPSBzaG90c1tpXS5zaG9vdGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaXJlID0gYW5nbGVfc2l6ZShteV9zdGF0ZS5hbmdsZSwgdGFyZ2V0X2RpcikgPCAyICYmIHJhbmdlIDwgODAwOyAKICAgICAgICAgICAgaWYgKCBmaXJlICYmICAgIG15X3N0YXRlLmVuZXJneSA9PSAxMDAgKQogICAgICAgICAgICAgICAgcmV0dXJuIFswLjUsIGEsICBmaXJlICwgIHJhbmdlICsgZCBdOyAKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIFswLjUsIGEyLCBmYWxzZSwgMF07ICAKICAgICAgICB9ICAgCiAgICB9ICAgICAKICAgICAgLy8g0JXRgdC70Lgg0YPQs9C+0Lsg0LzQtdC20LTRgyDQvdCw0LzQuCDQuCDRhtC10LvRjNGOIDwgMSDQs9GA0LDQtNGD0YHQsCDQuCDRgNCw0YHRgdGC0L7Rj9C90LjQtSA8IDgwMCAtINGB0YLRgNC10LvRj9C10LwKICAgIHZhciBmaXJlID0gYW5nbGVfc2l6ZShteV9zdGF0ZS5hbmdsZSwgdGFyZ2V0X2RpcikgPCAxICYmIHJhbmdlIDwgODAwOyAgCiAgICAvLyDQktC+0LfQstGA0LDRidCw0LXQvCDRg9C/0YDQsNCy0LvQtdC90LjQtSBb0YHQutC+0YDQvtGB0YLRjCDQvtGCIDAg0LTQviAwLjUsINGD0LPQvtC7INC/0L7QstC+0YDQvtGC0LAg0L7RgiAtMSDQtNC+IDEsINC+0LPQvtC90YwgdHJ1ZSDQuNC70LggZmFsc2UsINC00LDQu9GM0L3QvtGB0YLRjCDQvtCz0L3RjyAo0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0YfQuNGB0LvQvildCiAgICByZXR1cm4gWzAuNSwgYSwgZmlyZSwgcmFuZ2UgKyBkXTsKfeKAiw==