Делаем бота для дракончика в Google Chrome

Здравствуйте, не так давно загорелся желанием побить рекорд в мини-игре браузера Google Chrome. Если кто не знает, то при отсутствии доступа в интернет и при использовании выше упомянотого браузера, появляется мини-игра для запуска которой необходимо просто нажать клавишу пробел или в случае с мобильными телефонами, тапнуть по экрану.

image

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

image

Начнем с того, что найдем нужный пиксель. В моем случае этот пиксель находится на координатах «775x250». Нужный пиксель я беру на 1 выше самого высокого бугорка на дороге и на расстоянии от персонажа выведенного методом проб и ошибок. Также следует заметить, что у меня разрешение экрана 1920х1080 21.5" и если у вас другое, то скорее всего будет работать криво.
Создадим консольное приложение в VS.

Для начала объявим переменные для координат пикселя.

        public static int x = 775;
        public static int y = 250;

Затем подключим DLL для работы.

        [DllImport("user32.dll")]
        public static extern IntPtr GetDC(IntPtr hwnd);

        [DllImport("user32.dll")]
        public static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);

        [DllImport("gdi32.dll")]
        public static extern uint GetPixel(IntPtr hDC, int x, int y);

Далее все еще проще, добавляем код для самого обработчика

IntPtr hDC = GetDC(IntPtr.Zero);
            while (true)
            {
                uint pixel = GetPixel(hDC, x, y);
                if (pixel == 5460819)
                {
                    SendKeys.SendWait("{UP}");
                }
            }

Код взят в бесконечный цикл.

if (pixel == 5460819)

Данная строчка означает, что когда цвет пикселя равен цвету кактуса в кодировке Decimal, то происходит нажтие стрелки вверх.

SendKeys.SendWait("{UP}");

Так же нужно подключить 2 ссылки.

using System.Diagnostics;
using System.Windows.Forms;

На данный момент дракончик с легкостью преодолевает 500 игровых метров, а дальше его подстерегает неожиданность ввиде птиц и ночи. Для решения этих проблем я напишу следующую статью. Удачи!

Полный код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Windows.Forms;

namespace DragonChrome
{
    class Program
    {
        #region VAR
        public static int x = 775;
        public static int y = 250;

        #endregion
        #region DLL
        [DllImport("user32.dll")]
        public static extern IntPtr GetDC(IntPtr hwnd);

        [DllImport("user32.dll")]
        public static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);

        [DllImport("gdi32.dll")]
        public static extern uint GetPixel(IntPtr hDC, int x, int y);

        #endregion
        static void Main(string[] args)
        {
            IntPtr hDC = GetDC(IntPtr.Zero);
            while (true)
            {
                uint pixel = GetPixel(hDC, Convert.ToInt32(x), y);
                if (pixel == 5460819)
                {
                    SendKeys.SendWait("{UP}");
                }
            }
        }
    }
}

Поделиться публикацией
Комментарии 34
    +12
    > дракончик с легкостью преодолевает 500 игровых метров, а дальше его подстерегает неожиданность ввиде птиц и ночи.

    А после 1000 метров покажут мультик? )))
      0

      Нет :)

      +14

      Это, скорее, динозавр. Отсылка ведь.

        0
        Это явно ти-рекс, но к чему отсылка?
        • НЛО прилетело и опубликовало эту надпись здесь
            +2
            или к тому что у тирекса короткие ручки и он не достаёт до интернета :)
            +2
            К тому что без интернета вы вернулись в эпоху динозавров.
              0
              К тому что без интернета вы вернулись в эпоху динозавров.

              Скорее в эру динозавров или в Меловой период если уверены что речь идет именно о тиранозавре.

          +7
          Вас ещё ждёт смена дня и ночи))
            0
            Тогда можно проверять пиксель в каком-нибудь углу канваса, чтобы можно было отслеживать на день/ночь и сравнивать с пикселем, который реагирует на препятствия.
            А про птиц — добавить ещё один пиксель, но уже расположенный на одном уровне с птицами.
            –20
            Блин, абсолютно бесполезная статья, особенно для инвайта на Хабр, но этот диназаврик сглаживает всё желание ворчать :(

            (Да и моя статья для песочницы в прошлом, впрочем, тоже была весьма и весьма сомнительной ценности и качества кода...)
              +6
              уж вы-то с вашим ником могли бы и поддержать из солидарности :)
                0
                Так я то и поддержал, плюсом в статью и в карму :)
              +2

              А я без "читов" честно подходил эту крутую игру))) Толкаете меня на нечестную игру..

                +9
                Я тоже проходил, но в конце вместо мультика подключают к интернету, что тоже неплохо.
                  –2
                  О прикольно! Значит секретная награда за прохождение это подключение к интернету, даже если его нет как такового?) Крутяк! Надо поддерживать свой скилл в этой игре, если вдруг инет по какой-то причине будет недоступен (обрыв линии, деньги закончились, хакерские авантюры всякие) то для решения проблемы надо будет просто пройти игру до конца и подарком будет инет)) Зачет!!!)))
                  Вот тут кстати и пригодится чит описанный в статье) для тех кто не кибер спортсмен со стажем в этой игре))
                    0
                    Мне вот интересно о чем думают люди когда ставят минус комментарию. Хорошо бы ввести на хабре повидло обязательно указывать причину минуса. А то фигнёй страдают люди. Десятки раз видел как толковые комменты от каких-нибудь людей дико минусуют. Словно есть какая-то гоп бригада для минусования
                0
                Сколько нужно пробежать до ночи?
                  +1
                  750
                  +6
                  Не, лениво. Можно же через консоль изменить скорость динозавра до 990 (в моем случае на ней продолжают срабатывать звуки и меняться дни и ночи), прыгать и приседать вообще не нужно, атомный динозавр превращается в нейтринный пронизывая все препятствия на дикой скорости.

                  Runner.config.SPEED=990
                  

                  После миллиона — крутая вакансия от Google, убежал на собеседование…
                    0
                    У меня таки ловит кактус. Рекорд 3000 метров. Играю на планшете.
                      0
                      Читер ;)
                        0
                        На 999999 он вообще по пустоте бежит
                        +17
                        Не обязательно отключать интернет чтобы поиграть, можно просто написать в адресной строке chrome://dino/
                          0
                          Писал бота для Дота2 по такой же методике и тоже на c#, читал цвет пикселя определял состояние и делал действия, удивительно но даже для крупных систем цвета нескольких пикселей достаточно чтобы однозначно определить на какой стадии сейчас игра.
                            0
                            Круто! Около 5000 или 3000 набирал)) Думал возможно ли автоматизировать процесс?)) Спасибо!!!
                            Главное, года появляются птицы — не нужно пригибаться, т.к. любую из них можно перепрыгнуть)
                              0
                              Я по схожему принципу бота на bash для LumberJack'а телеграммовского писал: по цвету пикселя определял, есть слева веточка или нет, соответственно нажималась кнопка влево или вправо. Правда бот коллеги на питоне набрал 689 очков против моих 678.
                                0

                                Делал подобное около 3 лет назад, но на js. Суть была в том, что мы используем реализованную функцию проверки на столкновение, но запускаем ее на несколько тиков впереди. Соотвественно, если мы сталкиваемся через N тиков — прыгаем сейчас. Github

                                  0
                                  У меня одного после 3-х попыток пройти игрушку всё плывет перед глазами? :)
                                    0
                                    В случае с птицами думаю можно сравнивать не один пиксель выше самого высокого бугорка, а целый ряд пикселей по вертикали
                                      0
                                      предполагаю 100% нагрузку на ядро в цикле хотя бы Thread.sleep использовали
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          после 999999 (шести девяток) пробег динозаврика обнуляется, плиз хелп, чяднт???!!!111одинодинодин
                                            0
                                            Это загибается если юзать шарп под линуксом, dotnet core. Если есть у кого-то решение — ответьте. Очень интересно)

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое