Комментарии 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 получится непростой, но всё же…
По событию 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;
var enemyCode = ev.scannedRobot.prototype.onIdle;
scannedRobot имеет, скорее всего, другой тип, его прототип равен null. Проверено через консоль. Вообще это была бы огромная дыра в безопасности, даже если просто граббить чужой код, анализировать и брать лучшее себе.
(удалено)
Да, всё там есть, я что-то прогадал этот момент… Код соперника в элементе script type=«robot/script» id=«robot-%userid%-code»
Зря удалили комментарий)
Зря удалили комментарий)
Я понял, что не смотря на 4 или 5 часов возни с апи этих танчиков я не догодался стянуть код самых крутых из них :D
НЛО прилетело и опубликовало эту надпись здесь
Более того, просто изменяя айди реплея в строке fightcodegame.com/robots/replay/717933/ мы можем перебирать ввобще весь код, т.к. реплей — это бой с теми же входными параметрами)
Весь спортивный интерес теряется, когда код чужих роботов становится доступным
Ну терять его или не терять — выбирать Вам. Я, к примеру, смотрю чужой код разве когда несколько боев подряд не могу победить.
Как я понял, проект воспитывает юных робототехников, даёт первый опыт программирования роботов в реальном времени. В случае открытого кода обучение проходит более эффективно, молодежь учится друг у друга новым алгоритмам. Очень полезный проект имхо.
Теперь прийдется обфускацию кода делать.
Не могу найти никак эту консоль. Где она?
еще советую на Scalatron посмотреть, заодно и Scala поучить.
НЛО прилетело и опубликовало эту надпись здесь
Да, на главной странице: «click the fight to watch»
Почему ev.robot.parentId у клонов null?
А есть ли что-нибудь подобное, но для шашек или других интеллектуальных игр?
Зачем Вы спросили? Теперь или Вы напишете или я :)
Есть наш проект: sourceforge.net/projects/softwarebattle/
Он еще довольно сырой, но использовать во всяких компьютерных школах вполне возможно (чем мы и занимаемся :))
Он еще довольно сырой, но использовать во всяких компьютерных школах вполне возможно (чем мы и занимаемся :))
Как показывает практика, неплохая стратегия — пускать робота и клона врассыпную. Так не настолько больно от заграждающего огня.
И ещё там можно создавать глобальные переменные, в коих можно хранить последние известные данные про роботов соперника, чтобы целиться более адекватно.
И ещё там можно создавать глобальные переменные, в коих можно хранить последние известные данные про роботов соперника, чтобы целиться более адекватно.
помнится давно, когда microsoft начали продвигать .net, была такая программерска игра — terrarium
habrahabr.ru/post/74523/ — упоминается на хабре.
habrahabr.ru/post/74523/ — упоминается на хабре.
Почувствуй себя водителем марсохода Curiosity ;)
Я не нашел, как стрелять с упреждением по цели? Как получить курс цели?
Можно получить только направление, в котором танк повернут носом, а так же направление, в котором повернуто дуло. Нельзя получить никаких данных об его динамике, разве вести руками статистику какую-либо.
Направление своего танка и направление дула? Данных о противнике — никаких получить нельзя?
Известна скорость полета снаряда? Можно оценить скорость противника?
Эта статья перевод документации от игрока или автор имеет отношение к проекту?
Я очень интересуюсь подобными проектами в жанре «игры для программистов». Хотелось бы узнать про закулисье данной игры. Как долго она создавалась, какие цели, какие способы монетизации и перспективы?
Я еще сам не успел поиграть, как рабочий день закончится обязательно присоединюсь!
Я очень интересуюсь подобными проектами в жанре «игры для программистов». Хотелось бы узнать про закулисье данной игры. Как долго она создавалась, какие цели, какие способы монетизации и перспективы?
Я еще сам не успел поиграть, как рабочий день закончится обязательно присоединюсь!
Ни кто для себя не переводил на русский весь API?
// Moves ahead if direction equals to 1, backwards otherwise
move: functon(amount, direction)
Что за параметры? никак не пойму((
// 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, в противном случае в обратном направлении
ход: функция (количество, направление)
// Перемещение вперед, если направлении равна 1, в противном случае в обратном направлении
ход: функция (количество, направление)
У меня одного они с нормальной скоростью ездят только когда я на другую вкладку переключаюсь? Chrome, Q8800.
У меня периодически когда нормально, когда «полчаса джамп — полчаса летаешь у гейта, да ещё и скаутишь через тимспик — а потом в клонилке видишь что тебя убили полтора часа назад» (простите, за сленг 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 совал куда угодно, лишь бы задумке не мешало.
целом, как-то плохо с доками, а ведь хватило бы одной картинки по идее.
В общем хотел реализовать «инновационный алгоритм» исходя из школьной геометрии с учетом 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;
}
};
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
FightCode: танковые войны на JavaScript