fork download
  1. //habrawars script for bot
  2. //http://h...content-available-to-author-only...r.ru/post/75928/
  3. //http://h...content-available-to-author-only...t.com/game/
  4. // Этот код будет обрабатываться внутри класса
  5. // Здесь можно задавать переменные, которые будут доступны во время всей симуляции
  6. this.target_id = -1;
  7. var memRange = undefined;
  8. var d = 0;
  9. // Метод action - основная функция, которая вызывается при обработке каждого фрейма
  10. // my_state - объект со свойствами вашего робота (id, x, y, angle, health, energy)
  11. // enemies - массив с объектами свойств противников (аналогично my_state)
  12. this.action = function(my_state, enemies, shots, params) {
  13.  
  14.  
  15. // Если не осталось противников - просто движемся вперед
  16. if (enemies.length == 0)
  17. return [0.5, 0, false, 0];
  18.  
  19. // Если ещё не выбрана цель или нашей цели больше нет, выбираем цель случайным образом
  20. // target_id - это ID цели, а не её индекс в массиве enemies (индексы могут меняться)
  21. if (!get_enemy_by_id(this.target_id, enemies))
  22. this.target_id = enemies[Math.round(Math.random() * (enemies.length - 1))].id;
  23.  
  24. // Переменная target будет содержать объект из списка enemies со свойствами цели.
  25. var target = get_enemy_by_id(this.target_id, enemies);
  26.  
  27. // Вычисляем под каким углом относительно нас находится цель
  28. var target_dir = get_direction(my_state.x, my_state.y, target.x, target.y);
  29.  
  30. // Вычисляем угол, на который нужно повернуться (от -1 до 1)
  31. var a = get_angle_control(my_state.angle, target_dir);
  32.  
  33. // Расстояние до цели
  34. var range = Math.sqrt(Math.pow(my_state.x - target.x, 2) + Math.pow(my_state.y - target.y, 2));
  35.  
  36. if (memRange != undefined){
  37. if( memRange > range ){
  38. d = -20;
  39. } else if ( memRange < range){
  40. d = 30;
  41. } else {
  42. d = 0;
  43. }
  44. }
  45.  
  46. memRange = range;
  47. //console.log(d);
  48. // Если нет энергии для выстрела и мы слишко близко - убегаем от противника
  49. if (range < 500 && my_state.energy < 65)
  50. a = -a;
  51.  
  52.  
  53. // Уворачиваемся от снарядов
  54. for (var i = 0; i < shots.length; i++)
  55. {
  56. var shot_dest = get_shot_destination(shots[i]);
  57. // Если снаряд должен попасть рядом с нами, уворачиваемся
  58. if (Math.sqrt(Math.pow(my_state.x - shot_dest.x, 2) + Math.pow(my_state.y - shot_dest.y, 2)) < 100)
  59. {
  60. var shot_dir = get_direction(my_state.x, my_state.y, shot_dest.x, shot_dest.y);
  61. // Выбираем направление, противоположное точки попадания снаряда
  62. var a2 = get_angle_control(my_state.angle, shot_dir + 140);
  63. // Месть!
  64. if (enemies.length < 2){
  65. this.target_id = shots[i].shooter;
  66. }
  67. var fire = angle_size(my_state.angle, target_dir) < 2 && range < 800;
  68. if ( fire && my_state.energy == 100 )
  69. return [0.5, a, fire , range + d ];
  70. else
  71. return [0.5, a2, false, 0];
  72. }
  73. }
  74. // Если угол между нами и целью < 1 градуса и расстояние < 800 - стреляем
  75. var fire = angle_size(my_state.angle, target_dir) < 1 && range < 800;
  76. // Возвращаем управление [скорость от 0 до 0.5, угол поворота от -1 до 1, огонь true или false, дальность огня (положительное число)]
  77. return [0.5, a, fire, range + d];
  78. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty