вторник, 17 ноября 2009 г.

понедельник, 16 ноября 2009 г.

Перевод уроков

Полный перевод уроков посвящённых игре robocode

Скачать файл исходников примеров можно тут

Robocode ЧаВо 1.0 (на основе Robocode FAQ - 1.0.1)

Robocode ЧаВо 1.0 (на основе Robocode FAQ - 1.0.1)

Спасибо Christian Krause за первоначальный взнос вопросов и ответов, послуживший основой для оригинального FAQ'а. Персональная благодарность Mathew Nelson за разработку Robocode, а также за создание и поддержку оригинального FAQ. Настоящий ЧаВо содержит ответы на часто задаваемые вами вопросы и первоначально представляет собой перевод на русский язык оригинального FAQ. Обновление, дополнение, исправление производится на основе отзывов на этот ЧаВо, а также на основе оригинального FAQ. Вопросы-ответы
Q: Где я могу найти последнюю версию этого ЧаВо или оригинального FAQ

A: оригинальный FAQ (in english) http://robocode.alphaworks.ibm.com/help/robocode.faq.txt настоящее ЧаВо (на русском) http://robocode.narod.ru/docs/robocode.4aBo.txt
Q: Какая единица измерения длины используется в игре?

A: Пиксели, если игровое поле не было масштабированно, в противном случае единица измерения меньше пикселя.
Q: В чем измеряется время в игре?

A: Время измеряется в тактах, кадрах, тиках (часовых). Названия пока нет, но вы можете предложить свое. Метод getTime() возвращает номер текущего кадра в раунде, в начале раунда время есть 0.
Q: Какая максимальная скорость движения робота?

A: 8 пикселей за кадр
Q: Какое ускорение и замедление скорости движения?

A: Ускорение 1 пиксель/кадр. Замедление 2 пикселя/кадр
Q: Какая максимальная скорость поворота робота?

A: Максимальная скорость поворота (в градусах) вычисляется по формуле СкоростьПоворота = 10 - 3/4 * ЛинейнаяСкорость (Спасибо Stuart'у за ответ)
Q: Какая скорость поворота кабины?

A: 20 градусов/кадр
Q: Какая скорость поворота радара?

A: 45 градусов/кадр
Q: Влияют ли друг на друга скорости поворота робота, кабины и радара?

A: Да влияют. В случае, если радар привязан к вращению кабины, то при повороте радара влево, а кабины вправо, скорости будут вычитаться. Таким образом, скорость вращения радара будет 25 градусов/кадр = (45 - 20). При повороте радара и кабины в одну сторону, скорости будут складываться и суммарная скорость поворота радара будет 65 градусов/кадр = (45 + 20). Если радар не закреплен, то его скорость будет постоянной. Аналогично, если кабина привязана к вращению робота.
Q: Имеет ли место ускорение при повороте радара, кабины или робота?

A: Нет. Вращение происходит при постоянной максимальной скорости.
Q: Что произойдет, если робот врежеться в стену?

A: В этом случае робот прекратит движение и (если это AdvancedRobots) получит некоторое повреждение (потерю энергии) вычисляемое по формуле Повреждение = ЛинейнаяСкорость / 2 - 1
Q: Что произойдет, если робот столкнется с другим роботом?

A: Если робот ваш двигался навстречу другому роботу, то он прекращает движение и получает бонус в размере 1.2 (прирост энергии). Повреждения обоих роботов составляют по 0.6 (потеря энергии).
Q: Какая степень повреждения от попадания пули?

A: Если энергия пули меньше 1, то повреждение вычисляется как Повреждение = 4 * ЭнергияПули. Если энергия пули больше 1, то повреждение выше Повреждение = 4 * ЭнергияПули + 2 * (ЭнергияПули - 1)
Q: Какую энергию может иметь пуля?

A: от 0.1 до 3.
Q: Как расходуется энергия на стрельбу?

Очень просто, вы передаете часть своей энергии пуле, то есть, выстреливая пулю с энергией 3 потеря энергии также 3.
Q: Как восполнять энергию?

A: При попадании пулей в другого робота, вы получаете прирос энергии ПриростЭнергии = ЭнергияПули * 3, Пули крадущие силы.
Q: С какой скоростью летит пуля?

A: Скорость пули определяется ее энергией и считается так Скорость = 20 - 3 * ЭнегияПули. Таким образом, скорость пули от 11 до 19,7 пикселей/кадр
Q: Как влияет скорость движения робота на скорость его пули?

A: Никак не влияет.
Q: А почему?

A: Хммм…Ээээ… Это энергитические пули, а энергитические пули нарушают классические законы физики :)
Q: Когда можно выстрелить пулей?

A: Только если пушка остыла, то есть уровень нагрева пушки равен 0. В начале каждого раунда все пушки «горячие».
Q: Насколько греется пушка, после выстрела?

A: Это определяется энергией пули в считается по формуле НагревПушки = 1 + (ЭнергияПули / 5)
Q: Как быстро пушка остывает?

A: Этот параметр устанавливается в начале битвы. Обычно 0.1/кадр
Q: Что означает, если робот вышел из строя ('disabled')?

A: Это означает, что ваша энергия равня 0, но робот еще не уничтожен. Энергия может восполниться, если уже выпущенный пули поразят кого-нибудь.
Q: Что происходи, когда я подаю роботу команду, например ahead(100)?

A: Поток выполнения вышего робота переходит в состояние ожидание, вызывая метод Object.wait(). Когда все роботы перешли в состояние ожидание, Игра обновляет координаты и углы поворотов, генерирует события, которые пробуждают поток выполнения вышего робота. В первую очередь после пробуждения поток выполнения обрабатывает все полученные события.
Q: Когда вызывается событие onSkippedTurn (пропущен ход)?

A: Когда ваш робот вычисляет (думает) очень долгое время, вызывается событие «пропущен ход». которое означает, что вы пропустили свою очередь сделать ход (хоть что-нибудь) в этом кадре. Вы НИКОГДА не получите это событие пока укладываетесь в график. Если пропустили два хода подряд, то вы теряете полученные собития. Если вы пропустите 30 ходов подряд, то ваш робот будет удален из раунда и не получит ни одного очка. Длительность одного хода составляет примерно 15 миллисекунд, для каждого робота. Однако эта число разичается для разных систем.
Q: Когда накладывается ускорение, до или после движения?

A: Ускорения накладывается после поворотов, но перед движением. Ставиться угол поворота, ускорения, скорость, затем движения по x и y.
Q: Во время обработки события, продолжает ли оно находится в очереди событий?

A: Нет, событие удаляется из очереди, сразу перед вызовом обработчика события.
Q: Как я могу использовать метод getAllEvents (вернуть все события)?

A: (использован ответ Graygoo) Добавьте новое условие (Condition), при проверке которого вызывается функция для записи состояния. Например:

public void run()
{
addCustomEvent(new Condition("recordEverything")
{
public boolean test()
{
MyRobot.this.recordState();
return false; // Таким образом обработчик onCustomEvent не вызывается
}
};

}


public void recordState()
{
// добавить вызов getAllEvents();
clearAllEvents();
}

Q: Могу ли я использовать какие-либо IDE (интегрированные среды разработки) для компиляции роботов?

A: Конечно, просто добавьте в путь для поиска классов ссылку на файл robocode.jar.
Q: Насколько велика область сканирования?

A: Область сканирования это сектор радиусом 1200 пикселей, ограниченный лучами на предыдущее направление радара и на текущее. Вы можете их видеть если включите флажек «Visible scan arcs» (Видимые области сканирования) в меню настроек.
Q: В каком порядке поступают события при обнаружении роботов радаром?

A: События поступают в порядке по возрастанию расстояния до робота. Самые близкие в первую очередь.
Q: В каком порядке поступают на обработку другие события?

A: События отсортированы по их приоритетам. Приоритеты событий взяты из документации для класса AdvancedRobot из описания метода setEventPriority (установить приоритет события)

*
ScannedRobotEvent: 10
*
HitRobotEvent: 20
*
HitWallEvent: 30
*
HitByBulletEvent: 40
*
BulletHitEvent: 50
*
BulletHitBulletEvent: 50
*
BulletMissedEvent: 60
*
RobotDeathEvent: 70
*
CustomEvent: 80
*
SkippedTurnEvent: 100
*
WinEvent: 100
*
DeathEvent: 100

Q: Временами я не получаю такое то (какое-либо) событие?

A: Если вы даете команду, требующую определенного времени для выполнения, например ahead(100), вызывая ее из обработчика какого-либо события, то все события имеющие равный приоритет или приоритет ниже будут потеряны до окончания выполния команды. Это относиться также к пользовательским собитиям (custom events), имеющим по умолчанию очень высокий приоритет (80).
Q: И как этого можно избежать?

A: Обработчики события, как правило, должны быстро завершать свою работу. Например можно установить, какие-либо флаги, для индикации, что необходимо сделать, а потом в методе run вызвать нужные команды. Или можно создать пользовательское событие (custom event) с очень низким приоритетом, которое вызывалось бы каждый ход.
Q: Для чего нужен метод setInterruptible (установить вытеснение) класса AdvancedRobot?

A: Этот метод устанавливает режим при котором события с приоритетом РАВНЫМ приоритету текущего события перезапускают текущий обработчик в процессе обработки события.
Q: Что произойдет, если в методе run даны несколько одинаковых команд, но с разными параметрами.

A: Выполниться команда, данная последней.
Q: Что нового появиться в Robocode?

A: Текищий список замыслов (todo-list) можно посмотреть по адресу in english http://robocode.net/robocode.todo.txt

Robocode ЧаВо 1.0 (на основе Robocode FAQ - 1.0.1) http://ntropy.narod.ru/ 2:42 15 июля 2003