Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (7): « 1 2 3 [4] 5 6 7 »   

> Без описания
obm
Отправлено: 17 Января, 2014 - 12:43:29
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2014  
Репутация: 1




 Kibor пишет:
Вот код и рис демонстрирующий это.

понял с 5го прочтения Улыбка

я имел в виду более простой вариант, использовать 3ех мерный массив, собственно, вы привели пример с ним выше
Я полагал, что в таком случае будет падение производительности, т.к. если ,допустим, загрузить картинку 50х50 в массив Image[10][100][100], то он будет искать на экране не картинку 50х50, а картинку 100х100, в которой 7500 пикселей будет пустыми ("черными"Подмигивание, что усложнит поиск.

Кстати, загонять правильно в массив Image[i][100][100], где i номер картинки? Почему не Image[100][100][i], например?
 
 Top
Kibor
Отправлено: 17 Января, 2014 - 12:59:51
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 obm пишет:
я имел в виду более простой вариант, использовать 3ех мерный массив, собственно, вы привели пример с ним выше

Я это понял и ответил Подмигивание Пример привел просто для более полного объяснения работы с указателями в Кибор и как распологаются изображения в массивах. Это пригодится когда столкнетесь с необходимостью их применять в своих функциях, на будущее Улыбка .

 obm пишет:
Я полагал, что в таком случае будет падение производительности, т.к. если ,допустим, загрузить картинку 50х50 в массив Image[10][100][100], то он будет искать на экране не картинку 50х50, а картинку 100х100, в которой 7500 пикселей будет пустыми ("черными"Подмигивание, что усложнит поиск.

Не все так плохо Подмигивание Мало того, поиск оптимизирован не только по реальным размерам картинки но и по фоновому цвету. Смело загоняйте картинку 10 на 10 в массив [10000][10000] Если памяти не жалко...

 obm пишет:
Кстати, загонять правильно в массив Image[i][100][100], где i номер картинки? Почему не Image[100][100][i], например?

Так задумано)
 
 Top
obm
Отправлено: 19 Января, 2014 - 20:32:46
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2014  
Репутация: 1




 Kibor пишет:
Так задумано)

если массив 4ех мерный, то ху картинки будут тут [0][0][x][y]?
Хотел также отметить, что у Кибора есть проблема, после нажатия enter в поисковом поле, бот закрывается, я так нереальное кол-во раз вынужден был код переделывать Улыбка

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

Имеем торговые позиции (строки), идущие в таблице 1,2,3.....19,20(для просмотра ссылки Вам необходимо авторизоваться)
у каждой позиции есть фаза (время до конца), допустим а,б,с,д
фазы меняются от Д к А последовательно через 60 секунд, мне нужно отследить переход Б->А и засечь 50 секунд с этого момента, потом найти эту позицию и купить

также у каждой позиции есть цена, которая может расти

если цена по позиции меняется (кто-то делает ставку), позиция переносится в самый конец (вниз) списка

у позиции есть также характеристика - тип (картошка, камень, или руда и т.п.), разные позиции могут иметь одинаковый тип

Пока выглядит так, что задача без решения. Однако, человек ее легко решает. Но вот алгоритм для скрипта придумать не могу.
 
 Top
Kibor
Отправлено: 20 Января, 2014 - 05:40:20
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 obm пишет:
сли массив 4ех мерный, то ху картинки будут тут [0][0][x][y]?

Зачем нужен 4 мерный массив изображений? Функции поиска работают с двух и трехмерными только.
Если надо 4 мерный, то приводите расчеты к трехмерному.

 obm пишет:
у Кибора есть проблема, после нажатия enter в поисковом поле, бот закрывается

Исправлю

По вопросу... Забудьте про положение позиции. Работайте с экраном как работали бы Вы.
Вы когда хотите куда нибудь щелкнуть что делаете? Смотрите куда щелкаете и если 5 секунд назад эта кнопка была в другой позиции этот не мешает Вам увидеть где она перед кликом...

Вот примерный алгоритм в работе.
Смысл - после того как установили цены запускается бот.
Он сканирует все строчки и делает скрины всех Ваших, что бы потом мог отследить их позиции. При создание скрина строки специально закрашивается черным цветом область где время. Для того что бы изменение времени не влияло на поиск этой строки. (для этого в поиске черный цвет фоновый)
В процессе работы бот находит в цикле постоянно Ваши строки (не учитывая графу время, так как там строка при создание скрина залилась черным фоновым цветом) и соответственно находит новые координаты. И нам не важно как они сдвинулись.
Относительно этих уже координат бот смотрит или был переход времени на фазу A.
Как только переход засек - запускает счетчик для этой строки. И не важно что она меняет свою позицию. Ищется по скрину.
Если что то не понятно, или не совсем точно как надо - объясню в скайпе. Думаю Вам доделать что надо не составит труда даже если что не так как должно быть.

Скачать архив с рисунками и распаковать на C

Загрузить в Кибор этот скрипт. Расположить анимированный рисунок на странице браузера так что бы он был виден. Запустить скрипт. Следовать инструкции. Он предложит обозначить область поиска. (немного выше и левее рисунка и немного ниже правее.) Потом будет ждать первого кадра анимации с словом Старт. Это сделано так как анимация круговая и что бы скрипт начал работу с той с которой надо позиции.
Хочу заметить, что это gif анимированный, к тому же сделанный с Вашего сжатого скрина и при этом поиск и screen прекрасно работают, несмотря на то что качество очень плохое. В игре будет еще проще.
Если что не так ищет - настройте int r=25, p=90; int r1=30, p1=80; int r2=20, p2=95;
Запускайте в Мозилле. Для того что бы увидеть какие скрины делает убрать коммент с
//saveimage(#Ris[kol][0][0], "C:\test_x\s"+format(kol)+".bmp");//Тест

CODE:
int r=25, p=90;
int r1=30, p1=80;
int r2=20, p2=95;

int stris[37][37];//Рамка значка.
int moya_stavka[66][9];//моя ставка

int Ris[20][631][5];//Массив рис строк с моей ставкой

int Flag[20];
int tim[20];
int kol=0;//Количество моих строк

int PosX[20], PosY[20];//Позиции строк всех
int X, Y;

int stX, stY, fX, fY;//Координаты начала - конца рисунка строки всей
int nx=260, ny=0;//Координаты начала времени в строке
int nx1=335, ny1=5;//Координаты конца времени в строке
int tx, ty;
int SX, SY, FX, FY;
int tt;

int Рисунок_Фазы_А[46][14];//(размер рисунка должен быть меньше [nx1-nx][ny1-ny])
int Xt, Yt;



int k;
int n=0;

int startscrip[81][14];


if (load_image()==-1){messagebox ("Не найдены рисунки в C:\test_x"); goto er;}

//Тут указываем область в которй надо искать
textbkcolor (65535,0);//Ставим цвет фона и текста при выводе текста на экран
textout(0, 50, 50, "Наведите мышь на левый верхний угол области поиска и нажмите Ё.", 0);
q: if (getkeystate(192)!=1){sleep(50); goto q;}//Ждем когда нажмется Ё
getmouse(SX, SY);//Запишем координаты
sleep(500);
textbkcolor (16777215,0);
textout(0, 50, 50, "Наведите мышь на на нижний правый угол области поиска и нажмите Ё.", 0);
q1: if (getkeystate(192)!=1){sleep(50); goto q1;}
getmouse(FX, FY);//Запишем координаты мышки
resettextout(1);
textbkcolor (65535,0);//Ставим цвет фона и текста при выводе текста на экран
textout(0, 50, 50, "Ждем появления надписи Старт на изображение", 2);


//Ждем надписи старт на первом кадре
hh: if (findimage(1, #startscrip[0][0], 0, #Xt, #Yt, SX, SY, FX, FY, r, r, r, r, r, r, p, 1, -1)!=1){sleep(50); goto hh;}
textout(0, 50, 50, "Бот пошел", 2);
//Находим все строки
k=findimage(-1, #stris[0][0], 0, #PosX[0], #PosY[0], SX, SY, FX, FY, r, r, r, r, r, r, p, 1, -1);
scan_image();
/*Тут имеем массив моих строк с зачернением времени. Теперь можно перебирать их в цикле
и отслеживать положение их. По их положению можем отслеживать время в месте зачернения
поиском самого времени и отследить момент когда Б->А.
В этот момент запускаем счет времени флагом Flag=1 для строки этой.
Если позиция строки изменится - скрипт ее найдет по рисунку скрина строки.
*/
textout(0, 50, 50, "Бот засек наши позиции", 0);
sleep(500);
l:
n=0;
e: if (n<kol)
{// 1

if (findimage(1, #Ris[n][0][0], 0, #X, #Y, SX, SY, FX, FY, r2, r2, r2, r2, r2, r2, p2, 1, -1)==1)//Ищем наши строки по очереди
{//2
X=X+SX; Y=Y+SY;//Корректируем относительно SX, SY - приведем к экранным координатам
//Если нашли Теперь в X, Y координаты нашей строки и нам чхать смещалась она как.
//в X+250, Y-10 - старт поиска перехода с Б->А для строки этой
//Проверка или время для этой строки не идет еще
if (Flag[n]==0)
{//3

//Проверка наличия фазы А этой строки в экранных координатах X+250, Y-10, X+340, Y+15 (там время для этой строки
if (findimage(1, #Рисунок_Фазы_А[0][0], 0, #Xt, #Yt, X+250, Y-10, X+340, Y+15, r2, r2, r2, r2, r2, r2, p2, 1, -1)==1)
{//4
Flag[n]=1;//Флаг в 1. Теперь эта строка на таймере
tim[n]=gettime();//Засекаем время
}//4
}//3
//Тут считаем таймер для строк которые имеют флаг 1
if (Flag[n]==1)
{//5
tt=(gettime()-tim[n])/1000;
textout(1, X+815, Y, "Тут таймер: "+format(tt), 1);
if (tt>10)//Для теста 10 секунд
{//Время прошло
Flag[n]=2;
textout(1, X+815, Y, "Клик", 2);
Покупаем(X, Y);
}
}//5

}//2
n++;
sleep(50);
goto e;
}//1
sleep(50);
goto l;

er:;


function Покупаем(int xx, int yy)//Покупает
{
//xx yy координаты строки
}






function screen_image()//Делать скрин всей строки если это моя ставка
{
screen(#Ris[kol][0][0], stX, stY+18, fX, stY+23, -1);//Узкая полоса для быстроты
//Зачерняем время
tx=nx; ty=ny;
s1: if (tx<nx1)
{
ty=ny;
s: if (ty<ny1)
{
Ris[kol][tx][ty]=0;
ty++;
goto s;
}
tx++;
goto s1;
}
//saveimage(#Ris[kol][0][0], "C:\test_x\s"+format(kol)+".bmp");//Тест
kol++;
}



function scan_image()//Все строки сканируем на наличие моей ставки
{
int n=0;
s: if (n<k)
{
stX=SX+PosX[n]-1; stY=SY+PosY[n]-3; fX=SX+PosX[n]+630; fY=SY+ PosY[n]+40 ;//Координаты строки
if (findimage(1, #moya_stavka[0][0], 0, #X, #Y, stX, stY, fX, fY, r1, r1, r1, r1, r1, r1, p1, 1, -1)==1)//Моя ставка?
{
screen_image();//Делае м скрин строки если моя ставка
}
n++;
goto s;
}
}




function load_image()
{
if (loadimage (#stris[0][0], "C:\test_x\stris.bmp")<1)return -1;
if (loadimage (#moya_stavka[0][0], "C:\test_x\moya_stavka.bmp")<1)return -1;
if (loadimage (#Рисунок_Фазы_А[0][0], "C:\test_x\fa.bmp")<1)return -1;
if (loadimage (#startscrip[0][0], "C:\test_x\start.bmp")<1)return -1;


int n=0;
s: if (n<20){Flag[n]=0; n++;goto s;}//Обнуление
return 1;
}



Нажмите для увеличения
 
 Top
obm
Отправлено: 20 Января, 2014 - 06:53:19
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2014  
Репутация: 1




 Kibor пишет:
По вопросу... Забудьте про положение позиции. Работайте с экраном как работали бы Вы.

Спасибо за вложенные усилия!
Буду разбираться. Есть опасения, что в реальной игре может так не сработать из-за прозрачного фона - поставлю тогда разлет по цвету.

В свою очередь напишу обзор Кибора в своем жж как закончу скрипт.
 
 Top
Kibor
Отправлено: 20 Января, 2014 - 08:04:40
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Скрин с игры? Я не вижу тут особой прозрачности. Может небольшая... Ну думаю так или иначе можно найти привязки.
 
 Top
obm
Отправлено: 20 Января, 2014 - 08:18:22
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2014  
Репутация: 1




 Kibor пишет:
Скрин с игры? Я не вижу тут особой прозрачности. Может небольшая... Ну думаю так или иначе можно найти привязки.

Да, бежевая подложка чуть-чуть прозрачна. Плюс там есть определенное искажение, например, первые 3 позиции, по какой-то причине немного отличаются от следующих, но это, действительно, решается выставлением большого отклонения 70-80.

По алгоритму в целом разобрался, благодарю.
Вначале код просматривает все позиции и сохраняет их, а после уже начинает перебирать и сравнивать каждую строку со всеми сохраненными. При этом если появятся новые строки, которые до этого не были сохранены для сравнения, он должен их также сравнить со всеми и дописать, если не нашел. Также получается, что по истечении таймера строки нужно убирать из сохранения. Хотя можно в общем то и не убирать, но тогда будет страдать производительность.
Другой вариант, который мне нравится - ждать момент, когда нет текущих строк в состоянии А и вообще пересчитывать все позиции, обнулив старые полностью.
Думаю все получится, еще раз огромное спасибо!
 
 Top
Kibor
Отправлено: 20 Января, 2014 - 08:31:02
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Скрипт сохраняет только те строки, которые наши. То есть они подписаны моя ставка. Ну как и человек. Человек тоже запомнит тут только свои строки.
Потом перебирает только их. Находит координаты и по ним уже смотрит или время не стало A. Потом запускает таймер для строки если стала A.
Исключить из поиска легко. Просто поставив проверку флага перед поском конкретной строки (под конкретным индексом. Если флаг уже 2 то можно не искать)
Единственно что надо что бы все строки наши были видны на экране. Если это не так, надо что бы скрипт сделал скрины видимых строк наших - пролистал - сделал - пролистал. до конца. Но если надо листать, то надо будет и в переборе листать. Короче делать как делает человек... Он просматривает.
Я специально в Кибор вношу усиленную работу с изображением что бы можно было делать такие алгоритмы и не было проблем с распознование. Скоро выложу еще новую функцию. Она заполнит брешь когда может быть ситуация что без дополнительных проверок разными функциями не возможно найти изображение.
 
 Top
obm
Отправлено: 20 Января, 2014 - 08:56:15
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2014  
Репутация: 1




 Kibor пишет:
Скрипт сохраняет только те строки, которые наши.

На самом деле все строки здесь "наши" и нам интересны, "другая ставка" означает, что другой игрок перебил мою ставку по этой позиции, моя задача в том и заключается, чтобы сделать "выстрел" в нужное время, один выстрел, один труп. Потому что если начинать с ним торговаться-перестреливаться Улыбка (постоянно обновлять список и делать ставку, если другой игрок побил мою ставку, чтобы мне снова закрыть позицию) цены очень быстро улетает вверх из-за такой чехарды.

 Kibor пишет:
Единственно что надо что бы все строки наши были видны на экране.

На экране единовременно видно всего 9 позиций, остальные на других страничках, их нужно листать, а 20 сразу я взял для упрощенного понимания. Но я не вижу никакой проблемы в листании.
То есть я вначале прохожу по всем позициям на всех страничках, сохраняю их.
Далее начинаю мониторинг, каждую позицию прогоняю через все сохраненные, если не нахожу, то добавляю ее, если нахожу, то мониторю изменение цены. Ну и с таким подходом рано или поздно будет переполнение массива сохраненных позиций. Его можно обнулить полным ресетом, как бы начать с нуля, для этого достаточно поймать момент, когда нет позиций в фазе А. Сегодня вечером начну кодить, прямо не терпится Улыбка

 Kibor пишет:
без дополнительных проверок разными функциями не возможно найти изображение.

лично у меня пока всегда находило Улыбка

А система загрузки скриптов позволяет мне загрузить скрипт на сервер, и продавать людям подписку на него, допустим, на месяц?
 
 Top
Kibor
Отправлено: 20 Января, 2014 - 09:47:17
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Ну нюансов я не знаю... Я по идее думал (исходя из описания) так... Человек должен выбрать что хочется приобрести и бот должен следить только за его выбором и вовремя купить..
Я сделал пример как за этим следить, ну а как там дальше это надо запустить игру.. Точно знать что надо... И иметь реальную ситуацию на экране для анализа.. Все можно сделать если знать что именно надо делать. где и с чем.
Исходя из моего понимания мониторится только то чё выбрал человек сразу. Поэтому не может быть никаких переполнений в процессе... Пробуйте. Надеюсь помог чем то..

 obm пишет:
А система загрузки скриптов позволяет мне загрузить скрипт на сервер, и продавать людям подписку на него, допустим, на месяц?

Нет. Вы не контролируете кто запускает скрипт. Просто кто его запустит может пользоваться им введенное количество времени. Как будто у вас демо версия с ограничением времени...
Если захочет купить -пишет и Вы собираете ему exe с его ключем.
http://kibor-bot.com/forum/topic...m=1&topic=15
 
 Top
Страниц (7): « 1 2 3 [4] 5 6 7 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by