Pull to refresh

Comments 70

Я пару дней назад на целый день залип на этой войнушке.
А я, походу, на ночь сегодня залипну.
Второе апи, первое их апи было не далеко от этого
Интересно, изнутри робота есть ограничения на доступный код? Можно ли получить код робота противника и проанализировать его (например, для расчёта упреждения)?
По событию 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 получится непростой, но всё же…
Вообще говоря вам доступны положение и углы противника и его пушки
но недоступно, что он планирует сделать через секунду…
Если завтра война, вам не стоит командовать танком. Без обид
UFO landed and left these words here
поправочка:
var enemyCode = ev.scannedRobot.prototype.onIdle;
scannedRobot имеет, скорее всего, другой тип, его прототип равен null. Проверено через консоль. Вообще это была бы огромная дыра в безопасности, даже если просто граббить чужой код, анализировать и брать лучшее себе.
Да, всё там есть, я что-то прогадал этот момент… Код соперника в элементе script type=«robot/script» id=«robot-%userid%-code»

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

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

А сейчас нет никаких аналогов?
именно аналогов — эмуляторов экосистем, не встречал.
Почувствуй себя водителем марсохода Curiosity ;)
Я не нашел, как стрелять с упреждением по цели? Как получить курс цели?
Можно получить только направление, в котором танк повернут носом, а так же направление, в котором повернуто дуло. Нельзя получить никаких данных об его динамике, разве вести руками статистику какую-либо.
Направление своего танка и направление дула? Данных о противнике — никаких получить нельзя?
Читайте документацию по апи, функцию «onRobotScanned», там всё прекрасно описано.
Еще можно вопрос? Не нашел ответа.
Если я обнаружил врага в событии 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;
   }
};
Only those users with full accounts are able to leave comments. Log in, please.