Как стать автором
Обновить

Комментарии 70

Я пару дней назад на целый день залип на этой войнушке.
А я, походу, на ночь сегодня залипну.
НЛО прилетело и опубликовало эту надпись здесь
Не, там API был много лучше!
Второе апи, первое их апи было не далеко от этого
Проверил. Робот автора победил.
Интересно, изнутри робота есть ограничения на доступный код? Можно ли получить код робота противника и проанализировать его (например, для расчёта упреждения)?
По событию onScannedRobot(e) можно получить ссылку на обнаруженного робота e.robot, и у него уже получить код:
Robot.prototype.onScannedRobot = function(ev) {
var r = ev.robot;
var enemyCode = ev.scannedRobot.onIdle;
r.rotateCannon( analyzeEnemyMovement(enemyCode) );
r.fire();
//…
};

Понятно, что функция analyzeEnemyMovement получится непростой, но всё же…
Вообще говоря вам доступны положение и углы противника и его пушки
но недоступно, что он планирует сделать через секунду…
Если завтра война, вам не стоит командовать танком. Без обид
НЛО прилетело и опубликовало эту надпись здесь
поправочка:
var enemyCode = ev.scannedRobot.prototype.onIdle;
scannedRobot имеет, скорее всего, другой тип, его прототип равен null. Проверено через консоль. Вообще это была бы огромная дыра в безопасности, даже если просто граббить чужой код, анализировать и брать лучшее себе.
Да, всё там есть, я что-то прогадал этот момент… Код соперника в элементе script type=«robot/script» id=«robot-%userid%-code»

Зря удалили комментарий)
Я понял, что не смотря на 4 или 5 часов возни с апи этих танчиков я не догодался стянуть код самых крутых из них :D
НЛО прилетело и опубликовало эту надпись здесь
Более того, просто изменяя айди реплея в строке fightcodegame.com/robots/replay/717933/ мы можем перебирать ввобще весь код, т.к. реплей — это бой с теми же входными параметрами)
Весь спортивный интерес теряется, когда код чужих роботов становится доступным
Ну терять его или не терять — выбирать Вам. Я, к примеру, смотрю чужой код разве когда несколько боев подряд не могу победить.
Как я понял, проект воспитывает юных робототехников, даёт первый опыт программирования роботов в реальном времени. В случае открытого кода обучение проходит более эффективно, молодежь учится друг у друга новым алгоритмам. Очень полезный проект имхо.
НЛО прилетело и опубликовало эту надпись здесь
Теперь прийдется обфускацию кода делать.
Не могу найти никак эту консоль. Где она?
в браузере Developers tools/firebug и т.п.
Тоже не нашел, точнее нашел на вызов
log("qwe");
никак не реагирует.
еще советую на Scalatron посмотреть, заодно и Scala поучить.
НЛО прилетело и опубликовало эту надпись здесь
Почему ev.robot.parentId у клонов null?
Это у главного танка равен null, а у клонов id родителя. Так и проверяется кто клон, а кто нет.
UPD: Упс, вам уже ниже написали.
А есть ли что-нибудь подобное, но для шашек или других интеллектуальных игр?
Зачем Вы спросили? Теперь или Вы напишете или я :)
Есть наш проект: sourceforge.net/projects/softwarebattle/
Он еще довольно сырой, но использовать во всяких компьютерных школах вполне возможно (чем мы и занимаемся :))
Как показывает практика, неплохая стратегия — пускать робота и клона врассыпную. Так не настолько больно от заграждающего огня.

И ещё там можно создавать глобальные переменные, в коих можно хранить последние известные данные про роботов соперника, чтобы целиться более адекватно.
не могу придумать как отличить клона от оригинала.
НЛО прилетело и опубликовало эту надпись здесь
у моих почему-то всегда parentId null
Разобрался, у клона не работает robot.log
Эх. Клевая была.

А сейчас нет никаких аналогов?
именно аналогов — эмуляторов экосистем, не встречал.
Почувствуй себя водителем марсохода Curiosity ;)
Я не нашел, как стрелять с упреждением по цели? Как получить курс цели?
Можно получить только направление, в котором танк повернут носом, а так же направление, в котором повернуто дуло. Нельзя получить никаких данных об его динамике, разве вести руками статистику какую-либо.
Направление своего танка и направление дула? Данных о противнике — никаких получить нельзя?
Еще можно вопрос? Не нашел ответа.
Если я обнаружил врага в событии onScannedRobot, я могу изменить поведение робота в событии onIdle, те запретить ему мотать башней?
Да, там есть функция robot.stop()
Поясните, пожалуйста, еще про функцию notify.
Вот на эту функцию не смотрел, и сечас не имею возможности, т.к. на работе…
Известна скорость полета снаряда? Можно оценить скорость противника?
Эта статья перевод документации от игрока или автор имеет отношение к проекту?
Я очень интересуюсь подобными проектами в жанре «игры для программистов». Хотелось бы узнать про закулисье данной игры. Как долго она создавалась, какие цели, какие способы монетизации и перспективы?

Я еще сам не успел поиграть, как рабочий день закончится обязательно присоединюсь!
НЛО прилетело и опубликовало эту надпись здесь
Ни кто для себя не переводил на русский весь API?

// Moves ahead if direction equals to 1, backwards otherwise
move: functon(amount, direction)

Что за параметры? никак не пойму((
amount — расстояние, которое необходимо пройти (любое натуральное число);
direction — если ровна 1 робот идёт вперёд. Если указанно другое значение — назад;

ПРИМЕРЫ:
// 10 Шагов вперёд
r.move(10, 1);

// 20 Шагов назад
r.move(20, 0);

// 30 Шагов назад
r.move(30, -1);
Даже гуглотранслейтом понятно:

// Перемещение вперед, если направлении равна 1, в противном случае в обратном направлении
ход: функция (количество, направление)
Я всегда буду нажимать «Обновить комментарии»
Я всегда буду нажимать «Обновить комментарии»
Я всегда буду нажимать «Обновить комментарии»
У меня одного они с нормальной скоростью ездят только когда я на другую вкладку переключаюсь? Chrome, Q8800.
Оказалось, что нужно было отключить (то ли включить, не помню) вертикальную синхронизацию канваса в chrome://flags
У меня периодически когда нормально, когда «полчаса джамп — полчаса летаешь у гейта, да ещё и скаутишь через тимспик — а потом в клонилке видишь что тебя убили полтора часа назад» (простите, за сленг Eve Online, но, думаю, понятно). Заметил, что при тормозах нехило жрет CPU модуль GPU O_o (Cromium, A4, Ubuntu 12/10)
А вообще неверный код может завесить вкладку.
Кто-нибудь разобрался с системАМИ координат (прежде всего угловых)? Или, хотя бы, как на Robot брикпоинты повесить в Фоксе или Хроме?
Извините за вопрос, но что не так с системами координат?
Интересно, что именно хотели сделать и не получилось?
Например, эмпирческим путем (в конструкторе) определил, что robot.cannonRelativeAngle == 0 означает, что пушка направо свернута, а robot.cannonAbsoluteAngle (как же автодопа от JetBrains не хватает ещё :) может не совпадать с robot.angle даже с учетом их 90 градусов сдвинутости.

В общем хотел реализовать «инновационный алгоритм» исходя из школьной геометрии с учетом position в robot и scannedRobot (учитывал неоднозначность arccos в форме acos(dx/dd), а не acos(dx, dy), чтобы считал углу большие пи (к градусам, естествеено, приводил), а всё крутится непонятно куда. Ещё прикол, кстати с углами — врезаюсь в стену четко под 90 градусов, а ev.bearing дает (через ev.robot.log) — 0.

Хотя, сейчас подумал, какие-то неразберихи могла внести неправильно мною понятая модель «прерываний», хотя robot.stop совал куда угодно, лишь бы задумке не мешало.

целом, как-то плохо с доками, а ведь хватило бы одной картинки по идее.
robot.cannonAbsoluteAngle может не совпадать с robot.angle даже с учетом их 90 градусов сдвинутости
Может проблема в том что Вы вызываете robot.log(robot.cannonAbsoluteAngle) перед тем как танк успевает поворачивать пушку?

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

Ещё прикол, кстати с углами — врезаюсь в стену четко под 90 градусов, а ev.bearing дает (через ev.robot.log) — 0.
Попробуйте столкутся перед другим углом, например 45 и увидите что ev.bearing = -45. Это связано с тем, что ev.bearing возвращает угол стены относительно роботом, а не наоборот.

Ниже добавил маленький пример с помощью которого можно увидеть почему возникает первую проблему описанную Вами. Примерно такой вариант я использую для отладки всех действий:

var Robot = function () {},
bot = Robot.prototype,

botStopped, // узнаем если можно продолжить движение вперёд
gunRotated; // чтобы убедится что пушка будет перевернута лишь один раз

bot.onIdle = function (ev) {
   if (!botStopped) {
      var r = ev.robot;

      // Ждём пока робот не будет перевернут на 90 градусов
      if (r.angle == 90) {
         if (!gunRotated) {
            // Не забываем что пушка уже перевёрнута
            gunRotated = true;
            
            // Не забываем, что робот перевёрнут уже на 90 градусов
            // и чтобы пушка также была перевёрнута на 90 градусов
            // вращаем её на 90 градусов влево
            r.turnGunLeft(90);

            // Не смотря на то, что мы задали новое значение для угла пушки,
            // здесь показывает старое значение, так как пушка не успела перевернутся
            r.log(r.cannonAbsoluteAngle); // -> 180
         }
         
         // Пока есть возможность, идём вперёд маленькими шагами
         r.ahead(1);
      } else {
         // Будем вращать танк в наименьшую сторону
         r.turn((r.angle > 180) ? 1 : -1);
      }
   }
};

bot.onWallCollision = function (ev) {
   // Врезались в стену, нужно остановится
   botStopped = true;

   // Так как пушка уже перевёрнута, показывает правильное значение
   ev.robot.log(ev.robot.cannonAbsoluteAngle); // -> 90
};
Перепроверил сейчас — всё же robot.angle и robot.cannonAbsoluteAngle разные углы, когда пушка направлена вперед. Отличаются на robot.cannonRelativeAngle (что логично), который для пушки направленной вперед равен 90, а 0 градусов — развернутая на левый борт (что не логично). А для танка 0 градусов значит направление вверх, градусы считаются против часовой стрелки.

Спасибо, что помогли разобраться с тем, что команды танку асинхронные, что возврат происходит сразу, а не когда действие завершится.
Как вычислить, двигается ли противник и с какой скоростью?
Используйте глобальное переменное чтобы сохранить текущее местоположение противника и каждый раз, в событии onScannedRobot() обновите её значение. Если прежнее значение и текущее отличаются, значит противник движется.

Насчёт скорости, она постоянна (думаю, важнее узнать не скорость, а направление). Если Вы хотите рассчитать скорость противника, нужно использовать ещё одно глобальное переменное для того чтобы сохранить время когда получили последнее местоположение противника. Теперь, зная расстояние и время, Вы легко можете рассчитать скорость движения.

ПРИМЕР. Проверяем, двигается ли наш противник.
var Robot = function (robot) {},
bot = Robot.prototype,
enemy = {
   position : ''
};

bot.onIdle = function (ev) {
   // Вращаем пушку дабы найти наш противник
   ev.robot.rotateCannon(1);
};

bot.onScannedRobot = function (ev) {
   // Получаем текущее местоположение противника
   var pos = ev.scannedRobot.position,

   // Правильнее, сохранить данные в виде массива
   // чтобы было удобнее использовать их в дальнейшим
   // Но для простого примера, сохраняем местоположение в виде строки
   currentPosition = pos.x + '/' + pos.y;

   // Проверяем если противник изменил своё местоположение
   if (currentPosition != enemy.position) {
      // Проверяем если задано предыдущее местоположение
      if (enemy.position) {
         // Кажется, противник двигается
         // Что приказываете делать?
      }

      // Сохраняем новое местоположение противника
      enemy.position = currentPosition;
   }
};
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории