Pull to refresh

Физика Robocode

Reading time 5 min
Views 14K
Данный материал изначально был подготовлен в качестве раздела статьи “Первые шаги в Robocode”, но я решил вынести его, т.к. он значительно увеличивал размер и без того большой первоначальной статьи и не является базовым и необходимым для осуществления первого шага. Если вы сразу заинтересовались вторым шагом или постепенно доросли до него, то прошу под кат.

Единицы измерения


Для начала опишу единицы измерения.
  • Время измеряется в тиках, которые равны одному ходу. На ход даётся ограниченное количество реального времени, которое зависит от мощности процессора и вычисляется при первом запуске игры или по запросу пользователя. Если за указанное время робот не выдаст команду на следующий, ход, то этот ход будет “пропущен” (Но если вы ранее выдали команду “Проехать вперёд 100 пикселей”, то ваш робот будет двигаться до тех пор, пока не проедет заданное расстояние).
  • Расстояние измеряется в неких условных единицах. Однако, в случае, когда размеры поля битвы полностью влазят на экран, эти единицы равны одному пикселю. Если вы напишете “pixel” на (!!!) робовики, вам для вашего же блага сообщат тоже самое, но вас правильно поймут, поэтому далее я буду использовать термин пиксель. Значениями расстояние являются числах с плавающей точкой.
  • Скорость измеряется в пикселях за ход.
  • Вообще формула ускорения следующая a = v/(t^2), но т.к. 1 ход в игре является атомарной единицей времени, ускорение несколько упрощено и так же измеряется в пикселях за ход (подробнее расскажу позже).
  • Углы измеряются в радианах. Так же API позволяет использовать градусы и я вам настоятельно рекомендую выбрать для себя что-то и использовать эту величину везде, а т.к. вся тригонометрия работает с радианами, то именно их я и рекомендую выбрать.
  • Энергия, мощность пуль, урон измеряется в неких условных единицах. Я из буду называть “единицами энергии”.
  • Температура пушки измеряется в неописанных единицах и я буду использовать абстрактные градусы (далее просто “градусы”).

Начало координат, традиционно, находится в левом-нижнем углу, а вот углы необычные. 0 радиан указывает на север и далее по часовой стрелке: Pi / 2 — восток, Pi — юг, (Pi * 3) / 2 — запад, 2 * Pi — север.
image

Тактико-технические характеристики танка


Робот состоит из трёх частей — корпус, башня и радар, вращение которых зависимо между собой (однако вы можете выставить флаг автоматической компинасации). Тактико-технические характеристики у робота следующие:
  • Начальная энергия 100 единиц.
  • Мощность выстрела от 0.1 до 3-ёх единиц энергии.
  • Скорость полёта пули зависит от мощности и вычисляется по формуле 20 — (3 * <мощность выстрела>)
  • Максимальная скорость 8 пикселей/ход в обоих направлениях.
  • Максимальное ускорение 1 пиксель/ход.
  • Максимальное торможение 2 пикселя/ход.
  • Максимальная скорость поворота корпуса зависит от скорости танка и вычисляется по формуле (10 — 0.75 * <модуль скорости>) градусов/ход.
  • Максимальная скорость поворота башни равна 20 градусов/ход.
  • Максимальная скорость поворота радара равна 45 градусов за ход.
  • Изначально пушка имеет некоторый нагрев (на данный момент он равен трём градусам, но в реализации лучше вместо этой константы взять нагрев в первый ход), который постепенно уменьшается с интенсивностью, настраиваемой в момент создания битвы (значение по умолчанию, используемое в данный момент в официальных соревнованиях, равно 0.1 градуса за ход). Так же при выстреле пушка нагревается на следующую величину: 1 + <мощность выстрела> / 5. Стрелять можно только когда пушка холодная (нагрев равен 0).
  • Радиус арки радара составляет 1200 пикселей (танк может видеть только тех роботов, которые находятся в арке радара).

В ТТХ необходимо отметить 3 хитрости:
  1. При прохождении через ноль действует особое правило. Сначала танк тормозит, необходимую часть хода, а потом ускоряется оставшуюся. Таким образом, в случае если скорость танка равна 0.8 и он отдал команду двигаться назад, то результирующая скорость будет равна -0.6 (или 0.6 в обратном направлении), т.к. время на торможение равно 0.8 / 2 = 0.4 хода, оставшееся время на ускорение равно (1 — 0.4) = 0.6, скорость равна 1 * 0.6 = 0.6.
  2. При нулевой скорости и условии, что все три компонента поворачиваются в одном направлении, радар можно повернуть на 45 + 20 + 10 = 75 градусов. Если же радар крутится в противоположном от корпуса и башни направлении, то он повернётся только на 45 — 20 — 10 = 15 градусов за ход.
  3. Автоматическая компенсация поворота частей танка, не влияет на максимальные углы поворота. Например, если у танка выставлен флаг автоматической компенсации поворотов всех частей, радар имеет направление 90 градусов и была отдана команда повернуть корпус в право на 10 градусов, то направление радара останется равным 90 градусов. Если же кроме поворота корпуса, так же была отдана команда на поворот радара влево на 45 градусов, то направление радара станет равным 90 — (45 — 10) = 65 градусов.


Коллизии


В игре возможные следующие коллизии:
  • Робот с роботом. В модели игры роботы представляются не крутящимися (не зависящими от направления движения) прямоугольниками (на данный момент квадратами). Столкновение происходит при их пересечении и каждый робот получает повреждение в размере 0.6 единиц энергии. Так же на (!!!) робовики написано: “If a robot is moving away from the collision, it will not be stopped.” (если робот движется в противоположном столкновению направлении, то он не будет остановлен) и я, откровенно говоря, не знаю, что значит “в противоположном столкновению направлении” и, так как, это по большому счёту не важно, вычитать это в исходниках игры я оставляю наиболее любопытным читателям. Робот который двигался в “направлении столкновения” так же 1.2 очка.
  • Робот со стеной. Стены представляются отрезками и столкновение происходит при пересечении отрезка стены с ограничивающим прямоугольником робота. При этом робот получает повреждение в размере <модуль скорости> * 0.5 — 1; (Но не меньше нуля). Исключение в этом правиле я опишу позже
  • Робот с пулей. Пули представляются отрезками между положениями пули в текущий и предыдущий ход. Столкновения происходят при пересечении ограничивающего прямоугольника и отрезка, при этом жертва получает урон в размере 4 * <мощность пули>, если можность пули > 1, то ещё плюс 2 * (мощность — 1), а нападающему даёт бонусная энергия в размере 3 * <мощность пули> и столько же очков.
  • Пуля с пулей. Столкновение происходит при пересечении отрезков пуль и ни кто ни чего не теряет и не получает.


Вычислительный цикл (Robocode processing loop)


Вычислительный цикл в игре следующий:
  1. Перерисовка представления игры.
  2. Все роботы выполняют код до отдачи команды в собственных потоках, которые, затем, приостанавливаются.
  3. Обновляется время (время = время + 1)
  4. Перемещаются все пули и рассчитываются столкновения. Это включает в себя выстрелы новых пуль.
  5. Двигаются все роботы в следующем порядке: башня, радар, корпус, ускорение, скорость, положение.
  6. Все роботы выполняют сканирование.
  7. Возобновляется выполнение потоков роботов.
  8. Происходит обработка событий в потоках роботов.

Тут стоит обратить внимание на одну распространённую ошибку — пуля выстреливается до того как поворачивается пушка (см. шаги 4 и 5). Таким образом, вы должны повернуть пушку не к моменту выстрела, а за тик до этого.

На этом (включая статью «Первые шаги в Robocode») базовые знания о Robocode заканчиваются и вы, в принципе, готовы начать программировать своего первого робота. Продолжить читать можно на робовики, либо можно обратиться с вопросами ко мне в личку, либо в комментариях проявить интерес к продолжению цикла статей, посвященных Robocode
Tags:
Hubs:
+19
Comments 2
Comments Comments 2

Articles