Автокликер Clickermann :: Форум
Основной раздел => Использование => Topic started by: Интересующийся on February 11, 2018, 11:44:57 PM
-
Раньше пользовался Кликером для не большой автоматизации.
Сейчас вот подумываю сделать бот для одной локации одной игры ;)
Но не знаю, как соединить и что использовать: поиск картинки или ожидание? И как всё это дело зациклить.
Смысл такой.
При заходе на локацию бот должен проверить текущее состояние.
Оно может быть в 3х состояниях:
Марш (я двигаюсь к цели) ничего делать не надо, это или я запустил в полёт или предыдущее срабатывание скрипта (лететь могу час , а могу и 20 минут, какие враги будут на пути)
Умер - меня убили надо отдохнуть 15 минут и лететь снова.
Отдых - выздоровел после смерти, стою на базе (хотя бывает что я долетел до другой базы и не умер, но такой вариант редкий)
Все эти состояния отражаются в верхнем левом углу. Сделать какртинки не трудно.
Не знаю, что использовать, и в какой последовательности?
Как вариант
Поиск или Ожидание надписи Умер, ожидание 15 минут или
Опять поиск или Ожидание появления надписи Отдых и запуск в полёт. И всё это зациклено, к примеру на 12 часов, пока сплю, работаю.
А вот и вторая хотелка ;)
Выше писал, что могу лететь час а могу и 20 минут. У меня есть как у богатыря выбор: лететь на лево, прямо, направо (ну или точка N1, N2, N3). Можно как сделать, что если время полета, к примеру 25 минут, то следующий полёт происходит в следующую точку, отличную от предыдущего полета, и точки меняются по кругу, если мало время полета? Чтобы лететь по, возможно более легкому пути, так как противник мигрирует. :o
-
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "DEAD.bmp", -1, 100) // ожидание когда убьют
$check = 1
WAIT(900) // как только появиться надпись DEAD ожидание лечения 15 мин //Будет ожидание 15 минут внутри цикла??
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "ОТДЫХ.bmp", -1, 100) // ожидание окончания лечения
$check = 1
LCLICK($_return1, $_return2) // запуск на точку
ELSE
WAITMS(50)
END_IF
END_CYC
ELSE
WAITMS(50)
END_IF
END_CYC
Это должно быть как-то так?
И все это должно быть ещё в цикле, так как к примеру за 10 часов должно повториться от 10 до 20 раз.
-
Когда пишешь циклы WHILE вложенные в другие циклы, нужно использовать разные имена переменных, чтобы они не пересекались.
Правда в твоем случаи это не имеет значения.
FOR($a=0,$a<20) // цикл на 20 повторов
$check1 = 0
WHILE($check1 = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "DEAD.bmp", -1, 100) // ожидание когда убьют
$check = 1
WAIT(900) //Будет ожидание 15 минут внутри цикла
$check2 = 0
WHILE($check2 = 0)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "ОТДЫХ.bmp", -1, 100) // ожидание окончания лечения
$check = 1
LCLICK($_return1, $_return2) // запуск на точку
ELSE
WAITMS(50)
END_IF
END_CYC
ELSE
WAITMS(50)
END_IF
END_CYC
END_CYC
HALT
Измерять время можно.
DEFINE($time, $_time_t) // Объявляем переменную $time и записываем в неё время unix
LOGWRITE($_time_t-$time) // по ходу выполнения скрипта отнимая сохраненное значение от текущего времени можно узнать сколько секунд прошло с момента объявления
WAIT(1)
IF($_time_t-$time > 3600) // по условию можно выполнять действия
LOGWRITE ("Прошло времени более часа")
UNDEFINE($time)
ELSE
IF($_time_t-$time > 1200)
LOGWRITE ("Прошло времени более 20 минут")
UNDEFINE($time)
END_IF
END_IF
После выполнения действия нужно уничтожить переменную $time командой UNDEFINE чтобы потом её можно было снова объявить.
-
Сейчас пытался протестировать - наступил на одни грабли :'(
Не все так просто как казалось.
Играю на NoxPlayer.
Проблема такая.
чтобы отправить корабли на дальнюю точку надо сдвинуть карту вправо, выбрать нужную точку и подтвердить.
Но название точек появляется если только держать нажатую левую кнопку мыши.
Таким образом надо:
Найти участок свободный от активных игровых элементов, нажать на этих координатах левую кнопку мыши, сдвинуть вправо до определенной точки, чтобы появилась крайняя левая точки, не отпуская мышь сделать скриншот, для определения координат точки.
MOVE(510,441)
WAITMS(50)
LDOWN(510,441)
WAITMS(50)
MOVE(944,280)
WAITMS(50)
GETSCREEN (0, 500, 200, 630)
SCREENSHOT
LUP(944,280)
С горем пополам двигает, само окно Кликера дергается и на скриншотах нет названий точек.
-
Скорее всего двигать надо плавно, и давать большую задержку перед снимком.
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y) // подпрограмма плавного перемещения курсора.
$MOVE_SPEED = 9 // множитель скорости (от 1 до бесконечности)
$MOVE_Start_X = $_xmouse
$MOVE_Start_Y = $_ymouse
$MOVE_X = $MOVE_Start_X
$MOVE_Y = $MOVE_Start_Y
$dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
$MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
IF($MOVE_SPEEDVAR < 1)
$MOVE_SPEEDVAR = 1
END_IF
$MOVE_step=($dist-1)/$MOVE_SPEEDVAR
$MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
$MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
$MOVE_X = $MOVE_X + $MOVE_X_step
$MOVE_Y = $MOVE_Y + $MOVE_Y_step
MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0))
WAITMS(1) // Скорость движения
END_CYC
MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB
MOVE(510,441)
WAITMS(50)
LDOWN(510,441)
WAITMS(50)
mouse_move(944,280) // Плавно двигаем курсор к координате 944,280
WAITMS(200)
GETSCREEN
SCREENSHOT
LUP(944,280)
HALT
-
Да, танцор я не важный, особенно в посудной лавке ;)
Спасибо, буду пробовать, но через неделю, акция переодическая.
Я читаю конечно форум, но не играя в те игры, к котрым есть скрипты, не совсем понятен алгоритм, и как его применить к своей ситуации.
-
Спасибо за помощь - пригодилось, хотя упростил себе задачу, не стал сильно заморачиваться с выборам разных путей полета.
Новый вопрос.
Продолжаю облегчать себе жизнь :) но не доконца пойму как сделать задуманное, даже блок-схему нарисовал ;D
Краткое описание:
При заходе в уровень надо проверить на каком уровне нахожусь, 550 максимальный, если 550 - то происходит сброс (СБРОС 1 раз в день) уровня и руками воевать (НАПАДЕНИЕ), поднимаясь по уровням (можно сразу подняться до 550, можно за несколько дней), есть две жизни в день (значек молния). Если жизней нет - то выход.
Если уровень меньше 550 - то НАПАДЕНИЕ, после боя проверка наличия молнии и уровня (так как у меня со вчера мог остаться 549 уровень).
Не могу нормально циклы и условия организовать, можно ли так выпрыгивать и впрыгивать в циклы? Что-то не работает, написал много LOGWRITE чтобы было понятно на каком этапе работает программа, но то потухнет, то циклится жутко :'(
Так же если чтото не нашлось как грамотно выходить из циклов, блоков?
#name "проба сброса"
// объявить и обнулить переменные
// проверка текущего уровня
LOGWRITE ("проверка на наличия 550") //если 550 то происходит сброс вниз для повторного прохода
WAITMS(200)
GETSCREEN (0,0, 1200,720) // ищем 550
COLORMODE (8)
IF_PICTURE_IN (600,60, 850,150, "dekster\beskonechnost\550.bmp", -1, 90)
LOGWRITE ("550 найдена")
WAITMS(200)
// сброс набега
skip: sbros
GETSCREEN (0,0, 1200,720) // ищем СБРОС
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\сброс.bmp", -1, 90)
LOGWRITE ("сброс найдена")
WAITMS(200)
LCLICK($_return1, $_return2)
// сброс должен быть только 1 раз в день
WAIT(RND(3,5)
GETSCREEN (0,0, 1200,720) // ищем Галочку (подтверждение СБРОСА)
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\YES.bmp", -1, 90)
LOGWRITE ("ГАЛОЧКА найдена")
WAITMS(200)
LCLICK($_return1, $_return2)
WAIT(RND(3,6)
GETSCREEN (0,0, 1200,720) // ищем ОГРАБИТЬ
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\ОГРАБИТЬ.bmp", -1, 90)
LOGWRITE ("ОГРАБИТЬ найдена")
WAITMS(200)
LCLICK($_return1, $_return2)
LOGWRITE ("жду окончание набега")
WAIT(RND(80,90)
GETSCREEN (0,0, 1200,720) // ищем ПОЛУЧИТЬ НАГРАДУ
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\слот.bmp", -1, 90)
LOGWRITE ("Получить найдена")
WAITMS(200)
LCLICK($_return1, $_return2)
WAIT(RND(3,5)
GETSCREEN (0,0, 1200,720) // ищем Подтвердить
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\Подтвердить.bmp", -1, 90)
LOGWRITE ("Подтвердить найдена")
WAITMS(200)
LCLICK($_return1, $_return2)
WAIT(RND(3,5)
else
LOGWRITE ("Подтвердить не найдена")
END_IF
else
LOGWRITE ("Получить не найдена")
END_IF
else
LOGWRITE ("ОГРАБИТЬ не найдена")
END_IF
else
LOGWRITE ("Галочка не найдена")
END_IF
else
LOGWRITE ("сброс не найдена")
END_IF // не нашел набег
else
LOGWRITE ("550 не найдена")
END_IF // не нашел 550
// нападение
skip: napadenie
$check1 = 0
WHILE($check1 = 0)
LOGWRITE (" можно бить противника и идти вверх")
WAITMS(50)
LCLICK(491,461) // тыкнуть на кого нападать
WAIT(RND(7,9)
GETSCREEN (0,0, 1200,720) // ищем сражение
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\beskonechnost\srazhenie.bmp", -1, 90)
LOGWRITE ("сражение найдена, жму")
WAITMS(200)
LCLICK($_return1, $_return2)
WAIT(RND(5,7)
LOGWRITE (" ищу пропустить")
// попробовать ожидать картинку и сразу нажать, уменьшив время последнего ожидания
// $check = 0
// WHILE($check = 0)
// GETSCREEN
// IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
// $check = 1
// LCLICK($_return1, $_return2)
// WAITMS(100)
// ELSE
// WAITMS(50)
// END_IF
// END_CYC
//
GETSCREEN (0,0, 1200,720) // ищем пропустить
COLORMODE (8)
IF_PICTURE_IN (0,660, 200,720, "dekster\beskonechnost\propustit.bmp", -1, 90)
LOGWRITE (" пропустить найдена")
LCLICK($_return1, $_return2) // картинку видит, но не всегда получается нажать
WAITMS(50)
LCLICK($_return1+10, $_return2+10)
WAIT(RND(5,7)
LOGWRITE (" ищу ДАЛЕЕ >>")
GETSCREEN (0,0, 1200,720) // ищем ДАЛЕЕ
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\beskonechnost\dalee.bmp", -1, 90)
LOGWRITE ("ДАЛЕЕ найдена")
WAITMS(150)
LCLICK($_return1, $_return2)
WAIT(RND(5,7)
LOGWRITE (" ищу молнии")
GETSCREEN (0,0, 1200,720) // проверка наличия ходов
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\beskonechnost\molniya.bmp", -1, 90)
LOGWRITE ("МОЛНИЯ найдена, можно бить")
WAITMS(150)
GETSCREEN (0,0, 1200,720) // ищем 550
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\beskonechnost\550.bmp", -1, 90)
LOGWRITE ("550 найдена")
WAITMS(200)
GOTO(sbros)
else
LOGWRITE ("550 не найдена")
END_IF
else
$check = 1
LOGWRITE ("МОЛНИЯ не найдена, ходы закончились")
GOTO(napadenie)
END_CYC
END_IF
else
LOGWRITE ("ДАЛЕЕ не найдена")
END_IF
else
LOGWRITE ("сражение не найдена")
END_IF
else
LOGWRITE ("сражение не найдена")
END_IF
// конец нападения
HALT
/////////////////////////////
-
Для рисования схем сложной логики я использую очень приличный, бесплатный, браузерный редактор Draw.io
И выкладывать на форум схемы, и совместно работать с ними удобно...
-
Что сразу попалось на глаза:
1. Метки. Почему они написаны так?
skip: sbros
skip: napadenie
skip в примере и было имя метки! В справке вроде понятно написано.
Вот так пишутся
sbros:
napadenie:
2. Везде где WAIT не хватает скобок
WAIT(RND(3,6)
WAIT(RND(3,5)
3. строка 169 END_CYC всунута не туда, всё перехлестнулось. Должна быть наверно после 180
4. Про выход из цикла. Временно убрал лишнее
// ...
napadenie:
$check1 = 0
WHILE($check1 = 0)
// ... много кода
IF_PICTURE_IN (0,0, 1200,720, "dekster\beskonechnost\molniya.bmp", -1, 90)
LOGWRITE ("МОЛНИЯ найдена, можно бить")
WAITMS(150)
GETSCREEN (0,0, 1200,720) // ищем 550
COLORMODE (8)
IF_PICTURE_IN (0,0, 1200,720, "dekster\beskonechnost\550.bmp", -1, 90)
LOGWRITE ("550 найдена")
WAITMS(200)
//GOTO(sbros)
$check1 = 1
else
LOGWRITE ("550 не найдена")
END_IF
else
// $check = 1 // строка потеряшка
LOGWRITE ("МОЛНИЯ не найдена, ходы закончились")
//GOTO(napadenie)
$check1 = 2
END_IF
// ... много закрывающего кода
END_CYC
IF($check1 = 1)
GOTO(sbros)
END_IF
IF($check1 = 2)
GOTO(napadenie)
END_IF
-
Винт, я попробую попозже.
Но мне кажется я не так выразился про жизни (молнии). Я могу провести не 2 а более боев. Жизни тратятся если игрок проигрывает, если Победа - то они не трататся
-
О каких жизнях-молниях речь. эндцикл не там! Блоки кода переплелись и нормально работать никогда не будут. О самой логике и последовательностях действий можно говорить только после исправления указанных косяков.
Метки - вообще нарушение синтаксиса.
-
Всем спасибо за помощь и критику ;)
Потихоньку начинаю разбираться и понимать в программе.
Заново написал предыдущий код, внимательно смотрел на начало и конец всяких циклов и условий и все заработало 8)
Возник новый вопрос, уже где-то его встречал реализацию, но найти не могу:
Я нахожу координаты текста/рисунка и если координаты (х, у) оказываются в определенной области, с каким-то нужным небольшим отклонением, то одно действие, если отклонения больше заданного - то другое действие.
-
Обычные вычисления и обычные условия IF.
Пусть (x1, y1, x2, y2) - область в какую должны попасть, с допуском 15 px
IF((x > x1-15) & (x < x2+15) & (y > y1-15) & (y < y2+15))
// то одно
ELSE
// то другое
END_IF
-
Спасибо, попробую.
Для большинства людей - это не обычно ;D :o
Наш мозг как Ваш не работает.
-
Обычные вычисления и обычные условия IF.
Пусть (x1, y1, x2, y2) - область в какую должны попасть, с допуском 15 px
IF((x > x1-15) & (x < x2+15) & (y > y1-15) & (y < y2+15))
// то одно
ELSE
// то другое
END_IF
спасибо, работает
-
Всем доброго дня.
После долгого отсутствия созрели новые вопросы.
Так сказать исходные данные:
Играю на пк через эмулятор Нокс в игрулю, основа и доп аккаунт. В игре есть нудные часовые акции. С помощью программы с одним акком справляюсь.
На пк могу запустить парралельно два окна Нокса, с разными учетками. А как организовать бои сразу в двух учетках? Можно ли запускать паралельно два Кликера для каждого эмуля в отдельности? Или после отработки короткого цикла окна #1 переходить в окно#2 и так по кругу?!
-
Спасибо.
1 вариант более приемлемый.
-
Созрел ещё один вопрос.
Нужна структура вот какая.
Нужно запускать корабли, но с соблюдением двух условий одновременно:
В определенной области должна пропасть надпись ОБНОВЛНИЕ, и должна присутствовать ОЖИДАНИЕ (Как-то надо цикл на проверку исчезновения Обновление, потом проверка на появление Ожидания. ) потом выполнить пару действий и запусть второй и третий корабль.
И если можно объясните как легче и проще разбираться с циклами, когда они идут друг в друге, потом ряд действий, и это всё ещё в цикле?! :o