Author Topic: Простой бот для игрушки в блюстаксе  (Read 6679 times)

0 Members and 1 Guest are viewing this topic.

Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Доброго времени суток. Имеется бот, который запускается в бою, подбирает определённый уровень врага по картинке и вступает в бой, если уровень не совпадает, то бот перебирает противников, пока не найдётся нужный уровень. Но есть два момента это стабильность, даже если на экране враг нужного уровня он может его игнорировать и дальше перебирать до бесконечности врагов. Момент номер два, хотелось бы в код добавить счётчик, который бы считал количество удачных подборов врага нужного уровня, то есть скажем мне нужен противник 72 уровня и каждый раз, когда он попадается и высаживаются войска к атаке счётчик увеличивался на единицу для дальнейшего добавления функционала. Разбирался с кликером пару дней получилось вот такое, хотелось бы получить советы как оптимизировать код для стабильности и добавление счётчика.
Код бота следующий:
Code: [Select]
// 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)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #1 on: March 15, 2017, 06:24:35 AM »
Где END_IF от первого условия?


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #2 on: March 15, 2017, 09:03:37 AM »
Избавимся от GOTO и проставим недостающий END_IF/
+ счётчик
Code: (clickermann) [Select]
#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)

Если счётчик нужен не в пределах одной работы скрипта, то значение нужно читать/сохранять в файл.


Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #3 on: March 16, 2017, 10:30:56 PM »
Благодарю  :) Код работает, только осталась одна проблемка, даже если он находит нужный (72) уровень, он всё равно выполняет дальнейший перебор соперников. Добвил запись в лог удачные срабатывания счётчика, и он дошёл до 5, и начался непрерывный перебор соперников. Что ещё заметил, если два или более раз подряд не находит нужный уровень при переборе, так на переборе и застревает.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #4 on: March 17, 2017, 08:09:12 AM »
Code: (clickermann) [Select]
#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)

Можно прикрутить к циклу таймер, в этом случаи он будет прокручивать код не бесконечно
Code: (clickermann) [Select]
#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)

Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #5 on: March 18, 2017, 08:27:28 PM »
Скрипт стал работать стабильные, но чудеса не прекращаются. Он находит нужный уровень, начинает кликать и высаживает войска. На следующий заход он может проигнорировать противника с нужным уровнем. А может пролистав 2-3 противников, на нужном высадить войска. И если он пролистал где-то около 5 соперников, он уже остановиться не может, продолжает их листать. Может есть некоторые проблемы с нахождением картинки с уровнем, хоть она и подрезана по максимуму, чтоб небыло лишнего фона? Или это благодаря блюстаксу такая веселуха ?! Может ему ещё сюда привязку к окну добавить в код, хотя он и так тут работает, но если пробую на другом эмуле (MEmu), вроде что-то происходить но кликов не происходит.
« Last Edit: March 18, 2017, 08:30:26 PM by Aspirant »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #6 on: March 18, 2017, 08:36:32 PM »
Нужно использовать цветокоррекцию и процент совпадения.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #7 on: March 18, 2017, 11:16:27 PM »
Или это благодаря блюстаксу такая веселуха ?! Может ему ещё сюда привязку к окну добавить в код...
Ага, добавь. Веселуха увеличится раз в десять.


Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #8 on: March 29, 2017, 10:18:16 AM »
Добавил пару параметров в строку "IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp, -1, 15") и сумашествие закончилось. Стал работать как надо :) Но есть ещё 1 вопрос. Бой может длиться от 30 сек до 60. Думаю теперь как добавить проверку с шагом в 5 сек, закончился бой или нет, чтобы производить дальнейшие действия для сбора плюх. А то скрипт начинает это делать до того как бой кончился из-за того, что он превысил время задержки. Или есть уже готовые решения на эту тему ?

Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #9 on: March 29, 2017, 10:24:07 AM »
Или это благодаря блюстаксу такая веселуха ?! Может ему ещё сюда привязку к окну добавить в код...
Ага, добавь. Веселуха увеличится раз в десять.

Я пробовал, правда для MUemu и там постоянно ошибки вылазили. Где-то тут на форуме находил тему по теме привязки, там так красиво расписано было для чего это придумано. Былобы хорошо запустить всю эту радость, свернуть и заниматься своими делами, чтобы в виртуалке не поднимать весь этот огород :)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #10 on: March 29, 2017, 10:36:30 AM »
Quote
IF_PICTURE_IN(0,0,$_xmax,$_ymax,"72.bmp, -1, 15")

Уверен что все правильно написал? Потому что здесь косяки с кавычками.
Правильно так
Code: (clickermann) [Select]
IF_PICTURE_IN(0,0,$_xmax,$_ymax, "72.bmp",  -1, 15)
Однако 15% совпадения это слишком. Чем меньше процент тем дольше поиск.
Кроме процента нужно обязательно применять цветокоррекцию. Так несоответствие с 15 поднимется до 60-80%

Снимок получают таким скриптом
Code: (clickermann) [Select]
// Получение скриншота с цветокоррекцией (фильтр 6)
GETSCREEN
COLORMODE(6)
SCREENSHOT
HALT

В своем скрипте также нужно после GETSCREEN писать команду COLORMODE
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(6)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #11 on: March 29, 2017, 10:38:43 AM »
... Былобы хорошо запустить всю эту радость, свернуть и заниматься своими делами, чтобы в виртуалке не поднимать весь этот огород :)

Ты неправильно сформулировал. Нужно так:
"Было бы хорошо запустить всю эту радость на виртуалке, свернуть и заниматься своими делами, чтобы не городить весь этот огород с привязкой.
 :D ;D


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #12 on: March 29, 2017, 10:42:23 AM »
Думаю теперь как добавить проверку с шагом в 5 сек, закончился бой или нет, чтобы производить дальнейшие действия для сбора плюх.

Обычный поиск картинки в цикле
Code: (clickermann) [Select]
$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 весь экран, лучше указать конкретную область. Это ускорит поиск. Зачем искать картинки там где их быть не может.

Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #13 on: March 29, 2017, 07:09:29 PM »
Да с кавычками косяк :)) Увлёкся, когда писал. Реально, когда добавил эти параметры такой вакханалии, как была до этого уже не стало. По поводу виртуалки, и запуска там этого добра, блюстакс и так ресурсы кушает, а так ещё больше будет потреблять. Так, что пока не знаю потянет ли нормально эту ляпоту. Сейчас пойду допилингом заниматься по вашим рекомендациям. У меня первый язык программирования который учил был бейсик, по этому пихал GOTO везде, где можно и где не нужно :) В общем благодарю, пошёл допиливать, чтоб это и работало и выглядело красиво :)

Aspirant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Простой бот для игрушки в блюстаксе
« Reply #14 on: March 29, 2017, 07:53:47 PM »
Думаю теперь как добавить проверку с шагом в 5 сек, закончился бой или нет, чтобы производить дальнейшие действия для сбора плюх.

Обычный поиск картинки в цикле
Code: (clickermann) [Select]
$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 тут неприменим ?