rev41k |
Отправлено: 17 Декабря, 2013 - 14:21:29
|
Наблюдатель
Покинул форум
Сообщений всего: 31
Дата рег-ции: Нояб. 2013
Откуда: Молдова, Кишинев
Репутация: 0
|
Всем привет!!! Обожаю одну игрушку но никак не хватает времени поиграть и решил написать бота при помощи КИБОР. Игра браузерная (на флэше). Самая большая проблема у меня появилась при написании бота с поиском мобов. Подскажите что лучше использовать finddynamic или findimage !? Я пробовал при помощи findimage , но поиск происходит очень долго ... Finddynamic находит , но по разному( т.е. одного и того же моба может находить по 3 раза). Я думаю , что это из-за того , что не все мобы подходят под динамический поиск , но надеюсь , что я ошибаюсь и вы мне подскажете что к чему.
Скрин локации (без динамики):(для просмотра ссылки Вам необходимо авторизоваться)
Скрин с динамикой :(для просмотра ссылки Вам необходимо авторизоваться)
как видно на скрине из-за взмаха крылье летучих мышей я не могу хорошо подобрать центр моба и на одну и ту же мышь бот может наводить по 2 , а то и по 3 раза.
Мой простой код (поиск и указание курсором на мобов)
CODE:
win w=window (-1, "Chrome_RenderWidgetHostHWND", window ("Òåõíîìàãèÿ - Google Chrome", "Chrome_WidgetWin_1", -1));
int x[20], y[20];
int Mob_X=8, Mob_Y=14;
int Mob_Din_X=16, Mob_Din_Y=51;
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, 0, 0, 1366, 676, w);
int k=finddynamic(10, #x[0], #y[0], Mob_X, Mob_Y, Mob_Din_X, Mob_Din_Y, 0, 0, 1366, 676, w);
//----------------------------------------------------------
a:
wait(1000);
search();
move();
goto a;
//===================================
function search()
{
poisk:
sleep(500);
if (k>10)goto poisk;
if (k<2)goto poisk;
}
//==================================
function move()
{
int n=0;
b:
if (n<k)
{
mousemove(x[n], y[n],w);
sleep(2000);
n++;
goto b;
}
}
//==================================
Вообщем я хочу максимально точно сделать поиск мобов на локации и чтобы мышь кликала в одинаковые координаты моба. При том чтобы бот находил близжайшего моба на локации от героя и кликал его( но это можно и потом , главное поиск) !
Всем заранее спасибо! |
|
|
rev41k |
Отправлено: 26 Декабря, 2013 - 23:11:57
|
Наблюдатель
Покинул форум
Сообщений всего: 31
Дата рег-ции: Нояб. 2013
Откуда: Молдова, Кишинев
Репутация: 0
|
Написал пару строк для проверки моих мечей при наведении на моба. Простой поиск мечей в окне, но ничего не происходит (( или я снова что-то не правильно написал!?
CODE:
win w=window (-1, "Chrome_RenderWidgetHostHWND", window ("Òåõíîìàãèÿ - Google Chrome", "Chrome_WidgetWin_1", -1));
int Image_0[34][34];
loadimage (#Image_0[0][0], "C:\meci.bmp");
int PosX_0, PosY_0;
a:
if (findimage(-1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, 1366, 676, w)==1)
{
mousemove(PosX_0, PosY_0);
sleep(500);
}
goto a;
Моя бмп в оригинальном размере :(для просмотра ссылки Вам необходимо авторизоваться) |
|
|
rev41k |
Отправлено: 06 Января, 2014 - 13:53:45
|
Наблюдатель
Покинул форум
Сообщений всего: 31
Дата рег-ции: Нояб. 2013
Откуда: Молдова, Кишинев
Репутация: 0
|
Помучился немного и получил хороший поиск мобов на локации. Теперь появились другие проблемы:
1- при входе в бой чтобы бот кликал по картинке (скиллу) если только есть определенные пксели в в нужных координатах (это будет указывать , что наш ход), и если есть другие цвета пикселей в других координатах , тогда ждать ( это будет указывать на ход противника).
2- когда не будет на экране ни одного ни другого пикселя тогда перейти к поиску монстров на локации.
(Добавление)
Мой код (Отобразить)
CODE:
win w=window (-1, "Chrome_RenderWidgetHostHWND", window ("Òåõíîìàãèÿ - Google Chrome", "Chrome_WidgetWin_1", -1));
int x[40], y[40];
int Mob_X=20, Mob_Y=10;
int Mob_Din_X=25, Mob_Din_Y=13;
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, 0, 0, 1366, 767, w);
sleep(3500);
int k=finddynamic(20, #x[0], #y[0], Mob_X, Mob_Y, Mob_Din_X, Mob_Din_Y, 0, 0, 1366, 767, w);
//----------------------------------------------------------
int Image_0[30][15];
loadimage (#Image_0[0][0], "E:\meci4.bmp");
int PosX_0, PosY_0;
//----------------------------------------------------------
int Image_vistrel[29][25];
loadimage(#Image_vistrel[0][0], "E:\vistrel.bmp");
int vx,vy;
//----------------------------------------------------------
a:
search();
move();
boi();
goto a;
//===================================
function search()
{
poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;
}
//==================================
function move()
{
int n=1;
b:
if (n<k)
{
sort(683, 310, #x[0], #y[0], k);
mousemove(x[n], y[n]+10,w);
sleep(150);
mousemove(x[n], y[n]+15,w);
if (findimage(-1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, 1366, 676, w)==1)
{
sleep(300);
mouse(LEFT, PosX_0+15, PosY_0+80);
sleep(500);
return 1;
}
sleep(200);
n++;
//return 0;
goto b;
}
}
//=====================================
function boi()
{
a:
if (findimage(-1, #Image_vistrel[0][0], 0, #vx, #vy, 0, 0, 1366, 676, w)==1)
{
mouse(LEFT, vx, vy+80, w);
sleep(rand(1000,3000));
mousemove(100,500);
goto a;
}
sleep(2000);
goto a;
}
(Добавление)
Бой
Верхние головы указывают на "Чей ход". Если слева секунды в голове соответственно мой ход , если справа , то моба.
Ниже в красной рамке скиллы. |
|
|
Kibor |
Отправлено: 06 Января, 2014 - 14:10:21
|
Эксперт
Покинул форум
Сообщений всего: 8224
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Укажу ошибки:
rev41k пишет: function search()
{
poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;
}
Что делает эта функция? Вводит скрипт в замкнутый цикл? С которого не выйдет если k>20 иль k<2.
rev41k пишет: int n=1;
b:
if (n<k)
{
sort(683, 310, #x[0], #y[0], k);
mousemove(x[n], y[n]+10,w);
Зачем сортировать массивы в каждом цикле. Один раз надо перед циклом:
CODE:int n=1;
sort(683, 310, #x[0], #y[0], k);
b:
if (n<k)
{
mousemove(x[n], y[n]+10,w);
Ну и не понятно применение указателя на окно игры... То применяется, то нет... Игра наверно во весь экран или около того?
Ну вот пример неверного применения:
rev41k пишет: if (findimage(-1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, 1366, 676, w)==1)
{
sleep(300);
mouse(LEFT, PosX_0+15, PosY_0+80);
findimage работает с окном, а клик в экранных координатах... |
|
|
rev41k |
Отправлено: 11 Января, 2014 - 16:13:53
|
Наблюдатель
Покинул форум
Сообщений всего: 31
Дата рег-ции: Нояб. 2013
Откуда: Молдова, Кишинев
Репутация: 0
|
[quote=Kibor]Укажу ошибки:
rev41k пишет: function search()
{
poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;
}
Что делает эта функция? Вводит скрипт в замкнутый цикл? С которого не выйдет если k>20 иль k<2.
Здесь я проверяю : "Если динамики больше 20 , то ищем снова динамику на экране (от 3 до 19)" , просто больше 20 и меньше 2 мне не подходит.
По поводу сортировки и указателя на окно СПАСИБО не заметил, спешил и упустил. Но функционал бота не изменился.
Но хотелось бы помощи вот в этом :
rev41k пишет: Помучился немного и получил хороший поиск мобов на локации. Теперь появились другие проблемы:
1- при входе в бой чтобы бот кликал по картинке (скиллу) если только есть определенные пксели в в нужных координатах (это будет указывать , что наш ход), и если есть другие цвета пикселей в других координатах , тогда ждать ( это будет указывать на ход противника).
2- когда не будет на экране ни одного ни другого пикселя тогда перейти к поиску монстров на локации.
(Добавление)
Мой код (в предыдущем посте)
(Добавление)
Бой :(для просмотра ссылки Вам необходимо авторизоваться)
Верхние головы указывают на "Чей ход". Если слева секунды в голове соответственно мой ход , если справа , то моба.
Ниже в красной рамке скиллы.
Буду очень признателен всем кто сможет помочь разобраться... Я понимаю , что я не единственный на форуме который не рубит ничего в программировании , но уж очень хочется создать хорошего функционального бота ... А исходники в примеры потом закинуть!
Заранее всем спасибо!(Отредактировано автором: 11 Января, 2014 - 16:15:31) |
|
|
Kibor |
Отправлено: 11 Января, 2014 - 22:02:25
|
Эксперт
Покинул форум
Сообщений всего: 8224
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
rev41k пишет: Но хотелось бы помощи вот в этом
Я с логикой помочь не могу, так как не могу вникать в каждую игру.
Вот конкретно с кодом - да, могу.
rev41k пишет: Здесь я проверяю : "Если динамики больше 20 , то ищем снова динамику на экране (от 3 до 19)" , просто больше 20 и меньше 2 мне не подходит.
Это понятно.. но Ваш код не работает. Проследите за его выполнением и увидите.
rev41k пишет: poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;
Ну допустим что k<2 и k>20, то что, идем на две строки вверх и код опять выполняется до проверки... При этом k не меняется... то есть цикл замкнутый. Нет с него никогда выхода.
Надо что бы между
poisk:
и
if (k>20)goto poisk;
if (k<2)goto poisk;
был код меняющий k...
Например
CODE:int k;
poisk: finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, 0, 0, 1366, 676, w);
sleep(100);
k=finddynamic(10, #x[0], #y[0], Mob_X, Mob_Y, Mob_Din_X, Mob_Din_Y, 0, 0, 1366, 676, w);
if (k>20)goto poisk;
if (k<2)goto poisk; |
|
|
|