Автокликер Clickermann :: Форум

Основной раздел => Использование => Topic started by: Интересующийся on February 11, 2018, 11:44:57 PM

Title: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on February 11, 2018, 11:44:57 PM
Раньше пользовался Кликером для не большой автоматизации.
Сейчас вот подумываю сделать бот для одной локации одной игры ;)
Но не знаю, как соединить и что использовать: поиск картинки или ожидание? И как всё это дело зациклить.
Смысл такой.
При заходе на локацию бот должен проверить текущее состояние.
Оно может быть в 3х состояниях:
Марш (я двигаюсь к цели) ничего делать не надо, это или я запустил в полёт или предыдущее срабатывание скрипта (лететь могу час , а могу и 20 минут, какие враги будут на пути)
Умер - меня убили надо отдохнуть 15 минут и лететь снова.
Отдых - выздоровел после смерти, стою на базе (хотя бывает что я долетел до другой базы и не умер, но такой вариант редкий)
Все эти состояния отражаются в верхнем левом углу. Сделать какртинки не трудно.
Не знаю, что использовать, и в какой последовательности?
Как вариант
Поиск или Ожидание надписи Умер, ожидание 15 минут или
Опять поиск или Ожидание появления надписи Отдых и запуск в полёт. И всё это зациклено,  к примеру на 12 часов, пока сплю, работаю.

А вот и вторая хотелка ;)
Выше писал, что могу лететь час а могу и 20 минут. У меня есть как у богатыря выбор: лететь на лево, прямо, направо (ну или точка N1, N2, N3). Можно как сделать, что если время полета, к примеру 25 минут, то следующий полёт происходит в следующую точку, отличную от предыдущего полета, и точки меняются по кругу, если мало время полета? Чтобы лететь по, возможно более легкому пути, так как противник мигрирует. :o



Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on February 12, 2018, 10:37:50 AM
Code: (clickermann) [Select]
$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 раз.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Oraven on February 12, 2018, 11:23:35 AM
Когда пишешь циклы WHILE вложенные в другие циклы, нужно использовать разные имена переменных, чтобы они не пересекались.
Правда в твоем случаи это не имеет значения.

Code: (clickermann) [Select]
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

Измерять время можно.

Code: (clickermann) [Select]
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 чтобы потом её можно было снова объявить.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on February 12, 2018, 09:43:36 PM
Сейчас пытался протестировать - наступил на одни грабли  :'(
Не все так просто как казалось.
Играю на NoxPlayer.
Проблема такая.
чтобы отправить корабли на дальнюю точку надо сдвинуть карту вправо, выбрать нужную точку и подтвердить.
Но название точек появляется если только держать нажатую левую кнопку мыши.
Таким образом надо:
Найти участок свободный от активных игровых элементов, нажать на этих координатах левую кнопку мыши, сдвинуть вправо до определенной точки, чтобы появилась крайняя левая точки, не отпуская мышь сделать скриншот, для определения координат точки.

Code: (clickermann) [Select]
MOVE(510,441)
WAITMS(50)
LDOWN(510,441)
WAITMS(50)
MOVE(944,280)
WAITMS(50)
GETSCREEN (0, 500, 200, 630)
SCREENSHOT
LUP(944,280)
С горем пополам двигает, само окно Кликера дергается и на скриншотах нет названий точек.



Title: Re: Нужна помощь в написание структуры скрипта
Post by: Oraven on February 13, 2018, 07:27:31 AM
Скорее всего двигать надо плавно, и давать большую задержку перед снимком.

Code: (clickermann) [Select]
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
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on February 13, 2018, 07:42:17 AM
Да, танцор я не важный, особенно в посудной лавке ;)
Спасибо, буду пробовать, но через неделю, акция переодическая.

Я читаю конечно форум, но не играя в те игры, к котрым есть скрипты, не совсем понятен алгоритм, и как его применить к своей ситуации.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on February 22, 2018, 12:56:44 PM
Спасибо за помощь - пригодилось, хотя упростил себе задачу, не стал сильно заморачиваться с выборам разных путей полета.

Новый вопрос.

Продолжаю облегчать себе жизнь  :) но не доконца пойму как сделать задуманное, даже блок-схему нарисовал  ;D
Краткое описание:
При заходе в уровень надо проверить на каком уровне нахожусь, 550 максимальный, если 550 - то происходит сброс (СБРОС 1 раз в день) уровня и руками воевать (НАПАДЕНИЕ), поднимаясь по уровням (можно сразу подняться до 550, можно за несколько дней), есть две жизни в день (значек молния). Если жизней нет - то выход.
Если уровень меньше 550 - то НАПАДЕНИЕ, после боя проверка наличия молнии и уровня (так как у меня со вчера мог остаться 549 уровень).
Не могу нормально циклы и условия организовать, можно ли так выпрыгивать и впрыгивать в циклы? Что-то не работает, написал много LOGWRITE чтобы было понятно на каком этапе работает программа, но то потухнет, то циклится жутко  :'(

Так же если чтото не нашлось как грамотно выходить из циклов, блоков?

Code: (clickermann) [Select]
#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

/////////////////////////////
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Evgenij_M on February 22, 2018, 02:35:49 PM
Для рисования схем сложной логики я использую очень приличный, бесплатный, браузерный редактор Draw.io

И выкладывать на форум схемы, и совместно работать с ними удобно...
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Vint on February 22, 2018, 04:30:33 PM
Что сразу попалось на глаза:
1. Метки. Почему они написаны так?
Code: (clickermann) [Select]
skip: sbros
skip: napadenie

skip в примере и было имя метки! В справке вроде понятно написано.
Вот так пишутся
Code: (clickermann) [Select]
sbros:
napadenie:

2. Везде где WAIT не хватает скобок
Code: (clickermann) [Select]
WAIT(RND(3,6)
WAIT(RND(3,5)

3. строка 169 END_CYC всунута не туда, всё перехлестнулось. Должна быть наверно после 180

4. Про выход из цикла. Временно убрал лишнее
Code: (clickermann) [Select]
// ...
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
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on February 22, 2018, 08:21:22 PM
Винт, я попробую попозже.
Но мне кажется я не так выразился про жизни (молнии). Я могу провести не 2 а более боев. Жизни тратятся если игрок проигрывает, если Победа - то они не трататся
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Vint on February 23, 2018, 07:02:13 PM
О каких жизнях-молниях речь. эндцикл не там! Блоки кода переплелись и нормально работать никогда не будут. О самой логике и последовательностях действий можно говорить только после исправления указанных косяков.
Метки - вообще нарушение синтаксиса.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on April 01, 2018, 09:39:51 AM
Всем спасибо за помощь и  критику  ;)
Потихоньку начинаю разбираться и понимать в программе.
Заново написал предыдущий код, внимательно смотрел на начало и конец всяких циклов и условий и все заработало  8)

Возник новый вопрос, уже где-то его встречал реализацию, но найти не могу:

Я нахожу координаты текста/рисунка и если координаты (х, у) оказываются в определенной области, с каким-то нужным небольшим отклонением, то одно действие, если отклонения больше заданного - то другое действие.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Vint on April 01, 2018, 11:20:17 AM
Обычные вычисления и обычные условия IF.
Пусть (x1, y1, x2, y2) - область в какую должны попасть, с допуском 15 px
Code: (clickermann) [Select]
IF((x > x1-15) & (x < x2+15) & (y > y1-15) & (y < y2+15))
    // то одно
ELSE
    // то другое
END_IF
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on April 01, 2018, 12:05:26 PM
Спасибо, попробую.
Для большинства людей - это не обычно  ;D :o
Наш мозг как Ваш не работает.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on April 01, 2018, 01:23:59 PM
Обычные вычисления и обычные условия IF.
Пусть (x1, y1, x2, y2) - область в какую должны попасть, с допуском 15 px
Code: (clickermann) [Select]
IF((x > x1-15) & (x < x2+15) & (y > y1-15) & (y < y2+15))
    // то одно
ELSE
    // то другое
END_IF
спасибо, работает
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on June 21, 2018, 09:54:59 AM
Всем доброго дня.
После долгого отсутствия созрели новые вопросы.
Так сказать исходные данные:
Играю на пк через эмулятор Нокс в игрулю, основа и доп аккаунт. В игре есть нудные часовые акции. С помощью программы с одним акком справляюсь.
На пк могу запустить парралельно два окна Нокса, с разными учетками. А как организовать бои сразу в двух учетках? Можно ли запускать паралельно два Кликера для каждого эмуля в отдельности? Или после отработки короткого цикла окна #1 переходить в окно#2 и так по кругу?!
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on June 29, 2018, 12:35:05 PM
Спасибо.
1 вариант более приемлемый.
Title: Re: Нужна помощь в написание структуры скрипта
Post by: Интересующийся on June 29, 2018, 12:58:54 PM
Созрел ещё один вопрос.
Нужна структура вот какая.
Нужно запускать корабли, но с соблюдением двух условий одновременно:
В определенной области должна пропасть надпись ОБНОВЛНИЕ, и должна присутствовать ОЖИДАНИЕ (Как-то надо цикл на проверку исчезновения Обновление, потом проверка на появление Ожидания. ) потом выполнить пару действий и запусть второй и третий корабль.

И если можно объясните как легче и проще разбираться с циклами, когда они идут друг в друге, потом ряд действий, и это всё ещё в цикле?!  :o