Здравствуйте, не так давно загорелся желанием побить рекорд в мини-игре браузера 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}");
                }
            }
        }
    }
}

Поделиться с друзьями
-->

Комментарии (32)


  1. berezuev
    11.06.2017 01:01
    +12

    > дракончик с легкостью преодолевает 500 игровых метров, а дальше его подстерегает неожиданность ввиде птиц и ночи.

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


    1. Ivanq
      11.06.2017 12:51

      Нет :)


  1. Merlen_Gross
    11.06.2017 01:09
    +14

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


    1. VioletGiraffe
      11.06.2017 09:29

      Это явно ти-рекс, но к чему отсылка?


      1. zedalert
        11.06.2017 09:51
        +13

        К тому, что у вас интернет как у динозавра.


        1. Dreyk
          11.06.2017 15:47
          +2

          или к тому что у тирекса короткие ручки и он не достаёт до интернета :)


      1. k0ldbl00d
        11.06.2017 20:43
        +2

        К тому что без интернета вы вернулись в эпоху динозавров.


        1. vba
          12.06.2017 14:43

          К тому что без интернета вы вернулись в эпоху динозавров.

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


  1. zionkv
    11.06.2017 01:17
    +7

    Вас ещё ждёт смена дня и ночи))


    1. nkozhevnikov
      11.06.2017 07:09

      Тогда можно проверять пиксель в каком-нибудь углу канваса, чтобы можно было отслеживать на день/ночь и сравнивать с пикселем, который реагирует на препятствия.
      А про птиц — добавить ещё один пиксель, но уже расположенный на одном уровне с птицами.


  1. RussDragon
    11.06.2017 02:20
    -20

    Блин, абсолютно бесполезная статья, особенно для инвайта на Хабр, но этот диназаврик сглаживает всё желание ворчать :(

    (Да и моя статья для песочницы в прошлом, впрочем, тоже была весьма и весьма сомнительной ценности и качества кода...)


    1. prohodil_mimo
      11.06.2017 22:03
      +6

      уж вы-то с вашим ником могли бы и поддержать из солидарности :)


      1. RussDragon
        12.06.2017 17:46

        Так я то и поддержал, плюсом в статью и в карму :)


  1. GriNAME
    11.06.2017 07:09
    +2

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


    1. Iqorek
      11.06.2017 09:50
      +9

      Я тоже проходил, но в конце вместо мультика подключают к интернету, что тоже неплохо.


      1. GriNAME
        11.06.2017 10:05
        -2

        О прикольно! Значит секретная награда за прохождение это подключение к интернету, даже если его нет как такового?) Крутяк! Надо поддерживать свой скилл в этой игре, если вдруг инет по какой-то причине будет недоступен (обрыв линии, деньги закончились, хакерские авантюры всякие) то для решения проблемы надо будет просто пройти игру до конца и подарком будет инет)) Зачет!!!)))
        Вот тут кстати и пригодится чит описанный в статье) для тех кто не кибер спортсмен со стажем в этой игре))


  1. ivan386
    11.06.2017 11:10

    Сколько нужно пробежать до ночи?


    1. Wyrd
      11.06.2017 12:15
      +1

      750


  1. Eureka
    11.06.2017 11:41
    +6

    Не, лениво. Можно же через консоль изменить скорость динозавра до 990 (в моем случае на ней продолжают срабатывать звуки и меняться дни и ночи), прыгать и приседать вообще не нужно, атомный динозавр превращается в нейтринный пронизывая все препятствия на дикой скорости.

    Runner.config.SPEED=990
    

    После миллиона — крутая вакансия от Google, убежал на собеседование…


    1. ivan386
      11.06.2017 13:00

      У меня таки ловит кактус. Рекорд 3000 метров. Играю на планшете.


    1. Iqorek
      11.06.2017 21:13

      Читер ;)


    1. devalone
      12.06.2017 00:40

      На 999999 он вообще по пустоте бежит


  1. Stalker_RED
    11.06.2017 19:44
    +17

    Не обязательно отключать интернет чтобы поиграть, можно просто написать в адресной строке chrome://dino/


  1. bro-dev
    12.06.2017 02:55

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


  1. qovalenko
    12.06.2017 02:55

    Круто! Около 5000 или 3000 набирал)) Думал возможно ли автоматизировать процесс?)) Спасибо!!!
    Главное, года появляются птицы — не нужно пригибаться, т.к. любую из них можно перепрыгнуть)


  1. nicon
    12.06.2017 02:55

    Я по схожему принципу бота на bash для LumberJack'а телеграммовского писал: по цвету пикселя определял, есть слева веточка или нет, соответственно нажималась кнопка влево или вправо. Правда бот коллеги на питоне набрал 689 очков против моих 678.


  1. soon
    12.06.2017 02:55

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


  1. qxcoder
    12.06.2017 02:56

    У меня одного после 3-х попыток пройти игрушку всё плывет перед глазами? :)


  1. AlmazBisenbaev
    12.06.2017 02:56

    В случае с птицами думаю можно сравнивать не один пиксель выше самого высокого бугорка, а целый ряд пикселей по вертикали


  1. BlenderRU
    12.06.2017 07:08

    предполагаю 100% нагрузку на ядро в цикле хотя бы Thread.sleep использовали


  1. master65
    13.06.2017 11:52
    +1

    Чего только не узнаешь благодаря хабру)


  1. R_o_u_n_d
    13.06.2017 21:08

    после 999999 (шести девяток) пробег динозаврика обнуляется, плиз хелп, чяднт???!!!111одинодинодин