Author Topic: Нужна помощь в написании цикла с поиском картинок  (Read 14000 times)

0 Members and 2 Guests are viewing this topic.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Здравствуйте.

как организовать компактный цикл для выполнения следующей задачи?

При входе на страницу попадаю на ВКЛАДКА1. С правой стороны высвечиваются кнопки, предположим ПРИЗ. На вкладке может быть от нуля до четырех кнопок ПРИЗ.
Надо эти кнопки нажать. Как призы закончены, надо перейти на ВКЛАДКА2 и там же собрать призы, потом ВКЛАДКА3, ВКЛАДКА4.
Я сделал вот так:


// попадаем на вкладку1

FOR ($i, $i<5)   // 4 раза
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "ПРИЗ.bmp", -1, 100)
      LOGWRITE("изображение ПРИЗ найдено") // пока сделал чтоб писалось в лог, что происходит в программе
      LCLICK($_return1+*, $_return2+*) // забирает ПРИЗ
      WAIT(5)
   ELSE
      LOGWRITE("изображение ПРИЗ НЕнайдено")
   END_IF
END_CYC

потом надо зациклить этот цикл, так как вкладок четыре. я так понимаю, что этот цикл можно сделать как подпрограмму SUB, а потом просто вызывать, после того как перешел на новую вкладку.



Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ну, правильно думаешь.

Переменную цикла нужно обнулять.
Code: (clickermann) [Select]
FOR ($i=0, $i<5)
Если не найдено на каком-то этапе - зачем продолжать? ведь закончились. Выходи из цикла принудительно
Code: (clickermann) [Select]
   ELSE
      $i = 10
      LOGWRITE("изображение ПРИЗ НЕнайдено")
   END_IF

Если кнопки приз после клика по одной из них не перемещаются,  GETSCREEN достаточно сделать один перед циклом
Code: (clickermann) [Select]
GETSCREEN
FOR ($i=0, $i<5)   // 4 раза

Или вообще уйти от цикла и заменить IF_PICTURE_IN на SCANPICTURE

Code: (clickermann) [Select]
GETSCREEN
SCANPICTURE($ARR_SCAN, 0,0,$_xmax,$_ymax, "ПРИЗ.bmp")

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,2)
   LOGWRITE("изображение ПРИЗ найдено") // пока сделал чтоб писалось в лог, что происходит в программе
   LCLICK($_return1+*, $_return2+*) // забирает ПРИЗ
   WAITMS(500)
END_CYC
UNDEFINE($ARR_SCAN)





Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Спасибо. Попробую.
Просто у меня информатика - три класса церковной школы, делаю скрип на подобии скриптов, сделанных на этом сайте.
SCANPICTURE скорее всего не подойдет, так как не все кнопки ПРИЗ сразу видны на экране, а только 2,5, а когда на них нажимаешь они уходят вниз,  а на место них поднимаются другие кнопки.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Помогите с картинками. Пытаюсь найти ключевые точки, получается найти только в одной картинке, другие кажущиеся одинаковыми имеют мелкие отличия. Даже в КОЛОРМОД8 и то есть отличия





В других КОЛОРМОДАХ просто жуткая мешанина цветов.


Других кнопок с надписью ПОЛУЧИТЬ в игре под 20 штук. Брать одну букву не получается так как на странице их встречается много. Как проще и надежнее делать поиск ??

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вырезаешь картинку поменьше и указываешь процент совпадения

Code: (clickermann) [Select]
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "поиск.bmp", -1, 85)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF


Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Спасибо. Попробую.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Добрый день.
Спасибо за помощь. Все получается.

Но вот в чем вопрос!!

Предположим есть некоторая локация, в которой надо сделать определенные действия: что-то зарядить, что-то собрать, улучшить (и таких локаций с десяток).
Каждый раз появляются менюшки, кнопки но:
1. каждый раз надо делать поиск этих картинок (но тогда 80% скрипта будет гетскрин, колормод, иф пикче ин ;)
или
2. можно в локации найти какую-то точку отсчета и прибавлять координаты, что бы бот кликал по кнопкам (они всегда бывают только в строго определенных места) ?!

Мысли по методам:
1. посложнее (уж больно много времени занимает обработка картинок, поиск фрагментов) и точнее (если не нашел картинку, сделал скрин и  остановился)
2. может "тупо" "тыкнуть" не туда.

3. Какой легкий редактор картинок можно использовать вместо Виндовского Пайна?
4. к примеру играю на смартфоне, тут в игре появляется редкая картинка, если сделаю скриншот, он потом пригодится в работе или надо обязательно скрины которые делает сам кликер?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Конечно можно использовать ориентир по которому несложно вычислить координаты кнопок

Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
   $sav_X = $_return1
   $sav_Y = $_return2
   LCLICK($sav_X-400, $sav_Y+200)
   WAITMS(100)
   LCLICK($sav_X-300, $sav_Y+500)
   WAITMS(100)
   LCLICK($sav_X-400, $sav_Y+500)
   WAITMS(100)
END_IF

Для редактирования картинок я использую фотошоп, но и более простые подойдут, например более навороченный чем Paint  Paint.NET

Скриншот можно делать чем угодно, главное чтобы сжатие было без потерь BMP или PNG. Сохранение в JPG портит картинку.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Спасибо.
А если скриншот со смарта надо "обесцветить" (черно-белый сделать) то как быть? Картинку открыть на компе (полный экран или окно) и применить гетскрин, колормод8?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Конечно. Открываешь при масштабе 100% вьювером и грабишь уже кликером в нужном колормоде.


Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Винт, подскажи пожалуйста, как выйти из цикла принудительно, не совсем понял
Quote
Если не найдено на каком-то этапе - зачем продолжать? ведь закончились. Выходи из цикла принудительно

Опишите кратко структуру скрипта, если я хочу использовать sub. В справке
Quote
Однако, описание подпрограммы должно быть раньше (выше) любого из ее вызовов.
Я должен описать все SUB программы, а потом уже скрипт?

ezfalcon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
1. FOR ($i, $i<5)  - это условия вашего цикла

   $i = 10 - а это та самая переменная которая наращивается внутри цикла, так вот, как только цикл вам надоел приравниваете переменную цикла к значению выше указанного в условии (5), в данном случае всё что больше 6 приведёт к выходу из этого цикла.
 
полагаю, всё, что больше 4 имелось ввиду

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
 :) :D  10 само собой для удобочитаемости скрипта. Глянув на условие сразу понятно что валим. Без вникания . А так конечно да, все что больше 4.


Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Добрый день. спасибо за помощь. многому научили и пояснили.

вот возник вопрос:

IF_PICTURE_IN ищет нужный фрагмент с левого верхнего в правый нижний.
а как и чем можно произвести поиск в обратную сторону, справа налево и при первом совпадении попасть в эту точку?

и еще вопрос связан с поиском картинки, но с ожиданием. такой скрипт есть в шаблоне. его применение только в случае если нужная картинка может появится как через 5 сек, так и через 25, чтобы убыстрить работу скрипта. если время появление картинки точно известно стоит его применять ?
« Last Edit: February 18, 2015, 04:10:09 PM by Andrey_13 »

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Профессионалы. Помогите в общих чертах со скриптом.
Есть много мелких блоков, отдельно они работают. А вот как их собрать в один большой скрип?!
Есть задания которые надо выполнить 1 раз за день (но есть задания только утром, есть только вечером), не которые 2-3 раза в день.
можно ли сделать так:
1-ый поток - все что надо выполнить 1 раз, выполнился 1 раз и закончился
2-ой поток - следит за рекламой, ошибками связи, и прочими редкими окнами и как там внутри организовать проверки этих событий? зациклить поиск 2-3 картинок?
3-ий потом - можно сделать, чтоб он стартовал по времени и работал к примеру с 12 до 13
а как сделать повтор тех заданий, которые повторяются 2-3 раза, но на их выполнения требуется время, т.е. их выполнение разнесено по времени.

И в дополнение: если все это надо выполнить для 2-3 разных учеток, как можно организовать?
« Last Edit: February 19, 2015, 10:30:42 AM by Andrey_13 »