Давайте приступим к его созданию. Принцип действия бота таков, мы парсим цвет пикселя на определенном расстоянии от персонажа в цикле и проверяем, если цвет пикселя равен цвету кактуса, то прыгаем иначе ни чего не делаем.
Начнем с того, что найдем нужный пиксель. В моем случае этот пиксель находится на координатах «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)
Merlen_Gross
11.06.2017 01:09+14Это, скорее, динозавр. Отсылка ведь.
zionkv
11.06.2017 01:17+7Вас ещё ждёт смена дня и ночи))
nkozhevnikov
11.06.2017 07:09Тогда можно проверять пиксель в каком-нибудь углу канваса, чтобы можно было отслеживать на день/ночь и сравнивать с пикселем, который реагирует на препятствия.
А про птиц — добавить ещё один пиксель, но уже расположенный на одном уровне с птицами.
RussDragon
11.06.2017 02:20-20Блин, абсолютно бесполезная статья, особенно для инвайта на Хабр, но этот диназаврик сглаживает всё желание ворчать :(
(Да и моя статья для песочницы в прошлом, впрочем, тоже была весьма и весьма сомнительной ценности и качества кода...)
GriNAME
11.06.2017 07:09+2А я без "читов" честно подходил эту крутую игру))) Толкаете меня на нечестную игру..
Iqorek
11.06.2017 09:50+9Я тоже проходил, но в конце вместо мультика подключают к интернету, что тоже неплохо.
GriNAME
11.06.2017 10:05-2О прикольно! Значит секретная награда за прохождение это подключение к интернету, даже если его нет как такового?) Крутяк! Надо поддерживать свой скилл в этой игре, если вдруг инет по какой-то причине будет недоступен (обрыв линии, деньги закончились, хакерские авантюры всякие) то для решения проблемы надо будет просто пройти игру до конца и подарком будет инет)) Зачет!!!)))
Вот тут кстати и пригодится чит описанный в статье) для тех кто не кибер спортсмен со стажем в этой игре))
Eureka
11.06.2017 11:41+6Не, лениво. Можно же через консоль изменить скорость динозавра до 990 (в моем случае на ней продолжают срабатывать звуки и меняться дни и ночи), прыгать и приседать вообще не нужно, атомный динозавр превращается в нейтринный пронизывая все препятствия на дикой скорости.
Runner.config.SPEED=990
После миллиона — крутая вакансия от Google, убежал на собеседование…
Stalker_RED
11.06.2017 19:44+17Не обязательно отключать интернет чтобы поиграть, можно просто написать в адресной строке
chrome://dino/
bro-dev
12.06.2017 02:55Писал бота для Дота2 по такой же методике и тоже на c#, читал цвет пикселя определял состояние и делал действия, удивительно но даже для крупных систем цвета нескольких пикселей достаточно чтобы однозначно определить на какой стадии сейчас игра.
qovalenko
12.06.2017 02:55Круто! Около 5000 или 3000 набирал)) Думал возможно ли автоматизировать процесс?)) Спасибо!!!
Главное, года появляются птицы — не нужно пригибаться, т.к. любую из них можно перепрыгнуть)
nicon
12.06.2017 02:55Я по схожему принципу бота на bash для LumberJack'а телеграммовского писал: по цвету пикселя определял, есть слева веточка или нет, соответственно нажималась кнопка влево или вправо. Правда бот коллеги на питоне набрал 689 очков против моих 678.
AlmazBisenbaev
12.06.2017 02:56В случае с птицами думаю можно сравнивать не один пиксель выше самого высокого бугорка, а целый ряд пикселей по вертикали
BlenderRU
12.06.2017 07:08предполагаю 100% нагрузку на ядро в цикле хотя бы Thread.sleep использовали
R_o_u_n_d
13.06.2017 21:08после 999999 (шести девяток) пробег динозаврика обнуляется, плиз хелп, чяднт???!!!111одинодинодин
berezuev
> дракончик с легкостью преодолевает 500 игровых метров, а дальше его подстерегает неожиданность ввиде птиц и ночи.
А после 1000 метров покажут мультик? )))
Ivanq
Нет :)