Author Topic: Как обьеденить циклы?  (Read 5308 times)

0 Members and 1 Guest are viewing this topic.

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Как обьеденить циклы?
« on: February 18, 2015, 10:00:41 AM »
Здравствуйте.
Написал скрипт с помощью справки и похожих примеров , но некоторые фрагменты не работают или работают не правильно.
Не пойму как обьеденить циклы и как можно ускорить процесс. И вообще упростить код
Помогите пожалуйста )

Ситуация такая:
Есть ряд 10ти цифр
http://clip2net.com/s/3cFqvNV,
http://clip2net.com/s/3cF0MO7,
они меняются при смене комнаты (обновлении страници)  и мне нужно выбрать 2 заданных (в данном случае 7 и 8 ), и все из ряда если они есть.
Навожу курсор на цифру, она меняет фон http://clip2net.com/s/3cF1ndn, всплывает окно в произвольной области одной части экрана http://clip2net.com/s/3cFrxZ9.
Нажимаю его.  Снова всплывает окно в другой области http://clip2net.com/s/3cFrpDq. Нажать.
Затем следующая цифра. И в конце обновление страницы.

Что я написал:
Code: [Select]
         
                                                           // поиск бледного пикселя вокруг полоски с цифрами, понять, что страница обновилась
WHILE(PXL(x,y) ! Бледный)
      GETSCREEN (x, y, x1, y1)
      WAITMS(RND(100,200))
   END_IF
END_CYC


//$check = 0                                        //или так правильней?
//WHILE($check = 0)
//   GETSCREEN (x, y, x1, y1)
// IF_PIXEL_IN (x, y, x1, y1, Бледный)
//        $check = 1
//      WAITMS(RND(100,200))
//   END_IF
//END_CYC


           //Ищем 7 оранжевую
                                 
$check = 0                                                             
WHILE($check = 0)
   GETSCREEN (x, y, x1, y1)           //вся полоска
   IF_PICTURE_IN (x, y, x1, y1, "7оранжевый.bmp", -1)                   
      $check = 1
      move($_return1, $_return2)
      END_IF
END_CYC
//Проверяем выделение сегмента с цифрой. Бывает не выделяется и окно не всплывает.

getscreen ([$_return1, $_return2, $_return1+10, $_return2+10])
WHILE(PXL($_return1,$_return2) ! Фон цифры)
WAITMS(10)
  move($_return1-10, $_return2)
  WAITMS(10)
  move($_return1+10, $_return2)
  WAITMS(10)
  getscreen ([$_return1, $_return2, $_return1+10, $_return2+10])
END_CYC
//Ищем первое окно Готовности
$check = 0
WHILE($check = 0)
   getscreen (x, y, x1, y1)
   IF_PIXEL_IN (x, y, x1, y1, Желтый)
         $check = 1
      LCLICK($_return1, $_return2)
   END_IF
END_CYC
//Ищем второе окно GOD
$check = 0
WHILE($check = 0)
   getscreen (x, y, x1, y1)
   IF_PIXEL_IN (x, y, x1, y1, Синий)
         $check = 1
      WAITMS(RND(10,50))
      MOVE($_return1, $_return2)
      END_IF
END_CYC
                                                 //клик для продолжения
WHILE(iskeydown(1)=0)
   WAITMS(20)
   LCLICK($_return1, $_return2)
END_CYC

//Потом тоже самое для 7зеленый.bmp, 8оранжевый.bmp, 8зеленый.bmp.


//Может попробовать поиск по сумме черных пикселей в области?  только как узнать их  количество в символе?
//Или может както можно задать поиск просто по символу?

KEYPRESS(116)                 //f5 (обновление страници)    не срабатывает.


В итоге: когда цифра одна - выполняет.
А вот если цифр много..  приходится включать ручной режим )
Ковыряюсь 2 день.  Перечитываю пока справку. может чтото подходящее найдется.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как обьеденить циклы?
« Reply #1 on: February 18, 2015, 12:14:24 PM »
Можно и так. Только не хватает GETSCREEN в начале
GETSCREEN (x, y, x1, y1)
WHILE(PXL(x,y) ! Бледный)
      GETSCREEN (x, y, x1, y1)
      WAITMS(RND(100,200))
END_CYC

//или так правильней?  Почти.
//$check = 0
//WHILE($check = 0)
//   GETSCREEN (x, y, x1, y1)
//   IF_PIXEL_IN (x, y, x1, y1, Бледный)
//      $check = 1
//   ELSE
//      WAITMS(RND(100,200))
//   END_IF
//END_CYC


//Ищем 7 оранжевую  А если 7 нет? Будем конца света ждать? Где задержка после наведения? Подсказка не появляется мгновенно.                              
$check = 0                                                               
WHILE($check = 0)
   GETSCREEN (x, y, x1, y1)           //вся полоска
   IF_PICTURE_IN (x, y, x1, y1, "7оранжевый.bmp", -1)                   
      $check = 1
      move($_return1, $_return2)
      END_IF
END_CYC

//Проверяем выделение сегмента с цифрой. Бывает не выделяется и окно не всплывает.
10 миллисекунд это очень мало! Никакое окно нормально не всплывёт если ты будешь наводить/отводить указатель с такой частотой.
getscreen ([$_return1, $_return2, $_return1+10, $_return2+10]Квадратные скобки лишние
WHILE(PXL($_return1,$_return2) ! Фон цифры)
  WAITMS(10)
  move($_return1-10, $_return2)
  WAITMS(10)
  move($_return1+10, $_return2)
  WAITMS(10)    Тоже скобки         
  getscreen ([$_return1, $_return2, $_return1+10, $_return2+10])   тоже скобки
END_CYC

//Ищем первое окно Готовности   Паузы во время поиска и после клика...
$check = 0
WHILE($check = 0)
   getscreen (x, y, x1, y1)
   IF_PIXEL_IN (x, y, x1, y1, Желтый)
         $check = 1
      LCLICK($_return1, $_return2)
   END_IF
END_CYC

//Ищем второе окно GOD   Пауза во время поиска
$check = 0
WHILE($check = 0)
   getscreen (x, y, x1, y1)
   IF_PIXEL_IN (x, y, x1, y1, Синий)
         $check = 1
      WAITMS(RND(10,50))
      MOVE($_return1, $_return2)
      END_IF
END_CYC

//клик для продолжения  Зачем это ожидание? Почему просто не кликнуть?
WHILE(iskeydown(1)=0)
   WAITMS(20)
   LCLICK($_return1, $_return2)
END_CYC

Не учтено, если будет не одна 7оранжевая...

//Потом тоже самое для 7зеленый.bmp, 8оранжевый.bmp, 8зеленый.bmp.
Сделать подпрограмму из всего, что выше. Имя искомого файла передавать в неё. Исправить момент, если цифра не найдена.

//Может попробовать поиск по сумме черных пикселей в области? 
Попробуй. Должно быть проще, не нужно заготавливать картинки и делить цвета фона.
только как узнать их  количество в символе?
Подсчитать скриптом. Тем же что и будешь потом сравнивать.

//Или может както можно задать поиск просто по символу? Нет

KEYPRESS(116)                 //f5 (обновление страници)    не срабатывает.
Где  в примере KEYPRESS(116) ? На каком это этапе?
Не срабатывает, потому что фокус не на окне браузера, а наверно на флеше. Оно и руками не будет срабатывать.
Фокус нужно перевести на основное окно браузера. F5 это его команда.

« Last Edit: February 19, 2015, 10:37:04 AM by Vint »


Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #2 on: February 18, 2015, 06:39:19 PM »
Спасибо за советы. Сейчас буду исправлять.

GETSCREEN в начале не написал, потому, что оно все равно из пустого буфера ничего не должно найти. А после "WHILE(PXL(x,y) ! Бледный)" тоже самое  GETSCREEN (x, y, x1, y1).  Просто первый цикл будет холостой. Кажеться, это не должно влиять на скорость. Или я ошибаюсь?

По поводу поиска,. Не пойму как задать поиск следующей цифры после того как одну нашли и нажали. вставлять такойже цикл только с меньшей областью сканирования? это 10 одинаковых циклов один в одном выходит..  должен быть другой вариант.

В том то и вопрос. Как эти 4  тройных (одинаковых) цикла обьеденить. Точно ведь можно.  У меня не хаватает опыта.

Зачем ожидание? Ну, хочу убедиться, что все работает верно )  Потом перебью клик.

Ага перед ф5, надо навестись на края окна.
 

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #3 on: February 18, 2015, 06:44:50 PM »
А у сумме выходит:     4 раза по 1 циклу из 5 циклов  , 1 из этих 5ти - 10 один в одном.
Кучерявое дерево какоето выходит.

100% есть возможность написать както иначе.

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #4 on: February 18, 2015, 08:11:45 PM »
Как правильно написать "если 132, то выполнять далее" ?

Code: [Select]
$var=132
 IF(($var > 131) & ($var <133))
  GETSCREEN
   $count = PXLCOUNT (x,y, x1, y1, 0)
   $count=$var
  ELSE
 LCLICK(x+5,y+5)
END_CYC

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Как обьеденить циклы?
« Reply #5 on: February 18, 2015, 09:20:05 PM »
Code: (clickermann) [Select]
GETSCREEN
WHILE(PXLCOUNT (x,y, x1, y1, 0) ! 132)
   WAITMS(50)
   GETSCREEN
END_CYC

LCLICK($x+5,$y+5)

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #6 on: February 18, 2015, 09:42:53 PM »
Ага. Благодарю.

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #7 on: February 19, 2015, 02:37:51 AM »
А если задать выполнения поиска цифр в разных ячейках отдельными потоками.
Как задать последовательность выполнения, когда они найдут цифры одновременно? 

Code: [Select]
Thread(7o)                                                  //Ищем 7 оранжевую                               
 $check = 0                                                               
  WHILE($check = 0)
   GETSCREEN (x, y, x1, y1)       
      IF_PICTURE_IN (x, y, x1, y1, "7оранжевый.bmp")                   
        $check = 1
        WAITMS(RND(10,50))
      move($_return1, $_return2)
    END_IF
  END_CYC
End_thread

Thread(7z)                                                  //Ищем 7 зеленую                           
 $check = 0                                                               
  WHILE($check = 0)
   GETSCREEN (x, y, x1, y1)       
      IF_PICTURE_IN (x, y, x1, y1, "7зеленый.bmp")                   
         $check = 1
        WAITMS(RND(10,50))
      move($_return1, $_return2)
   END_IF
 END_CYC
End_thread

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как обьеденить циклы?
« Reply #8 on: February 19, 2015, 06:31:30 AM »
Какие потоки? Брось и даже не смотри. В этой задаче потоки не нужны и даже вредны. Здесь всё последовательно.


Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #9 on: February 19, 2015, 09:41:51 AM »
Так чтож, будет состоять из одних только подпрограмм одинаковых? 

Code: [Select]
             //ищем пиксел области
$check = 0
WHILE($check = 0)
 GETSCREEN (х, y, x1, y1)
   IF_PIXEL_IN (х, y, x1, y1, Бледный)
     $check = 1
    ELSE
   WAITMS(RND(100,200))
  move(100,500)
 END_IF
END_CYC

$x = a
$x1 = b
$x2.1 = c
$x2.2 = d

SUB (sub_1.7o)
  //Ищем 7 оранж

$check = 0                     
WHILE($check = 0)
  GETSCREEN ($x,y, $x1,y1)
    IF_PICTURE_IN ($x,y, $x1,y1, "7or.bmp")
    WAITMS(RND(10,50))
  $check = 1               
    WAITMS(RND(10,50))
    move($_return1, $_return2)   
  END_IF
END_CYC
  WAITMS(RND(10,50))
//Ищем первое окно
$check = 0
WHILE($check = 0)
   getscreen ($x2.1, y, x2.2, y1)
   IF_PIXEL_IN ($x2.1, y, x2.2, y1, Желтый)
       $check = 1
       WAITMS(RND(10,50))
LCLICK($_return1+9, $_return2+9)
   END_IF
END_CYC
  WAITMS(RND(10,50))
//ищем окно 2
$check = 0
WHILE($check = 0)
   getscreen (x, y, $x1, y2)
   IF_PIXEL_IN (x, y, $x1, y2, Синий)
         $check = 1
        WAITMS(RND(10,50))
      MOVE($_return1+9, $_return2+9)
   END_IF
END_CYC
  WAITMS(RND(10,50))
END_SUB

SUB (sub_1.8o)
END_SUB

SUB (sub_1.7z)
END_SUB
SUB (sub_1.8z)
END_SUB

SUB (sub_2.7o)
END_SUB
SUB (sub_2.7o)
END_SUB

Это правильно будет? и подпрограммы будут выполнятся последовательно, и между ними также можно дописывать код?
Подпрограмму можно вставлять в условия цикла?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как обьеденить циклы?
« Reply #10 on: February 19, 2015, 10:32:50 AM »
Так чтож, будет состоять из одних только подпрограмм одинаковых? 
Это правильно будет?
Неправильно. Подпрограммы для того и создаются, чтобы одинаковый код не плодить.


Code: (clickermann) [Select]
SUB(work, $name) //=============================================================
   MOVE($_xmax,0)
   WAITMS(50)
   
   // поиск бледного пикселя вокруг полоски с цифрами, понять, что страница обновилась
   GETSCREEN($x, $y, $x1, $y1)           //вся полоска
   WHILE(PXL($x,$y) ! Бледный)
      GETSCREEN ($x, $y, $x1, $y1)
      WAITMS(200)
   END_CYC
   
   //Ищем цифру
   SCANPICTURE($ARR, $x, $y, $x1, $y1, $name)
   $ARR_NUM = 0
   WHILE ($ARR_NUM < ARRSIZE($ARR))
      $digitX = $ARR[$ARR_NUM]
      $digitY = $ARR[$ARR_NUM+1]
      INC($ARR_NUM,2)
      MOVE($digitX, $digitY)
      WAITMS(100)
     
      //Проверяем выделение сегмента с цифрой. Бывает не выделяется и окно не всплывает.
      GETSCREEN($digitX-5, $digitY-5, $digitX+10, $digitY+10)
      WHILE(PXL($digitX, $digitY) ! Фон цифры)
         move($digitX-10, $digitY)
         WAITMS(100)
         move($digitX+10, $digitY)
         WAITMS(500)
         GETSCREEN($digitX-5, $digitY-5, $digitX+10, $digitY+10)
      END_CYC
     
      //Ищем первое окно Готовности
      $check = 0
      WHILE($check = 0)
         GETSCREEN($x, $y, $x1, $y1)
         IF_PIXEL_IN ($x, $y, $x1, $y1, Желтый)
            $check = 1
            LCLICK($_return1, $_return2)
            WAITMS(250)
         END_IF
         WAITMS(50)
      END_CYC
     
      //Ищем второе окно GOD
      $check = 0
      WHILE($check = 0)
         GETSCREEN($x, $y, $x1, $y1)
         IF_PIXEL_IN ($x, $y, $x1, $y1, Синий)
            $check = 1
            MOVE($_return1, $_return2)
            WAITMS(RND(50,100))
            //клик для продолжения
            LCLICK($_return1, $_return2)
            WAITMS(RND(200,300))
         ELSE
            WAITMS(50)
         END_IF
      END_CYC
   END_CYC
   UNDEFINE($ARR)
END_SUB

//==============================================================================

// А обходить будем так:
work("7оранжевый.bmp")
work("7зеленый.bmp")
work("8оранжевый.bmp")
work("8зеленый.bmp")
« Last Edit: February 19, 2015, 11:05:55 AM by Vint »


Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #11 on: February 19, 2015, 06:48:09 PM »
Ура! Я чувствовал, что можно покороче.
Вы - мастер )  А это код какого языка?

Прокоментируйте пожалуста вот эти сегменты. Ато с трудом вьезжаю.

начало подпрограммы:

Code: [Select]
SUB(work, $name)

Code: [Select]
  SCANPICTURE($ARR, $x, $y, $x1, $y1, $name)
   $ARR_NUM = 0
   WHILE ($ARR_NUM < ARRSIZE($ARR))
      $digitX = $ARR[$ARR_NUM]
      $digitY = $ARR[$ARR_NUM+1]
      INC($ARR_NUM,2)
      MOVE($digitX, $digitY)
      WAITMS(100)

Code: [Select]
work("7оранжевый.bmp")
work("7зеленый.bmp")
work("8оранжевый.bmp")
work("8зеленый.bmp")

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #12 on: February 19, 2015, 08:59:33 PM »
Да вот учу. Очень нравится мне этот кликер. Столько возможностей. И сам процес увлекательеый.
Маленький минус, что в справке очень мало возможных примеров.  Гораздо легче осваивать уже на рабочих схемах при разных условиях.

Иначе, данных для сравнения и вывода взять негде.

вот, во вторм сегменте где открытие цикла..  переменные массива я всеравно не уловил. Пойду снова штурмовать справку.

Terminator

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Как обьеденить циклы?
« Reply #13 on: February 20, 2015, 05:28:28 PM »
Несколько раз прочитал статью Массивы http://crapware.aidf.org/forum/index.php?topic=319.0. Довольно доступно разжеванно )
Вроде не сложно. Дело практики.

Всеравно не могу врубиться:
1. для чего 2рая строка "MOVE($_xmax,0)"
2. почему так оформлен  этот сегмент:
Code: [Select]
   WHILE ($ARR_NUM < ARRSIZE($ARR))      //условие, где от порядкового номера зависит количество точек наведения?
      $digitX = $ARR[$ARR_NUM]
      $digitY = $ARR[$ARR_NUM+1]                  //переменная от следующего порядкового элемента массива? они же на одной оси.
      INC($ARR_NUM,2)                                      //что это значит?

3. последовательность work"x.bmp", work"x1.bmp" играют роль?  допустим, если надо в первую очередь выжимать 8рки (work"x1.bmp"),  просто разделить на отдельные подпрограммы?
Code: [Select]
SUB(work, $name)
END_SUB
work("8оранжевый.bmp")
work("8зеленый.bmp")
SUB(work, $name)
END_SUB
work("7оранжевый.bmp")
work("7зеленый.bmp")

4. как заставить работать с координатами, с начала списка массива?  или наоборот начать считывание координат с конца?  По инфе из статьи, такой скрипт кликает картинки начиная с последней добавленной координаты.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Как обьеденить циклы?
« Reply #14 on: February 20, 2015, 06:05:45 PM »
1. для чего 2рая строка "MOVE($_xmax,0)"

Code: (clickermann) [Select]
MOVE($_xmax,0) // это передвинуть курсор в верхний правый угол монитора, чтобы не мешал анализировать графику.
2. почему так оформлен  этот сегмент:
Code: [Select]
   WHILE ($ARR_NUM < ARRSIZE($ARR))      //условие, где от порядкового номера зависит количество точек наведения?
      $digitX = $ARR[$ARR_NUM]
      $digitY = $ARR[$ARR_NUM+1]                  //переменная от следующего порядкового элемента массива? они же на одной оси.
      INC($ARR_NUM,2)                                      //что это значит?

Code: (clickermann) [Select]
WHILE ($ARR_NUM < ARRSIZE($ARR)) // цикл выполняется пока $ARR_NUM меньше числа размера массива

INC($ARR_NUM,2) // увеличиваем переменную $ARR_NUM на 2

$digitX = $ARR[$ARR_NUM] // присваиваем переменной $digitX значение из массива строка 0
$digitY = $ARR[$ARR_NUM+1] // присваиваем переменной $digitY значение из массива строка 0+1 тоесть 1
и тд. Каждый цикл переменная $ARR_NUM будет больше на 2 и на следующем проходе уже считаются троки 2 и 3 из массива.

3. последовательность work"x.bmp", work"x1.bmp" играют роль?  допустим, если надо в первую очередь выжимать 8рки (work"x1.bmp"),  просто разделить на отдельные подпрограммы?
Code: [Select]
SUB(work, $name)
END_SUB
work("8оранжевый.bmp")
work("8зеленый.bmp")
SUB(work, $name)
END_SUB
work("7оранжевый.bmp")
work("7зеленый.bmp")
Подпрограмма с именем SUB(work, $name) может быть только одна!

4. как заставить работать с координатами, с начала списка массива?  или наоборот начать считывание координат с конца?  По инфе из статьи, такой скрипт кликает картинки начиная с последней добавленной координаты.

Вот поиск всех картинок на экране и последовательное их прокликивание
Массив обрабатывается с начала

Code: (clickermann) [Select]
GETSCREEN
SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, "picture.bmp", -1, 100)

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   LCLICK($X, $Y)   // Клик
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)

Массив обрабатывается с конца
Code: (clickermann) [Select]
GETSCREEN
SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, "picture.bmp", -1, 100)

$ARR_NUM = ARRSIZE($ARR_SCAN)
WHILE ($ARR_NUM > 0)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,-1)
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,-1)
   LCLICK($X, $Y)   // Клик
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)