Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Ramzesia on November 19, 2020, 05:06:01 PM
-
Картинки находи все работает норм, но после того как найдет картинку, клики идут с лева на право и сверху вниз. Возможно ли сделать так что бы прокликивалось наоборот, с низу вверх и с права на лево?
FOR($Varr=1, $Varr < 30)
GETSCREEN
SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, STRCONCAT($Varr, ".bmp"), -1, 100)
$scan_size = ARRSIZE($ARR_SCAN)
FOR($ARR_NUM=0, $ARR_NUM < $scan_size, 2)
$X = $ARR_SCAN[$ARR_NUM]
$Y = $ARR_SCAN[$ARR_NUM+1]
LCLICK($X + 3, $Y + 3)
WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)
WAITMS(50)
END_CYC
-
FOR($Varr=1, $Varr < 30)
GETSCREEN
SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, STRCONCAT($Varr, ".bmp"))
$scan_size = ARRSIZE($ARR_SCAN)
FOR($ARR_NUM=$scan_size-2, $ARR_NUM >= 0, -2)
$X = $ARR_SCAN[$ARR_NUM]
$Y = $ARR_SCAN[$ARR_NUM+1]
LCLICK($X + 3, $Y + 3)
WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)
WAITMS(50)
END_CYC
-
Спасибо большое, но это не совсем то что нужно, теперь он делает следующее, если одна из искомых картинок найдена больше чем 1, то он проликивает как я хотел с низу и на лево а вот если всего одна то кликает с верху на право. Я так понимаю нужно сам поиск картинки изменить, если он будет сканировать с низу в лево то и кликать будет так как нужно.
-
А можно как то не кликать сразу по найденным картинкам, а записать все координаты найденных картинок и после поиска прокликать их все снизу в лево?
-
а вот если всего одна то кликает с верху на право.
Это сверх моего понимания. Как он может прокликивать, одну точку, не в том направлении. Какое направление у одной точки?
А можно как то не кликать сразу по найденным картинкам, а записать все координаты найденных картинок и после поиска прокликать их все снизу в лево?
Конечно можно. Ты до сих пор не понимаешь что делает каждая строка?
после того как найдет картинку, клики идут с лева на право и сверху вниз.
картинку, не картинки, т.е. вопрос был про одну. Поиск одной, прокликивание как у тебя, только не в том направлении. Так же стоял вопрос.
Что нужно? Поиск всех 29 картинок в одну кучу и прокликивание их всех справа-налево снизу-вверх?
Если да, то учти, что картинки теперь разные и вырезал ты их с разных мест по высоте. Найдёт образец на 1px выше и не важно, что она в середине ряда, прокликает последней. Это устраивает? Если нет, как это будешь решать?
-
Виноват прошу прощения, не правильно написал, мне нужно найти кучу картинок, и прокликать их в обратном направлении. Я понимаю что делает этот скрипт но не могу понять как он работает и не могу изменить его под мою ситуацию.
Я понимаю что если картинка одна и она ищется первой и находится наверху то получается она прокликается первой, потом найдется другая где то в конце и так далее. Мне надо найти все картинки, и прокликать их с низу вверх с права налево. Почему мне это надо, дело в том что если кликнуть первую картинку, она уйдет и все остальные сместятся на одну ячейку выше, получается следующее, нашел первую картинку клик по ней, пока она уйдет кликер находит вторую, но в момент клика второй ее уже нет там она сместилась на ячейку выше и клик происходит уже по соседней картинке. Выложу картинку для наглядности, задача есть 7 цветов от A до G найдено 9 цветов все по одному, цвет G 3шт надо прокликать так как я пронумеровал их.
(https://i.ibb.co/grYsHLn/111.png) (https://imgbb.com/)
-
SUB(sort_y) //==================================================================
$len = ARRSIZE($corr)
FOR($a=1, $a < ($len-2), 2)
$min = $corr[$a]
$ind = $a
FOR($b=$a+2, $b < $len, 2)
INC($iter)
IF($corr[$b] < $min)
$min = $corr[$b]
$ind = $b
END_IF
END_CYC
$X = $corr[$ind-1]
$Y = $corr[$ind]
//LOGWRITE("$min = ", $min, " ", $X, " - ", $Y)
$corr[$ind-1] = $corr[$a-1]
$corr[$ind] = $corr[$a]
$corr[$a-1] = $X
$corr[$a] = $Y
INC($rearrangement)
END_CYC
END_SUB
SUB(sort_x, $st, $en) //========================================================
//LOGWRITE("sort_x. $st/$en ", $st, "/", $en)
IF($st ! $en)
FOR($a=$st, $a < $en, 2)
$min = $corr[$a]
$ind = $a
FOR($b=$a+2, $b <= $en, 2)
INC($iter)
IF($corr[$b] < $min)
$min = $corr[$b]
$ind = $b
END_IF
END_CYC
$X = $corr[$ind]
$Y = $corr[$ind+1]
//LOGWRITE("$min = ", $min, " ", $X, " - ", $Y)
$corr[$ind] = $corr[$a]
$corr[$ind+1] = $corr[$a+1]
$corr[$a] = $X
$corr[$a+1] = $Y
INC($rearrangement)
END_CYC
END_IF
END_SUB
SUB(sort_yx) //================================================================
// сортируем по X, пары с одинаковым Y (с допуском limit_y) len_equal_y
$start = 0
$end = 0
$old = $corr[1]
FOR($i=3, $i < $len, 2)
INC($iter)
IF(ABS($corr[$i] - $old) <= $limit_y)
$old = $corr[$i]
$end = $i - 1
ELSE
$old = $corr[$i]
sort_x($start, $end)
$start = $i - 1
$end = $i - 1
END_IF
END_CYC
sort_x($start, $end)
END_SUB
//==============================================================================
UNDEFINE($ARR_SCAN)
GETSCREEN
FOR($Varr=1, $Varr < 30)
SCANPICTURE($corr, 0,0, $_xmax,$_ymax, STRCONCAT($Varr, ".bmp"))
WAITMS(5)
END_CYC
$limit_y = 0 // допуск по y когда считаются в одном ряду
sort_y()
sort_yx()
$scan_size = ARRSIZE($corr)
FOR($ARR_NUM=$scan_size-2, $ARR_NUM >= 0, -2)
$X = $corr[$ARR_NUM]
$Y = $corr[$ARR_NUM+1]
LCLICK($X + 3, $Y + 3)
WAITMS(100)
END_CYC
-
Просто шедеврально, я в восторге, идеально прям то что нужно, спасибо огромнейшее, еще и за 7 сек все делает.
-
FOR($a = 1, $a <= 7) // ищем 7 картинок
GETSCREEN
SCANPICTURE($arr, 667,416, 1249,718, STRCONCAT("bmp\", $a, ".bmp"), -1, 100) // указать свои координаты области поиска
FOR($b = 0, $b < ARRSIZE($arr), 2)
$x = STRCONCAT("000", $arr[$b])
$y = STRCONCAT("000", $arr[$b+1])
ARRPUSH($arr2, STRCONCAT(STRCUT($y, STRLEN($y)-3, 4), STRCUT($x, STRLEN($x)-3, 4)))
END_CYC
UNDEFINE($arr)
WAITMS(30) // пауза после поиска каждой картинки
END_CYC
ARRSORT($arr2) // сортировка с учетом X и Y (в приоритете Y)
WHILE(ARRSIZE($arr2))
$str = ARRPOP($arr2)
LCLICK(STRCUT($str, 5, 8), STRCUT($str, 1, 4))
WAITMS(300) // пауза между кликами
END_CYC
HALT
-
Прикольно. Раньше тоже строки любил. Жаль, что CM не нормальный и с массивами работает очень медленно, да и инструментов мало.
Код не делал, а достал свой старый из нафталина, тогда ещё небыло ARRSORT.
И беда в версии 4.14. Он при ARRSORT принудительно переводит в числа и выковыривать координаты тяжелее. Код нужно дорабатывать.
(https://i.ibb.co/JdWsRjP/2020-11-25-09-56-37.png) (https://imgbb.com/)
И разница во времени выполнения, это из-за сломанного принта в лог на 4.14.003b (на скрине ошибся, написал 002). Он каждый раз всё перерисовывает или в цикле выводит, ХЗ
https://youtu.be/tw93Q7NgvxY
-
Проверил сейчас свой скрипт на CM v4.14.000b x32 (19.03.2019) - нормально всё работает.
Других версий у себя не нашел. Но все равно они из будущего. :)
-
Почему будущего? Самое что ни на есть настоящее.
-
Я уже решил, что все эти мёртворождённые 4.14 -остались В ПРОШЛОМ.
-
Прошу прощения код от Atas у меня не работает, а если запускаю код который написал Vint всё чётко работает. Может что-то делаю не так...
Так или иначе большое вам спасибо. уже дней пять смотрю на форуме решение и ничего ближе к своей задаче пока не нашёл.
Уточняющий вопрос по этой теме - а можно настроить этот скрипт чтобы он работал с анимированными картинками?
Ну например разные монетки из разных цветов вращаются вокруг своей оси и опускаются вниз. Скрипт здорово работает именно по той логике которой описал автор топика, но у меня почему-то не получается чтобы он кликал по двигающимся вниз монеткам. Подскажите пожалуйста как доработать этот скрипт?
Я уже пробовал менять COLORMODE и размер окна в котором происходит поиск, но пока мои попытки не увенчались успехом.
Или кликермен не может искать анимированные (картинки в движении) и нажимать на них? Если вдруг кто нашёл похожее обсуждение оставьте пожалуйста ссылочку.
За ранее благодарю!
-
дело в том что если кликнуть первую картинку, она уйдет и все остальные сместятся на одну ячейку выше
Может, надо просто кликать по тому месту, где первая картинка, раз остальные смещаются на её место, и кликать по нему пока на этом первом месте есть эта картинка? :D
Насчёт поиска анимаций. Можно, всё можно сделать, но нужно понимать, что кликерман работает с моментальным снимком экрана. Один из вариантов - разобрать анимацию по кадрам (мх будет не много) и искать все эти кадры отдельно, потом сводить найденное в общий массив и дальше по сценарию. Если вдруг у вас все монетки крутятся синхронно, то можно "фотографировать" экран, пока не встретится нужная картинка. Может, при кручении монет есть отдельные пиксели, которые не меняются, тогда можно для ускорения ориентироваться на эти пиксели, и если нужно, потом уже проверять, то ли вы нашли.
Я вообще стараюсь не пользоваться поиском картинок, обычно всегда можно выделить характерные для этой картинки пиксели и работать с ними, всё проходит намнооооооого быстрее.
-
Да, Вы правы.
Я уже пошёл по этому пути. Обработка при поиске пикселей действительно происходит намного быстрее в отличии от картинок. Закинул в SUB и вызываю его раз 30)))) пока не закончится игра (не прокликаются все монетки). Только со скоростью просмотра и нажатия на найденные пиксели ещё нужно поработать.
SUB(cocfff)
GETSCREEN(526,371, 1375, 857)
IF_PIXEL_IN(526,371, 1374, 856, 6542231)
LCLICK($_return1, $_return2+30)
END_IF
WAITMS(100)
GETSCREEN(526,371, 1375, 857)
IF_PIXEL_IN(526,371, 1374, 856, 1205465)
LCLICK($_return1, $_return2+30)
END_IF
WAITMS(100)
GETSCREEN(526,371, 1375, 857)
IF_PIXEL_IN(526,371, 1374, 856, 1263545)
LCLICK($_return1, $_return2+60) // здесь спец. нажатие ниже т.к. появляется похожий объект с приближённым цветом по которому нельзя нажимать
END_IF
WAITMS(100)
GETSCREEN(526,371, 1375, 857)
IF_PIXEL_IN(526,371, 1374, 856, 4564812)
LCLICK($_return1, $_return2+30)
END_IF
WAITMS(100)
END_SUB
-
Только со скоростью просмотра и нажатия на найденные пиксели ещё нужно поработать.
А зачем там столько вызовов GETSCREEN? И пауза должна быть после клика внутри условия, а не после него.
И если координаты одни, в IF_PIXEL_IN можно указывать несколько цветов через запятую. Сработает на первом найденном.
Примерно так
SUB(cocfff)
GETSCREEN(526,371, 1375, 857)
IF_PIXEL_IN(526,371, 1374, 856, 6542231, 1205465, 4564812)
LCLICK($_return1, $_return2+30)
WAITMS(100)
END_IF
IF_PIXEL_IN(526,371, 1374, 856, 1263545)
LCLICK($_return1, $_return2+60) // здесь спец. нажатие ниже т.к. появляется похожий объект с приближённым цветом по которому нельзя нажимать
WAITMS(100)
END_IF
END_SUB
-
А зачем там столько вызовов GETSCREEN?
я думал поскольку картинки динамические и постоянно меняют расположение нужно постоянно скринить экран и по новому скрину искать пиксели. Блин здорово если это не так. Это по сути должно ускорить работу скрипта.
И если координаты одни, в IF_PIXEL_IN можно указывать несколько цветов через запятую. Сработает на первом найденном.
у меня было много раз когда выпала одна монетка (например красная), а далее подряд сыпятся штуки 4 монетки (например зелёные)
Если кликер сразу не попал по красной картинке (такое тоже часто случается) она опустится ниже пока кликер будет жать все зелёные монетки ну и проигрыш.
Т.е. если алгоритм будет такой?:
- поиск красной
- клик по красной (промахнулся)
- поиск зелёной
- клик по зелёной
- поиск зелёной
- клик по зелёной
- поиск зелёной
- клик по зелёной
или он будет искать и жать на красную пока не нажмёт её?
Я вот уже думаю в сторону Вашего скрипта написанного выше, но для пикселей а не для картинок т.к. с анимацией он у меня не работает, но логика именно та - поиск с низу вверх как описывал автор топика.
-
Даю не большой лайфхак по скорейшему поиску динамических картинок. Плюс в том, что способ САМЫЙ быстрый, на который способен Clickermann, при максимальной точности совпадения картинок. Минуса два... Первый минус в том, что придется собирать базу картинок, но с этим справится сам Clickermann, а вот второй более весомый - координаты картинок должны быть статичны. И так - поехали...
Как пример, возьмем распознание локаций в той же fantastic fishing. Там в локациях название на фоне облаков, плюс смена погоды и времени суток и так далее и потому картинки получаются динамические.
(https://sun9-13.userapi.com/impf/01ouKxOV_a_9WfJxU5Q8kogGZb4JxMIlYFpn4w/0PucidhD4xs.jpg?size=1032x795&quality=95&sign=2ba3899b4d40c279ff9ae7ad5079fbf9&type=album)
Код скрипта будем использовать такой:
GETSCREEN (357,25, 642,39)
$count = PXLCRC (357,25, 642,39)
IF(FExists(STRCONCAT("скрины\локации"))=0)
FCREATE (STRCONCAT("скрины\локации"))
END_IF
$loka = 0
GETDIRLIST ($arr, "скрины\локации\*")
IF(ARRSIZE($arr) > 0)
FOR($i=0,$i<ARRSIZE($arr))
IF(FEXISTS(STRCONCAT("скрины\локации\",$arr[$i],"\*.bmp")))
$loka = 1
LOGWRITE ($arr[$i])
$i = ARRSIZE($arr)
END_IF
END_CYC
END_IF
IF($loka = 0)
LOGWRITE ("Локация не распознана...")
if (FExists(STRCONCAT("скрины\локации\",$count,".bmp"))=0)
SCREENSHOTFIX(357,25, 642,39, STRCONCAT("скрины\локации\",$count,".bmp"), 0)
end_if
END_IF
WAITMS(50)
Сначала запустим скрипт и дадим ему поработать круглые (игровые) сутки, чтоб день ночью сменился и наоборот. Потом в папке "локации", создадим папку с названием самой локации, скрины которой Clickermann собирал игровые сутки, и переместим в эту папку все скрины, которые Clickermann создал в папке "локации". То же самое потом повторяем с другой локацией.
Думаю, что сам механизм сейчас вам уже понятен.
Это могут быть не локации, а какие-нибудь вращающиеся монеты и так далее. Обычно для анимации таких объектов используется всего несколько статичных картинок, быстро повторяющихся друг за другом.
-
Даю не большой лайфхак по скорейшему поиску динамических картинок.
Метод рабочий. Самосбор картинок и цветов пикселей использую постоянно.
Пара технических замечаний.
1. В моей версии кликермана функций FExists и FCREATE нет, но всё равно, какой смысл использовать STRCONCAT с одним аргументом?
2. IF на строке 10, мне кажется, лишний, цикл и так не будет выполняться, если ARRSIZE($arr)==0
-
1. В моей версии кликермана функций FExists и FCREATE нет, но всё равно, какой смысл использовать STRCONCAT с одним аргументом?
А я просто рассеянный чуток по жизни и часто прописываю SCREENSHOTFIX в несуществующую папку, а потом ловлю ошибки скрипта. А STRCONCAT с одним аргументом потому, что я его часто использую и если он нужен, то я всю строку копирую просто не далеко и вставляю туда, куда надо. Иными словами, причина такой глупости элементарная - лень.
2. IF на строке 10, мне кажется, лишний, цикл и так не будет выполняться, если ARRSIZE($arr)==0
У меня иногда бывают условия типа:
IF(ARRSIZE($arr) > 0)
FOR($i=0,$i<ARRSIZE($arr))
IF(FEXISTS(STRCONCAT("скрины\локации\",$arr[$i],"\*.bmp")))
$loka = 1
LOGWRITE ($arr[$i])
$i = ARRSIZE($arr)
END_IF
END_CYC
else
END_IF
Вот и вставил по привычке. Не думаю, что привычка очень уж плохая...
-
1. В моей версии кликермана функций FExists и FCREATE нет, но всё равно, какой смысл использовать STRCONCAT с одним аргументом?
А я просто рассеянный чуток по жизни и часто прописываю SCREENSHOTFIX в несуществующую папку, а потом ловлю ошибки скрипта.
Я не про это, это понятно, я про STRCONCAT с одним аргументом.
-
Я не про это, это понятно, я про STRCONCAT с одним аргументом.
Я поправил ответ выше и сделал это раньше, чем увидел это сообщение. Сорри...
-
.... а вот второй более весомый - координаты картинок должны быть статичны.
т.е. если монета просто вращается вокруг оси то это ТОП по скорости поиска анимированных картинок, а если она вращается и двигается (вверх, вниз, вправо или влево) этот скрипт работать небудет?
-
.... а вот второй более весомый - координаты картинок должны быть статичны.
т.е. если монета просто вращается вокруг оси то это ТОП по скорости поиска анимированных картинок, а если она вращается и двигается (вверх, вниз, вправо или влево) этот скрипт работать небудет?
Нет - не будет, к сожалению. Ну... Если только координаты поиска в скрипте не будут плыть вслед за монеткой )) Хотя... Есть варианты... Сейчас опишу.
-
Объясню на таком примере...
(https://sun9-87.userapi.com/impf/J5VEhAIIyI4n2-GIpfJKvJ7gKRgkrOQHKJkDaw/umaksSTcysY.jpg?size=1032x795&quality=95&sign=caebe4a8768fcbe2c8f9f28cb3301171&type=album)
Ловить будем название выскочившей панели - "Клад халявный". Почему этот пример нам подходит...? Такие панели в игре всплывают разных размеров (названия панелей на разной высоте - зависит от количества информации внутри них) + названия у них могут быть разными. Мы не можем нашим способом вычислять и собирать базу картинок, изменяющихся и при этом с плавающими координатами, НО мы можем искать какие-нибудь не изменяющиеся картинки, тоже с плавающими координатами, но к координатам которых уже привязаны наши изменяющиеся картинки, которые нам нужны. Теперь понятна мысли?
Сначала ищем по всему экрану рамку, в которой находится сама надпись. (Для понимания ситуации, картинку увеличу)
(https://sun9-48.userapi.com/impf/_PpkzTz6t0H5G3Cy5K1D5Jmgl6QgzLy7HVnzpw/aXOHYP1q2Y0.jpg?size=1510x80&quality=95&sign=5150795ff349e431ef111c99cac59073&type=album)
Но эту рамку, которую мы будем искать, мы слегка обработаем.
(https://sun9-19.userapi.com/impf/ixk-QsJ9WoX6TxMK1a0HKZi-Ee5nsZ_zrG0ltQ/eygHn5qsR8E.jpg?size=1510x40&quality=95&sign=749f86045dc26769a64457ae6646a029&type=album)
Закрасим места рамки, которые могут изменяться, черным цветом (я закрашиваю черным).
Далее наш скрипт:
GETSCREEN
COLORMODE (6)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "скрины\рамка.bmp", 0, 100) // bgcolor отметим не -1, как обычно, а 0 - черный (что за bgcolor в IF_PICTURE_IN - читаем в справке)
LOGWRITE ("Найдена панель")
IF(FExists(STRCONCAT("скрины\панели\заголовки"))=0)
FCREATE (STRCONCAT("скрины\панели\заголовки"))
END_IF
$count = PXLCRC ($_return1+18,$_return2+2, $_return1+284,$_return2+13) // Подсчитываем хеш пикслей, для сравнения с базой, но уже отталкиваясь от координат, в которых найдена рамка
// А дальше все по старой схеме
$loka = 0
GETDIRLIST ($arr, "скрины\панели\заголовки\*")
IF(ARRSIZE($arr) > 0)
FOR($i=0,$i<ARRSIZE($arr))
IF(FEXISTS(STRCONCAT("скрины\панели\заголовки\",$arr[$i],"\*.bmp")))
$loka = 1
LOGWRITE ($arr[$i])
$i = ARRSIZE($arr)
END_IF
END_CYC
END_IF
IF($loka = 0)
LOGWRITE ("Заголовок панели не распознан...")
if (FExists(STRCONCAT("скрины\панели\заголовки\",$count,".bmp"))=0)
SCREENSHOTFIX(357,25, 642,39, STRCONCAT("скрины\панели\заголовки\",$count,".bmp"), 0)
end_if
END_IF
END_IF
WAITMS(50)
-
Вот, например, ситуация только что произошла ) У меня затилинькал мобильник, так как в группу в ВК пришло сообщение:
(https://sun9-85.userapi.com/impf/3yfD3yU62ewcipD38d6Q1_COHqCeuBUY5V5npA/8flGcO5yIXo.jpg?size=778x1600&quality=95&sign=35a84742cedfc7e0bd71dc2af6932d21&type=album)
А в игре ситуация:
(https://sun9-38.userapi.com/impf/lgNOm6nNA66kAdG9lKEnLgwacAArw_UArWRy2A/Ku1vhBn_Yf4.jpg?size=1032x795&quality=95&sign=921f87191c291f992e973a24adf0be97&type=album)
И скрипт сделал скрин:
(https://sun9-57.userapi.com/impf/jSd0u8Rt-S9OS8DVMGgRyS7v6kG5ZioesofDQw/o46rKct5JJ4.jpg?size=942x72&quality=95&sign=175459d95d3c0b484c5b56a386c79ea0&type=album)
-
Вот, кстати, еще пример... Я в БДО, при ловле рыбы, капчу выискивал вот такой сеткой. Там координаты капчи немного плавают.
(https://sun9-78.userapi.com/impf/HwDPqVrq4aIZ6VzWgwvODg9HJdvwk7rA23BuOg/lOX84oo3nBg.jpg?size=1113x174&quality=95&sign=6ea100415c570ae932eecddec815f5a8&type=album)
В каждой ячейке на экране были буквы, которые не только менялись, но и меняли свой цвет. Но там я сами буквы вычислял не по заготовленным скринам (я их не делал там), а скрипт закрашивал все пиксели, которые были не равны цвету самой клетки, и вот по таким "теням" я уже вычислял буквы капчи.