Ну что, поехали?

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

Координаты вашего танка:

Здесь все просто: в функцию, в которой вы реализовываете всю логику вашего бота, приходит объект: world, у которого есть поле: objects, представляющее собой массив из всех существующих объектов в текущий тик. В этом массиве вам предстоит разыскать ваш танк, у которого будет type: “player” и user: имя, которое вы указали при авторизации. Так же, здесь в objects, вы можете найти полезную информацию о всех объектах на карте. Главное помните, что type: "player" - это танк, type: "shell" - выпущенный снаряд, а type: "bonus" - бонусы, периодически появляющиеся на поле.

Координаты места назначения:

Могут быть любые интересующие вас координаты: координаты бонуса, координаты соперника, центр поля или самая удаленная точка от ваших противников. Все зависит от того, какую цель вы преследуете. Помните, что в objects много полезной для вас информации.

Магия:

move-xy = [x2-x1, y2-y1] - и вы двигаетесь в нужном направлении

function getDirection(start_xy, destination_xy) {
    return [destination_xy[0] - start_xy[0], destination_xy[1] - start_xy[1]];
}

А вот и обещанные функции, которые решают некоторые математические задачи:

Расстояние между двумя точками:

Функция принимает два массива с координатами точек начала [x1, y1] и конца [x2, y2] отрезка и возвращает длину отрезка:

function getDistanceBetweenTwoPoints(start_xy, destination_xy) {
    var x = Math.abs(start_xy[0] - destination_xy[0]);
    var y = Math.abs(start_xy[1] - destination_xy[1]);
    return Math.sqrt((Math.pow(x, 2) + Math.pow(y, 2)));
}
Угол между двумя векторами:

Функция принимает координаты двух векторов [x1, y1] и [x2, y2] (не путать с координатами точек) и возвращает угол между ними. Координаты вектора вы уже научились находить (см. выше ф-цию getDirection()).

function getAngleBetweenTwoVectors(vector_a, vector_b) {
    var scalarMultiply = vector_a[0] * vector_b[0] + vector_a[1] * vector_b[1];
    var abs_a = Math.sqrt(Math.pow(vector_a[0], 2) + Math.pow(vector_a[1], 2));
    var abs_b = Math.sqrt(Math.pow(vector_b[0], 2) + Math.pow(vector_b[1], 2));
    var cos_angle = scalarMultiply / (abs_a * abs_b);
    return Math.acos(cos_angle) * 180 / Math.PI;
}
Точка пересечения двух прямых:

Эта непростая функция принимает координаты начальной и конечной точек для каждой из двух прямых и выдает координату точки их пересечения, если такая имеется и false в случае если прямые не пересекаются. Таким образом, вам нужно будет передать в функцию четыре массива с координатами и проанализировать результат.

function checkLineIntersection(line1_start, line1_end, line2_start, line2_end) {
    var denominator = ((line2_end[1] - line2_start[1]) * (line1_end[0] - line1_start[0])) - ((line2_end[0] - line2_start[0]) * (line1_end[1] - line1_start[1]));
    if (denominator == 0) {
        return false;
    }
    var a = line1_start[1] - line2_start[1];
    var numerator1 = ((line2_end[0] - line2_start[0]) * a) - ((line2_end[1] - line2_start[1]) * b);
    a = numerator1 / denominator;

    var x = line1_start[0] + (a * (line1_end[0] - line1_start[0]));
    var y = line1_start[1] + (a * (line1_end[1] - line1_start[1]));
    return [x, y];
}