fork(253) download
  1. function sqr(x)
  2. return x*x
  3. end
  4. function Distance(x1, y1, x2, y2)
  5. return math.sqrt(sqr(x1-x2) + sqr(y1-y2))
  6. end
  7.  
  8. pathIndex = nil
  9.  
  10. --Стрелять в ближайшего врага
  11. function ShootAtClosest()
  12. local mX, mY = api:position(0) --Наши координаты
  13. local n = api:count() --количество юнитов в радиусе видимости
  14. local myOwner = api:owner(0)--наш номер игрока (владелец робота)
  15.  
  16. local closestEnemy = 1.5*api.field_size
  17. local shotX = nil
  18. local shotY = nil
  19. for i = 1, n do
  20. if (api:type(i) == 2) then -- Юнит - робот
  21. local town = api:owner(i); -- Кому принадлежит робот
  22. if (town ~= myOwner and town >= 0) then -- Если вражеский робот
  23. local sx, sy = api:position(i) -- Позиция вражеского робота
  24. local dist = Distance(sx, sy, mX, mY) -- Расстояние до него
  25. if (dist < closestEnemy) then -- Проверка на кратчайшее расстояние
  26. shotX, shotY = sx, sy -- Сохранение результата, если робот находится ближе чем предыдущий найденный
  27. closestEnemy = dist;
  28. end
  29. end
  30. end
  31. end
  32. if (shotX) then -- если нашли хоть одного в области видимости
  33. api:shoot_at_pos(shotX, shotY)
  34. else
  35. api:shoot_stop()
  36. end
  37. end
  38.  
  39. function MoveToPoint(x, y) -- Двигаемся в точку x,y
  40. local mX, mY = api:position(0)
  41. api:move_by_delta(x-mX, y-mY)
  42. end
  43.  
  44. last = nil
  45.  
  46. function good()
  47. local mX, mY = api:position(0)
  48. local n = api:count()
  49. local myOwner = api:owner(0)
  50.  
  51. local bad = false
  52.  
  53. for i = 1, n do
  54. if (api:type(i) == 2) then -- Юнит - робот
  55. local town = api:owner(i); -- Кому принадлежит робот
  56. if (town ~= myOwner and town >= 0) then -- Если вражеский робот
  57. bad = true
  58. end
  59. end
  60. end
  61.  
  62. if (bad) then
  63. last = nil
  64. return false
  65. end
  66.  
  67. for i = 1, n do
  68. if (api:type(i) == 1) then
  69. local town = api:owner(i);
  70. local sx, sy = api:position(i)
  71. if (Distance(sx, sy, path[pathIndex].x, path[pathIndex].y) < 1e-5) then
  72. if (town == myOwner) then
  73. if (not last) then
  74. last = api:time()
  75. end
  76. if (api:time() - last > 200) then
  77. last = nil
  78. return true
  79. end
  80. end
  81. end
  82. end
  83. end
  84. return false
  85. end
  86.  
  87. function MoveAlongPath(path, isCycle) -- Двигаемся вдоль контура path, если isCycle = true, то зацикливаемся по контуру
  88. if (path == nil) then
  89. return
  90. end
  91. if (pathIndex == nil) then
  92. pathIndex = 0
  93. end
  94. local mX, mY = api:position(0)
  95.  
  96.  
  97. if (good()) then
  98. pathIndex = pathIndex + 1
  99. end
  100. if (path[pathIndex] == nil) then
  101. if (not isCycle) then
  102. return
  103. end
  104. pathIndex = 0
  105. end
  106. MoveToPoint(path[pathIndex].x, path[pathIndex].y)
  107. end
  108.  
  109. function Pass()
  110. local mX, mY = api:position(0)
  111. local n = api:count()
  112. local myOwner = api:owner(0)
  113.  
  114. local closestFriend = 2.1*api:radius(0)
  115. local friendX = nil
  116. local friendY = nil
  117. for i = 1, n do
  118. if (api:type(i) == 2) then
  119. local town = api:owner(i);
  120. if (town == myOwner) then
  121. local sx, sy = api:position(i)
  122. local dist = Distance(sx, sy, mX, mY)
  123. if (dist < closestFriend) then
  124. friendX, friendY = sx, sy
  125. closestFriend = dist;
  126. end
  127. end
  128. end
  129. end
  130. if (friendX) then
  131. api:move_by_delta((-friendX+mX) / 10 + (-friendY+mY), (-friendY+mY) / 10 - (-friendX+mX))
  132. -- api:shoot_at_pos(0, 0)
  133. return 1
  134. end
  135. return nil
  136. end
  137.  
  138. function Think()
  139. if (not Pass()) then
  140. if (capture) then
  141. MoveToPoint(capture.x, capture.y)
  142. else
  143. MoveAlongPath(path, true)
  144. end
  145. end
  146. ShootAtClosest() -- Стреляем в ближайшего соперника
  147. end
  148.  
Success #stdin #stdout 0.01s 2492KB
stdin
Standard input is empty
stdout
Standard output is empty