Pull to refresh

Comments 35

UFO just landed and posted this here
Зависит. Можно подкрадываться и съедать конкурентов делением. Можно кидать приманки, можно растить зеленые растения, чтобы они делились и разрывали бОльшего конкурента на части…
Шахматы прям :)
Да. На самом деле, успех в игре зависит прежде всего от умений игрока, а уже потом от удачи.

Для того, чтобы стабильно выбиваться в лидеры нежно освоить несколько приемов:
1) рассчитывать свою массу и массу противника, чтобы при делении не оказаться в патовой ситуации и не быть съеденным;
2) разбивать лидеров в с помощью зубастых клеток;
3) обмениваться массой между поделившимися клетками;
4) ретироваться делением в случае угрозы со стороны лидеров;
С помощью клавиши W можно кидать массу в зеленое растение — от этого оно распухает и в какой-то момент делится. Таким образом можно делать ловушки для близких к растению соперников, разбивая их на части прилетевшим к ним новым растением.
Круто, я тоже пользовался fiddler'ом, но хотел немного более интеллектуального бота. Поделюсь своей наработкой немного деобфусцированного скипта, правда, одной из предыдущих версий, gist.github.com/abby-sergz/65aad7682de388f14ee2.
Круто! Спасибо!
Уже есть достижения в интеллекте бота?
Достижений пока нет, основная причина — мало времени :)
Во-первых, сервер раскидывает игроков по игровым комнатам. Поэтому со мной на карту из 50 ботов попадают 2-3. Остальные «играют» в других комнатах, следуя по координатам из соседней Вселенной.

Можно переконнектиться к нужному серверу, зная его IP: в консоли после выбора региона будет написан ip-адрес, потом можно коннектиться к нему:
connect("ws://213.219.39.46:443"); //нужный ip сервера

Правда, наверное, нужно будет что-то подправить чтобы это всё работало на одной странице.
Если я не ошибся, то сервер на одном ip содержит много игровых комнат. Потому что я подставляю один и тот же ip для всех ботов. Но ко мне попадает лишь часть. Другие крутятся с другими игроками.
В итоге в комнате играет 15-20 игроков, на сервер может и 5000.
Хм, точно. Тестил со вкладками браузера. Если подключаться довольно быстро, то попадаю в одну комнату, если через некоторое время, то уже кидает в другую.
в US-Fremont всего 3 комнаты на сервак)
Можно и проще. Перед загрузкой удаляем main_out из страницы и подгружаем свою копию. Пример для GM или аналогов — pastebin.com/7ZhB5cVD
К сожалению работает не для всех браузеров.
«beforescriptexecute» был убран из Chrome.
В треде на reddit уже всё давно обсудили, и даже разработчик ответил: www.reddit.com/r/Agario/comments/34z3zp

Да и на youtube, к слову, такие же боты-кормильцы 8 дней как выложены: www.youtube.com/watch?v=XyLWCdnff2A
Я пошел по другому пути. Ботов не стал делать, а расковырял оригинальную js и сделал пачку улучшений код на githab
Круто, еще бы границы поля сделать видимыми и флаги вернуть)
Ага про поля как доберусь, сделаю. А флаги стран работают даже с «Enemy Types Hack», сейчас проверил.
Я пошёл дальше и вообще исключил игрока оставив лишь ботов, которые кооперируются для выживания.

Свой код я инъектирую с помощью отладчика. Достаточно остановить его в любой внутренней функции и мы имеем полный доступ ко внутренним переменным. Так что можно через консоль создать замыкание, вызывающееся по таймеру, и можно творить что угодно.

Инфа о своих клетках находится в хэше «m». Инфа обо всех остальных клетках лежит в словаре «v». Этого уже достаточно для игры. Пробегаемся в цикле по своим клеткам и по чужим и складываем вычисленные для пар «я — не я» ускорения. Потом дёргаем onmousemove, чтобы сообщить движку в какую сторону мы хотим ускориться.

Все чужие клетки делятся на следующие группы:

1. Вирусы — зелёные пассивные клетки, которые могут взрывать остальных. У них стоит флаг isVirus. От них отталкиваемся по обратно квадратичному закону.

2. Друзья — дружеские боты, действующие всоседних вкладках. Их определяем по префиксу в имени. К ним притягиваемся с константной силой. Это позволяет им находить друг друга даже если отреспаунились в разных конца карты.

3. Враги — клетки, которые больше максимального размера, что мы можем съесть. От них отталкиваемся как отвирусов, но с другим коэффициентом.

4. Еда — все остальные клетки, существенно меньше нашей. К ним притягиваемся по обратно квадратичному закону.

Кроме того, чтобы бота не зажимали к стенке, добавляем отталкивание от них в перпендирулярних к ним направляниях по тому же закону обратных квадратов.

Итого это позволяет убегать от группы врагов поедая попадающуюся по пути еду и сливаться с друзьями образуя более крупную особь. Однако люди всё ещё могут хитростью зажать нашего бота в тиски или порвать его простреливая через вирус.

Чтобы отреспауниться, достаточно вызвать функцию setNick(string). Я её вызываю просто всегда при вызове моего замыкания.

Фото рекорда:
image

Видео с четырьмя ботами:


Код бота без констант - подберите свои значения :-)
window.canvas = document.getElementById('canvas')

if( window.botovod ) clearInterval( botovod )

window.botovod = setInterval(function () {
    setNick(nname)

    var mys = m

    var others = Object.keys(v).map(function (k) {
        return v[k]
    })

    var dist = function (one, two) {
        return Math.sqrt( Math.pow(one.x - two.x, 2) + Math.pow(one.y - two.y, 2) )
    }

    var aX = 0
    var aY = 0

    mys.forEach( function(my) {
        others.forEach(function (o) {
            if( my === o ) return
            var od = dist(my, o)
            if (o.isVirus) { // virus
                var f = - localStorage.antivir / Math.pow(od, 2)
            } else if (o.name.indexOf(pfix) === 0) { // friend
                var fac = my.size / o.size
                if( fac > 1 ) fac = 1/fac
                if (fac < 0.9) {
                    var f = localStorage.friendly
                } else {
                    var f = 0
                }
            } else if ( ( my.size / o.size ) > 1.2) { // food
                var f = o.size * localStorage.hunger/ Math.pow(od, 2)
            } else { // enemy
                var f = - o.size * localStorage.danger / Math.pow(od, 2)
            }
            if (isNaN(f)) return
            aX += (o.x - my.x) * f / od
            aY += (o.y - my.y) * f / od
        })

        aX += localStorage.bords / my.x
        aX += -localStorage.bords / Math.abs(my.x - 12000)
        aY += localStorage.bords / my.y
        aY += -localStorage.bords / Math.abs(my.y - 12000)

    })

    var a = Math.sqrt( Math.pow( aX , 2 ) + Math.pow( aY , 2 ) ) || 1

    var offX = aX * 100 / a
    var offY = aY * 100 / a

    var mX = Math.abs(canvas.clientWidth / 2 + offX)
    var mY = Math.abs(canvas.clientHeight / 2 + offY)

    canvas.onmousemove({ clientX: mX, clientY: mY })

}, 50)

Великолепно!
На сколько сложным будет добавление возможности делиться пополам, чтобы съесть соперника?
или это слишком рискованно?
Да не очень сложно, правда для этого придётся уже учитывать не только координаты как сейчас, а ещё и скорости. В любом случае, деление — довольно рискованная операция, так как нельзя управлять каждой своей частью независимо.
Спасибо, за статью, но читерство — это плохо.
Я допускаю, что данное решение может привести в лидерству с куда большей вероятностью, чем это можно сделать самому.
Но самый главный вопрос возникающий при борьбе за бОльшее количество своих ботов в комнате — А смысл сего действа?
В контексте того, что если вы наводните комнату ботами, которые вас накормят до первого места, то места для реальных игроков не останется.
В итоге вы первый среди ботов. Нет конкуренции, нет куража, нет азарта и веселья от ников игроков.

А смысл тогда играть то? Променять веселье на ботов.
Ботов же можно потом убрать и вместо них придут игроки.
Можно делать одного бота — это тоже интересно.
Разработка бота сама по себе интереснее любой игры.
Видимо, что-то изменили. Сейчас не работает. При загрузке — пустое поле.
Сейчас стало популярным играть на пару в комнате

Когда оба более менее станут большими, начинают работать вместе по следующему алгоритму
Как только один из них видит потенциального соперника, которого можно съесть, поделившись пополам, он это делает сразу и оставшуюся часть намеренно отдает напарнику съесть. Затем напарник с помощью «w» выравнивает массы друг друга.

Если вот эту стратегию попробовать сделать с ботами, было бы просто замечательно
Хотя бы сделать так, чтобы бот понимал, что нужно съесть маленькую часть от твоего куска и затем отдать это кол-во обратно, пусть даже не прыгает, просто находится рядом всё это время
Кстати, со временем масса уменьшается на какое-то количество, так что нужно постоянно что-то есть
Добрый вечер, подскажите а какие должны быть настройки Fiddler что бы использовать Ваш скрипт? никак не удается его заставить работать
Код main_out изменился, и метод из поста теперь не работает.
Sign up to leave a comment.

Articles