Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.ru/trac/tanchiki/wiki/Requirements?version=9
Дата изменения: Unknown
Дата индексирования: Mon Apr 11 17:20:40 2016
Кодировка: UTF-8
Requirements ? Tanchiki
wiki:Requirements

Version 9 (modified by whitequark, 5 years ago) (diff)

--

Техническое задание

Целью данной работы является проектирование и реализация симулятора взаимодействия нескольких моделей в двумерном пространстве с заданными ограничениями, причем поведение этих моделей может задаваться пользовательской программой.

Симуляция проводится фиксированными шагами (tick), во время каждого из которых изменение физических параметров моделей не может быть больше определенной величины. Для простоты реализации, симуляция происходит на поле фиксированного размера, имеющем границы, непроницаемые для каких-либо объектов.

Условия симуляции

В качестве модели выбран упрощенный танк: модель состоит из платформы (body) и башни (turret), и подчиняется следующим законам:

  1. Платформа способна поворачиваться относительно мировой системы отсчета. При этом считается, что поворот происходит безынерциально, однако не более, чем на определенный угол в течение шага симуляции.
  2. Платформа может двигаться вперед и назад, при этом направление движения задается углом поворота платформы. Платформа может двигаться не более, чем с определенной скоростью, и ускоряться не более, чем на определенную величину за шаг.
  3. Башня может поворачиваться относительно платформы, и изменение угла поворота также ограничено.
  4. Танк может стрелять один раз за шаг симуляции. При этом снаряд появляется сразу перед башней стреляющего танка, и движется равномерно и прямолинейно в направлении, в котором была направлена башня в момент выстрела относительно мировой системы отсчета.
  5. Танк имеет запас прочности, который может уменьшаться в результате различных событий. При достижении нуля считается, что танк вышел из строя, и он исключается из симуляции.
  6. При столкновении снаряда с танком снаряд исчезает, а запас прочности танка уменьшается на 1.

Танк способен получать информацию о некоторой области симуляции, которая его окружает, в частности положения и скорости движения окружающих его снарядов и танков (но не углы поворота различных частей танка). Считается, что эту информацию танк получает при помощи радара, что и накладывает указанные огранчиения. Область видимости может совпадать со всем пространством симуляции или быть кругом фиксированного радиуса, центрированным на танке.

Для расчетов столкновений принимается, что танк имеет форму круга, равного длине башни. В частности, при выстреле снаряд появляется сразу же за соответствующей точкой круга.

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

Изначальные условия для всех танков идентичны. Изначально угол поворота башни и скорость равны нулю.

Управление

Структура симулятора должна подразумевать возможность двойственного управления поведением танков: каждый конкретный танк может управляться либо программно, в случае чего пользователь не может никак на него воздействовать, либо вручную, в случае чего пользователь полностью управляет танком.

Реализация может включать в себя один или оба способа такого управления, причем при наличии ручного управления в интерфейсе должна учитываться область видимости и ограниченность известной танку информации об окружении.

Интерфейс пользователя

Интерфейс программы должен состоять из нескольких окон.

  1. Окно конфигурации. В этом окне можно настроить параметры симуляции, задать количество и тип управления для танков, и запустить симуляцию. Настраиваемые параметры:
    • Максимальная скорость и ускорение платформы.
    • Максимальная скорость поворота платформы и башни.
    • Изначальный запас прочности.
  2. Обзорное окно. Это окно показывает симуляцию в целом, отображая полную информацию о всех объектах симуляции, в том числе углы поворота и запас прочности. Так же данное окно получает события клавиатуры в случае ручного управления.
  3. Окна ручного управления. В тех случаях, когда для одного или нескольких (если реализовано) танков выбран ручной режим управления, для каждого из них порождается подобное окно, отображающее только информацию, доступную танку, со всеми ограничениями.

В двух последних окнах нет элементов управления, а есть только отрисованная симуляция (или ее часть).

Должна быть возможность скрыть изображение в обзорном окне для того, чтобы не предоставлять лишнюю информацию в случае ручного управления.

Интерфейс программирования

В симуляции используется один вспомогательный класс, Vector, упрощающий работу с углами. Его методы:

  1. initialize(x=0, y=0), создает радиус-вектор с координатами x, y.
  2. is_null(), возвращает True, если данный вектор -- нулевой.
  3. rotation(), возвращает угол, на который повернут вектор относительно оси Ox против часовой стрелке, в радианах. (То же самое, что угол в тригонометрической окружности). При попытке получить поворот нулевого вектора возбуждается исключение.
  4. length(), возвращает длину вектора.
  5. set_rotation(angle), возвращает новый вектор, для которого rotation() возвратит angle. Например, vector.set_rotation(0) возвращает вектор, лежащий на оси Ox.
  6. set_length(length), возвращает новый вектор длины length, коллинеарный данному. При передаче отрицательной длины возвращается противоположно направленный вектор, по модулю равный -length.
  7. change_rotation(angle), то же самое, что vector.set_rotation(vector.rotation() + angle).
  8. change_length(length), то же самое, что vector.set_length(vector.length() + length).

Код, управляющий танком (контроллер) представляет из себя класс, наследуемый от класса TankController. В случае программного управления этот класс определяется явно и отдельно для каждого ИИ, а в случае ручного используется один и тот же подкласс, определенный изначально и связанный с органами управления.

Когда в симуляции происходит какое-то событие, она вызывает соответствующий метод контроллера, который и должен обработать это событие.

Шаг симуляции: событие on_tick

Унаследованный класс должен определить как минимум один метод, который является главным для процесса управления -- метод {{on_tick(tank, other_tanks, bullets)}}. Этот метод будет регулярно вызываться симуляцией, и каждый раз в него будут передаваться аргументы, содержащие снимок той информации, которая была доступна танку на момент начала шага симуляции.

  1. tank: объект класса Tank, описывающий собственно танк, к которому относится этот контроллер.

Его свойства:

  • strength: Integer, текущий запас прочности танка.
  • position: Vector, положение танка в мире.
  • velocity: Vector, скорость и направление движения танка.
  • base_rotation: Integer, угол поворота платформы относительно мировой системы отсчета. При движении танка вперед совпадает с velocity.rotation(); иначе эти два числа отличаются на ?.
  • turret_rotation: Integer, угол поворота башни относительно платформы.

Его методы, управляющие поведением:

  • rotate_base(angle): поворачивает платформу танка. Перед расчетами angle сравнивается по модулю с максимальной скоростью поворота и, если необходимо, уменьшается до нее.
  • rotate_turret(angle): поворачивает башню танка относительно платформы. Параметр angle обрабатывается аналогично методу rotate_base.
  • accelerate(speed_delta): изменяет скорость танка. Перед всеми расчетами speed_delta сравнивается по модулю с максимальным ускорением и, если необходимо, уменьшается. Если параметр speed_delta превышает по модулю скорость и имеет противоположный знак (например, speed_delta = 10, а танк движется назад со скоростью 5), то скорость будет уменьшена до нуля.
  • fire(): производит выстрел.

  1. other_tanks: массив объектов TankSnapshot, унаследованных от ObjectSnapshot; содержит информацию о всех видимых танках.

Свойства базового класса ObjectSnapshot:

  • handle: идентификатор объекта, не имеющий смысла для контроллера. Гарантируется, что пока объект не выйдет из области видимости, его идентификатор не изменится.
  • position: Vector, положение объекта в мире.
  • velocity: Vector, скорость и направление движения объекта.

Свойства класса TankSnapshot:

  • strength: Integer, текущий запас прочности танка.

  1. bullets: массив объектов BulletSnapshot, унаследованных от ObjectSnapshot; содержит информацию о видимых пулях.

Рождение и смерть: события on_spawn и on_death

Симуляция может проходить в несколько этапов (раундов), при этом у контроллера должна быть возможность адаптироваться к конкретному набору противников, поэтому в случае такого проведения симуляции контроллер будет создан перед началом первого этапа и уничтожен после окончания последнего. Для того, чтобы контроллер мог определить границы этапа, в начале этапа будет вызван его метод on_spawn(), а в конце -- on_death(). Все остальные обработчики событий будут вызываться только между этими двумя.

Повреждение: событие on_hit

При попадании снаряда в танк уменьшается его прочность и после этого вызывается обработчик события on_hit(bullet). Этот метод будет вызван перед началом следующего шага симуляции и, соответственно, до вызова метода on_tick.

Параметр bullet является объектом класса BulletSnapshot, с семантикой, соответствующей описанной для события on_tick; в т.ч. если этот снаряд был видимым для танка до удара, то его свойство handle будет соответствовать полученному в событии on_tick.

Если это повреждение оказалось для танка фатальным, то вместо метода on_tick на этом шаге будет вызван метод on_death.

Столкновение: событие on_collision

При столкновении с другим танком (как описано в условиях симуляции) для того танка, скорость которого была уменьшена, будет вызван обработчик события on_collision(tank); параметр tank является объектом класса TankSnapshot, аналогично параметру bullet для события on_hit.