Author Topic: Нужна помощь в написание структуры скрипта  (Read 4474 times)

0 Members and 1 Guest are viewing this topic.

Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Раньше пользовался Кликером для не большой автоматизации.
Сейчас вот подумываю сделать бот для одной локации одной игры ;)
Но не знаю, как соединить и что использовать: поиск картинки или ожидание? И как всё это дело зациклить.
Смысл такой.
При заходе на локацию бот должен проверить текущее состояние.
Оно может быть в 3х состояниях:
Марш (я двигаюсь к цели) ничего делать не надо, это или я запустил в полёт или предыдущее срабатывание скрипта (лететь могу час , а могу и 20 минут, какие враги будут на пути)
Умер - меня убили надо отдохнуть 15 минут и лететь снова.
Отдых - выздоровел после смерти, стою на базе (хотя бывает что я долетел до другой базы и не умер, но такой вариант редкий)
Все эти состояния отражаются в верхнем левом углу. Сделать какртинки не трудно.
Не знаю, что использовать, и в какой последовательности?
Как вариант
Поиск или Ожидание надписи Умер, ожидание 15 минут или
Опять поиск или Ожидание появления надписи Отдых и запуск в полёт. И всё это зациклено,  к примеру на 12 часов, пока сплю, работаю.

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




Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
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 раз.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Когда пишешь циклы 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 чтобы потом её можно было снова объявить.

Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Сейчас пытался протестировать - наступил на одни грабли  :'(
Не все так просто как казалось.
Играю на 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)
С горем пополам двигает, само окно Кликера дергается и на скриншотах нет названий точек.




Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Скорее всего двигать надо плавно, и давать большую задержку перед снимком.

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

Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Да, танцор я не важный, особенно в посудной лавке ;)
Спасибо, буду пробовать, но через неделю, акция переодическая.

Я читаю конечно форум, но не играя в те игры, к котрым есть скрипты, не совсем понятен алгоритм, и как его применить к своей ситуации.

Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Спасибо за помощь - пригодилось, хотя упростил себе задачу, не стал сильно заморачиваться с выборам разных путей полета.

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

Продолжаю облегчать себе жизнь  :) но не доконца пойму как сделать задуманное, даже блок-схему нарисовал  ;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

/////////////////////////////
« Last Edit: February 22, 2018, 12:59:02 PM by Интересующийся »

Evgenij_M

  • Освоившийся
  • **
  • Posts: 58
    • View Profile
Для рисования схем сложной логики я использую очень приличный, бесплатный, браузерный редактор Draw.io

И выкладывать на форум схемы, и совместно работать с ними удобно...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Что сразу попалось на глаза:
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
« Last Edit: February 22, 2018, 04:32:49 PM by Vint »


Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Винт, я попробую попозже.
Но мне кажется я не так выразился про жизни (молнии). Я могу провести не 2 а более боев. Жизни тратятся если игрок проигрывает, если Победа - то они не трататся

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
О каких жизнях-молниях речь. эндцикл не там! Блоки кода переплелись и нормально работать никогда не будут. О самой логике и последовательностях действий можно говорить только после исправления указанных косяков.
Метки - вообще нарушение синтаксиса.


Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Всем спасибо за помощь и  критику  ;)
Потихоньку начинаю разбираться и понимать в программе.
Заново написал предыдущий код, внимательно смотрел на начало и конец всяких циклов и условий и все заработало  8)

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

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Обычные вычисления и обычные условия 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


Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Спасибо, попробую.
Для большинства людей - это не обычно  ;D :o
Наш мозг как Ваш не работает.

Интересующийся

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Обычные вычисления и обычные условия 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
спасибо, работает