Танки в браузере

Tank

У многих были (и есть) машинки/танчики/БТР на радиоуправлении. Я не исключение — тоже имел парочку таких. В то далекое время не сильно задумывался над тем, а как же они ездят и какие там алгоритмы (я тогда и слова такого не знал). А на днях узнал, что есть интересный проект — fightcodegame.

Тут пользователю дается возможность создать свой виртуальный танк (и не один) и запрограммировать его поведении на поле боя с танками соперников. Да, во время боя у нас нет никакого джойстика/манипулятора для управления своим танком. Есть только код, написанный Вами ранее.

Как и в любой многопользовательском соревновании, в FightCode есть ТОП-10 и общий рейтинг роботов. Не игроков, а именно роботов, так как у каждого игрока может быть сколько угодно роботов. Попасть в ТОП-10 не просто, если Вы не используете код роботов, которые уже в нем :).

Увы, во время боя можно посмотреть исходники робота-соперника в код страницы. Наверно, именно по этому в первой десятке очень много роботов с одинаковыми js-кодом. Стоит сказать, что сильно глубокое познание javascript не требуется — хватит базовых навыков и умения гуглить. Вообще, цель игры — развить в себе алгоритмическое мышление. А оно от ЯП не сильно зависит (в данном случае).

Ближе к коду

Авторизация в игре происходит через GitHub, что уже мотивирует (смотреть на кнопки «Войти через ВК», «FB auth» и т.д. уже тошно). Да и аудитория на GitHub’e более «целевая» что-ли. После авторизации следует почитать про доступный API — ссылка.

Ну и можно приступать к созданию своего робота. О чем забывает большое количество игроков — можно писать не только обработчики событий (idle, scannedRobot, robot/wall collision и т.д.), но и «глобальные» методы и свойства для хранения истории перемещений танка соперника, нормального преобразования углов.

Угол поворота дула лучше пересчитывать так:

function CannonAngle(r) { // r - robot
  var angle = r.cannonAbsoluteAngle + 270;
  if (angle > 360) angle -= 360;
  return angle;
}

Угол между танками можно считать так (подсмотрел не помню у кого):

function angle(r, target_position) {
    var rx = r.position.x;
    var ry = r.position.y;
    var tpx = target_position.x;
    var tpy = target_position.y;
    var angle = Math.atan2(tpx - rx, ry - tpy) * 180 / Math.PI;
    if (angle < 0) angle += 360;
    return angle;
}

При начале игры нужно сразу создавать клона и разводить наши танки в разные стороны:

if (r.availableClones) {
    r.clone();
    r.turn(90);
}

При обнаружении робота надо проверить, не является ли он «нашим» (если Вы используете клона):

Robot.prototype.onScannedRobot = function(ev) {
  var r = ev.robot;
  var sr = ev.scannedRobot;
  if (sr.parentId == r.id || sr.id == r.parentId) {
    return;
  };
}

При столкновении с другим роботом так же нужно проверять на «свой/чужой» (и если чужой, то можно и шмальнуть):

Robot.prototype.onRobotCollision = function(ev) {
  var r = ev.robot;
  var cr = ev.collidedRobot;
  if (!(cr.parentId == r.id || cr.id == r.parentId)) {
    r.turn(ev.bearing);
    r.fire();
  }
}

Если в нас попали, то стоит использовать маскировку. Путем экспериментов выяснилось, что ее лучше использовать при первом же попадании:

Robot.prototype.onHitByBullet = function(ev) {
  var r = ev.robot;
  if (r.availableDisappears) {
    r.disappear();
  }
}

Еще при этом можно развернуться в сторону, откуда прилетел снаряд, но это уже по желанию.

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

Результаты

Сейчас мой основной танк Googlebot имеет рейтинг 1692 и находится на 147-м месте.

Result

Стоит сказать, что танк может воевать и без Вашего ведома. Так у меня получалось, что за одну ночь Googlebot поднялся на 100+ позиций в рейтинге.

Эпилог

Вцелом, это довольно интересная игра, которая хорошо разминает мозг после рутинных рабочих задач и дает хорошую порцию позитивных эмоций, ведь «KILLING ROBOTS FOR FUN!»

, ,

Оставить комментарий

Top ↑ | Main page | Back