Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » бот для Monster Legends, проблемы с поиском изображений

Страниц (1): [1]
 

1. McArtur - 06 Сентября, 2018 - 01:55:08 - перейти к сообщению
Всем привет. Играю в Monster legends. Написал несколько ботов и столкнулся с серьезной проблемой.
Играю на эмуляторе Nox для андроид, Windows 7. Кибор версия 5.41.
1.
Бот для сбора золота - на главном экране есть логова в которых бегают монстры, периодически над логовами всплывает иконка в виде золотых слитков, по нажатии на нее с логова снимается золото, иконка исчезает. Я сделал снимок данной иконки в Кибор, вырезал требуемый элемент (белый фон с желтыми слитками), сделал бот в визуальном редакторе, запустил, происходит нажатие по иконке, все вроде ок. НО - иконки слитков золота на всех логовах одинаковые, а нажимается только по той с которой я сделал фотку. Такое ощущение, что кроме требуемой мне иконки, Кибор запечетляет еще и фон под данной иконкой, и потом при поиске ищет именно это совпадение.
ЕЩЕ один интересный нюанс - если переместить камеру в сторону, то после этого даже иконку с этого логова Кибор найти не может. Что за ерунда не пойму, иконка визуально везде одинаковая и никак не меняется.

Код поиска золота(для просмотра ссылки Вам необходимо авторизоваться)
2.
Бот для сражений - я сделал фото кнопок на которые надо нажимать (сфоткал весь экран и выделил только ту кнопку какую надо, сохранил в bmp). Далее в Визуальном редакторе я построил цепочку нажатий по этим кнопкам, все вроде работает. ОДНАКО - некоторые кнопки, например кнопка Автобой в верхнем левом углу работает не везде! Суть игры - заходишь в подземелье, жмешь на кнопку автобой и монстры сражаются. Так вот - эта кнопка Автобой она визуально(как собственно и слитки с золотом из моего 1го бота)везде одинаковая, но почему-то работает только в том подземелье где я ее сфоткал. Опять же такое ощущение буд-то фон который находится ЗА кнопкой тоже отслеживается и поэтому Кибор не может найти эту кнопку - фон то в другом подземелье другой, хотя кнопки все те же.

Код боёв:(для просмотра ссылки Вам необходимо авторизоваться)
Может я как-то неправильно делаю фотоснимок экрана и потом кнопки вырезаю??? хотя визуально все элементы, которые много где встречаются и повторяются одинаковые.
2. Kibor - 06 Сентября, 2018 - 02:34:44 - перейти к сообщению
Не правильно.
Вполне хватит такого

В этом участке есть цвета, которые отличаются друг от друга значительно.
Теперь можно использовать разбежность цвета в поиске пока не будут находиться все и всегда.
То что не находит означает что разные. а разбежности нет.
при разбежности указывать только разбежность цвета.

Пример работы кода при таком созданном шаблоне поиска

На этом изображение . Его не открывать а искать на таком маленьком как есть


Его не открывать, а оставить как есть маленькое на этом форуме.
Сделать снимок с одного из слитков как я показал.
int Image_0[3][4] изменить под свой размер картинки. у меня был 3 на 4
Запустить этот скрипт.
Даже на таком искаженном маленьком изображение он найдет.
Конечно погрешности будут, так как тут изображение очень сжато и искажено.
Просто пример.

CODE:
int Image_0[3][4];loadimage (#Image_0[0][0], "C:\Image_0.bmp");

int PosX_0[512];int PosY_0[512];

int r=70, p=100;
int k=findimage(-1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, 1366, 768, r, r, r, r, r, r, p, 1, -1);

for (int n=0; n<k; n++)
{
mousemove(PosX_0[n], PosY_0[n]);
sleep(300);
}
messagebox (k);


Подготовить изображение так
3. McArtur - 06 Сентября, 2018 - 21:21:06 - перейти к сообщению
блин, я немного туповат. не понял что надо сделать. вот тот скрипт что вы намисали, он уже полностью рабочий и мне в него только свою картинку размером 3*4 вставить? или для чего этот скрипт? я сделал картинку 3*4 и исполнил ваш скрипт, кибор выдол квадратное окно с цыфрой 3 внутри и кнопкой ок. можете пожалуйста более подробно объяснить как делать изображения с разбежностью и потом искать их? (п.с. я в основном пользуюсь визуальным редактором, этим и привлекает ваш конструктор).

картинку для поиска я сделал 3 пикселя на 4 так
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]
Потом нарисовал в визуальном редакторе бот и вставил туда картинку
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]

CODE:
int col_KIB, ex_KIB, ey_KIB, sum_KIB, x_KIB, y_KIB;
int Image_0_KIB[3][4];

start_();

m_KIB1: if (findimage_(#Image_0_KIB[0][0], 0, 0, 0, 1, 0, 0, -1, 0, 0, 1000, -1, -1, -1, 0, 100, 1, 0, 0, ex_KIB, ey_KIB, #sum_KIB, #x_KIB, #y_KIB)>0) goto m_KIB2;
else goto m_KIB2;
m_KIB2: if (findimage_(#Image_0_KIB[0][0], 0, 0, 0, 1, 0, 0, -1, 0, 0, 1000, -1, -1, -1, 0, 100, 1, 0, 0, ex_KIB, ey_KIB, #sum_KIB, #x_KIB, #y_KIB)>0) goto m_KIB1;
else goto m_KIB1;



function start_()
{
getdisplay(col_KIB, ex_KIB, ey_KIB);
load_image_();
pause(1000);
}


function findimage_(int #Image, int t, int p1, int p2, int m, int xm, int ym, int mov_m, int mov_x, int mov_y, int p3, int wait, int cycle, int fon, int r, int p, int k, int xs, int ys, int xf, int yf, int#sum, int#x, int#y)
{
int timKIB, sumKIB, xKIB, yKIB, tx, ty, tcycle=0;
sty: pause(p1);
sumKIB=0;
if (t!=0) timKIB=gettime();
a: if (r==0 && p==100){sum=findimage(k, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, -1); if (sum>0) goto e;}
else {sum=findimage(k, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, r, r, r, r, r, r, p, 1, -1); if (sum>0) goto e;}
if (t==0) return 0;
if (gettime()-timKIB<t){sleep(20); goto a;}
return 0;
e: sumKIB=sum; xKIB=x[0]; yKIB=y[0];
pause(p2);
if (m==1){mouse(LEFT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==2){mouse(MIDDLE, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==3){mouse(RIGHT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==4){mousedown(LEFT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==5){mousedown(MIDDLE, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==6){mousedown(RIGHT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==7){mouseup(LEFT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==8){mouseup(MIDDLE, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==9){mouseup(RIGHT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==10){mousedbl(LEFT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==11){mousedbl(MIDDLE, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==12){mousedbl(RIGHT, xs+xKIB+xm, ys+yKIB+ym); goto hy;}
if (m==13)mousemove(xs+xKIB+xm, ys+yKIB+ym);
hy: if (mov_m==1)mousemove(mov_x, mov_y);
if (m>0 && m<14)pause(p3);
if (wait!=-1)
{
for (int ttim=gettime(); gettime()-ttim<wait; sleep(20))
{
if (r==0 && p==100){if (findimage(1, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, -1)==0)return sumKIB;}
else {if (findimage(1, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, r, r, r, r, r, r, p, 1, -1)==0)return sumKIB;}
}
if (tcycle<cycle){tcycle++; goto sty;}
return 0;
}
return sumKIB;
}




function load_image_()
{
loadimage (#Image_0_KIB[0][0], "C:\BotMLGold\Image_0.bmp");
}


(Добавление)
ап
Путем перебора Искать по неполному совпадению - Пункта разбежность = 10 вроде заработал сборщик золота. Я теперь понимаю что лучше искать по пикселям и чем меньше картинка тем лучше. А можете объяснить что означает разбежность 0 - 255 и правее еще есть пункт Процент совпадения 0-100 ?(для просмотра ссылки Вам необходимо авторизоваться)
4. Zireael - 07 Сентября, 2018 - 02:32:57 - перейти к сообщению
 Цитата:
что означает разбежность 0 - 255 и правее еще есть пункт Процент совпадения 0-100 ?

Разбежность - погрешность в цвете. Чем больше, тем сильнее может отличаться цвет.
Процент совпадения - сколько пикселей в процентах должно совпасть. Например картинка 15*15, это 225 пикселя, при точности в 100% должны быть найдены все 225 пикселя, при 80% 180 пикселей (225*80%).
5. Kibor - 07 Сентября, 2018 - 02:47:37 - перейти к сообщению
 McArtur пишет:
картинку для поиска я сделал 3 пикселя на 4 так

и сколько там у вас найдется этих участков в одном? сотня?

Разве я так показал?

Это пример был для маленького изображения.

Powered by ExBB FM 1.0 Final