Автокликер Clickermann :: Форум
Основной раздел => Использование => Topic started by: Aspirant on March 14, 2017, 11:39:05 PM
-
Доброго времени суток. Имеется бот, который запускается в бою, подбирает определённый уровень врага по картинке и вступает в бой, если уровень не совпадает, то бот перебирает противников, пока не найдётся нужный уровень. Но есть два момента это стабильность, даже если на экране враг нужного уровня он может его игнорировать и дальше перебирать до бесконечности врагов. Момент номер два, хотелось бы в код добавить счётчик, который бы считал количество удачных подборов врага нужного уровня, то есть скажем мне нужен противник 72 уровня и каждый раз, когда он попадается и высаживаются войска к атаке счётчик увеличивался на единицу для дальнейшего добавления функционала. Разбирался с кликером пару дней получилось вот такое, хотелось бы получить советы как оптимизировать код для стабильности и добавление счётчика.
Код бота следующий:
// New Script
// Author: Anonymous
// Version: 1.0 (12.03.2017)
#name "Bot"
START:
// Ищем 72 уровень
WAIT(5)
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp")
WAIT(4)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(824,638)
WAIT(5)
WAIT(60)
GOTO(SUNDUK)
ELSE
LCLICK(1177, 362)
WAIT(4)
GOTO(START)
SUNDUK:
//Ищем фрагмент кнопки для открытия сундука
WAIT(2)
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"otkr.bmp")
LCLICK($_return1, $_return2)
WAIT(4)
END_IF
//Возврат поиску противника
LCLICK(680,659)
WAIT(3)
LCLICK(1236,646)
WAIT(2)
LCLICK(832,549)
WAIT(5)
GOTO(START)
-
Где END_IF от первого условия?
-
Избавимся от GOTO и проставим недостающий END_IF/
+ счётчик
#name "Bot"
DEFINE($count, 0) // счётчик удачного нахождения
// Ищем 72 уровень
$check = 0
WHILE($check = 0)
WAIT(5)
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp")
INC($count) // увеличиваем счётчик
//WAIT(4) // сразу после поиска задержки не нужны
//WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(824,638)
WAIT(5)
WAIT(60)
$check = 1
ELSE
LCLICK(1177, 362)
WAIT(4)
END_IF
END_CYC
SUNDUK:
//Ищем фрагмент кнопки для открытия сундука
WAIT(2)
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"otkr.bmp")
LCLICK($_return1, $_return2)
WAIT(4)
END_IF
//Возврат поиску противника
LCLICK(680,659)
WAIT(3)
LCLICK(1236,646)
WAIT(2)
LCLICK(832,549)
WAIT(5)
Если счётчик нужен не в пределах одной работы скрипта, то значение нужно читать/сохранять в файл.
-
Благодарю :) Код работает, только осталась одна проблемка, даже если он находит нужный (72) уровень, он всё равно выполняет дальнейший перебор соперников. Добвил запись в лог удачные срабатывания счётчика, и он дошёл до 5, и начался непрерывный перебор соперников. Что ещё заметил, если два или более раз подряд не находит нужный уровень при переборе, так на переборе и застревает.
-
#name "Bot"
DEFINE($count, 0) // счётчик удачного нахождения
// Ищем 72 уровень
$check = 0
WHILE($check = 0) // цикл выполняется если переменная равна 0
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp")
INC($count) // увеличиваем счётчик
LOGWRITE ("Найдено ", $count, " раз")
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(824,638)
WAIT(60)
$check = 1 // если поменять значение цикл перестанет повторяться
ELSE
LCLICK(1177,362)
WAIT(4)
END_IF
END_CYC
//Ищем фрагмент кнопки для открытия сундука
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"otkr.bmp")
LCLICK($_return1, $_return2)
WAIT(4)
END_IF
//Возврат поиску противника
LCLICK(680,659)
WAIT(3)
LCLICK(1236,646)
WAIT(2)
LCLICK(832,549)
WAIT(5)
Можно прикрутить к циклу таймер, в этом случаи он будет прокручивать код не бесконечно
#name "Bot"
DEFINE($count, 0) // счётчик удачного нахождения
// Ищем 72 уровень
$time = $_time_t + 60 // таймер на 60 секунд
WHILE($time > $_time_t) // цикл выполняется 60 секунд
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp")
INC($count) // увеличиваем счётчик
LOGWRITE ("Найдено ", $count, " раз")
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(1200,672)
WAITMS(500)
LCLICK(824,638)
WAIT(60)
$time = 0
ELSE
LCLICK(1177,362)
WAIT(4)
END_IF
END_CYC
//Ищем фрагмент кнопки для открытия сундука
GETSCREEN
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"otkr.bmp")
LCLICK($_return1, $_return2)
WAIT(4)
END_IF
//Возврат поиску противника
LCLICK(680,659)
WAIT(3)
LCLICK(1236,646)
WAIT(2)
LCLICK(832,549)
WAIT(5)
-
Скрипт стал работать стабильные, но чудеса не прекращаются. Он находит нужный уровень, начинает кликать и высаживает войска. На следующий заход он может проигнорировать противника с нужным уровнем. А может пролистав 2-3 противников, на нужном высадить войска. И если он пролистал где-то около 5 соперников, он уже остановиться не может, продолжает их листать. Может есть некоторые проблемы с нахождением картинки с уровнем, хоть она и подрезана по максимуму, чтоб небыло лишнего фона? Или это благодаря блюстаксу такая веселуха ?! Может ему ещё сюда привязку к окну добавить в код, хотя он и так тут работает, но если пробую на другом эмуле (MEmu), вроде что-то происходить но кликов не происходит.
-
Нужно использовать цветокоррекцию и процент совпадения.
-
Или это благодаря блюстаксу такая веселуха ?! Может ему ещё сюда привязку к окну добавить в код...
Ага, добавь. Веселуха увеличится раз в десять.
-
Добавил пару параметров в строку "IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp, -1, 15") и сумашествие закончилось. Стал работать как надо :) Но есть ещё 1 вопрос. Бой может длиться от 30 сек до 60. Думаю теперь как добавить проверку с шагом в 5 сек, закончился бой или нет, чтобы производить дальнейшие действия для сбора плюх. А то скрипт начинает это делать до того как бой кончился из-за того, что он превысил время задержки. Или есть уже готовые решения на эту тему ?
-
Или это благодаря блюстаксу такая веселуха ?! Может ему ещё сюда привязку к окну добавить в код...
Ага, добавь. Веселуха увеличится раз в десять.
Я пробовал, правда для MUemu и там постоянно ошибки вылазили. Где-то тут на форуме находил тему по теме привязки, там так красиво расписано было для чего это придумано. Былобы хорошо запустить всю эту радость, свернуть и заниматься своими делами, чтобы в виртуалке не поднимать весь этот огород :)
-
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp, -1, 15")
Уверен что все правильно написал? Потому что здесь косяки с кавычками.
Правильно так
IF_PICTURE_IN(0,0,$_xmax,$_ymax, "72.bmp", -1, 15)
Однако 15% совпадения это слишком. Чем меньше процент тем дольше поиск.
Кроме процента нужно обязательно применять цветокоррекцию. Так несоответствие с 15 поднимется до 60-80%
Снимок получают таким скриптом
// Получение скриншота с цветокоррекцией (фильтр 6)
GETSCREEN
COLORMODE(6)
SCREENSHOT
HALT
В своем скрипте также нужно после GETSCREEN писать команду COLORMODE
GETSCREEN
COLORMODE(6)
-
... Былобы хорошо запустить всю эту радость, свернуть и заниматься своими делами, чтобы в виртуалке не поднимать весь этот огород :)
Ты неправильно сформулировал. Нужно так:
"Было бы хорошо запустить всю эту радость на виртуалке, свернуть и заниматься своими делами, чтобы не городить весь этот огород с привязкой.
:D ;D
-
Думаю теперь как добавить проверку с шагом в 5 сек, закончился бой или нет, чтобы производить дальнейшие действия для сбора плюх.
Обычный поиск картинки в цикле
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
$check = 1
ELSE
WAITMS(500)
END_IF
END_CYC
Скрипт ничего не делает кроме как тормозит выполнение пока картинка не будет найдена. Нет необходимости анализировать что то раз 5 сек. Тут все сводится к степени нагрузки на процессор. Если анализировать раз в 100-500 мс то никакой нагрузки практически не будет.
Опять же за место области 0,0, $_xmax,$_ymax весь экран, лучше указать конкретную область. Это ускорит поиск. Зачем искать картинки там где их быть не может.
-
Да с кавычками косяк :)) Увлёкся, когда писал. Реально, когда добавил эти параметры такой вакханалии, как была до этого уже не стало. По поводу виртуалки, и запуска там этого добра, блюстакс и так ресурсы кушает, а так ещё больше будет потреблять. Так, что пока не знаю потянет ли нормально эту ляпоту. Сейчас пойду допилингом заниматься по вашим рекомендациям. У меня первый язык программирования который учил был бейсик, по этому пихал GOTO везде, где можно и где не нужно :) В общем благодарю, пошёл допиливать, чтоб это и работало и выглядело красиво :)
-
Думаю теперь как добавить проверку с шагом в 5 сек, закончился бой или нет, чтобы производить дальнейшие действия для сбора плюх.
Обычный поиск картинки в цикле
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
$check = 1
ELSE
WAITMS(500)
END_IF
END_CYC
Скрипт ничего не делает кроме как тормозит выполнение пока картинка не будет найдена. Нет необходимости анализировать что то раз 5 сек. Тут все сводится к степени нагрузки на процессор. Если анализировать раз в 100-500 мс то никакой нагрузки практически не будет.
Опять же за место области 0,0, $_xmax,$_ymax весь экран, лучше указать конкретную область. Это ускорит поиск. Зачем искать картинки там где их быть не может.
Вот ещё, что, как я понимаю IF_PICTURE_IN ищет только одну картинку, а как можно сделать чтобы он искал либо 1-ю либо 2-ю картинку? Оператор OR тут неприменим ?
-
Кажись допёрло:
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file1.bmp", -1, 100)
$check = 1
ELSE
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file2.bmp", -1, 100)
$check = 1
ELSE
WAITMS(500)
END_IF
END_IF
END_CYC
Что-то такое должно быть ?
-
Именно так.
А если картинок много то можно и цикл перебора прикрутить.
$check = 0
WHILE($check = 0)
GETSCREEN
FOR($i=1,($i<6)&($check=0)) // от file1.bmp до file5.bmp
IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT("file", $i, ".bmp"), -1, 100)
$check = 1
END_IF
END_CYC
WAITMS(500)
END_CYC