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

Основной раздел => Использование => Topic started by: Cryolama on May 03, 2017, 01:52:27 PM

Title: Вопрос по зацикливанию скрипта по условиям.
Post by: Cryolama on May 03, 2017, 01:52:27 PM
Я не особо соображаю, так что не ругайтесь на меня. Суть вопроса такая.
1. Изначально есть определенный пиксель зеленого цвета. И скрипт при виде этого пикселя (зеленый) выполняет команду, выставляя значение 1 в поле и жмет enter, это действие циклично и бесконечно повторяется с WAITMS, в случае если нет изменений.
2. Если пиксель стал красным, то он выставляет значение 3 и жмет enter.

И тут у меня камень преткновения. Как сделать так, чтобы в случае повтора красного он выставил 9, а потом если повторится 30, и если будет снова красный - запустил скрипт с самого начала.

При этом если серия красных пикселей прерывается - так же возвращался на исходную и запускал скрипт с самого начала.

Спасибо если поясните хотя бы основные принципы.
Title: Re: Вопрос по зацикливанию скрипта по условиям.
Post by: Атеист on May 04, 2017, 12:22:45 AM
Примерно так должно быть. Проверяйте на своих координатах. И коды красного и зеленого цветов свои поставьте.
Должно работать (я не проверял).

Code: (clickermann) [Select]
WAITMS(500) // дабы успеть отпрянуть от компа, чтобы не мешать скрипту работать :)

WHILE(1) // бесконечный цикл
   
   GETSCREEN
   WHILE(PXL(10,10) ! 65280) // проверяем появление зеленого пикселя в координатах (10,10), с частотой 50ms
      WAITMS(50)
      GETSCREEN
   END_CYC
   
   LOGWRITE ("Появился зеленый пиксель")
   
   WHILE(PXL(10,10) = 65280) // выполняем действие "1", пока не погаснет зеленый пиксель
      LOGWRITE ("Значение: 1")
      // Ваше действие 1
      WAITMS(500)
      GETSCREEN
   END_CYC
   
   LOGWRITE ("Пиксель больше не зеленый. Уж не красный ли?)") // иначе - в начало сценария
   
   WHILE( (PXL(10,10) = 255) & ($red < 4) ) // выполняем действие 2, 3 и 4, поочередно, если пиксель красный, всего - не более 3 действий
     
      INC($red) // наращиваем переменную-счетчик (на единицу за проход)
     
      SWITCH($red) // выбираем действие в зависимости от значения сетчика
      CASE(1)
         LOGWRITE ("Значение: 3")
         // Ваше действие 2
         WAITMS(500) // персональная задержка после действия 2
         GETSCREEN
      CASE(2)
         LOGWRITE ("Значение: 9")
         // Ваше действие 3
         WAITMS(RND(350,555)) // персональная (рандомная) задержка после действия 3
         GETSCREEN
      CASE(3)
         LOGWRITE ("Значение: 30")
         // Ваше действие 4 (последнее из возможных)
         // четвертого варианта, для красного пикселя, не дано; теперь все действия выполнены...
         UNDEFINE($red) // очищаем переменную, для последующего использования
         // выходим из цикла по условию ($red < 4) и возвращаемся в начало сценария
      DEFAULT
      END_SWITCH
     
   END_CYC
   
END_CYC
Title: Re: Вопрос по зацикливанию скрипта по условиям.
Post by: Vint on May 04, 2017, 08:34:31 AM
Зачем вы все постоянно пишите DEFAULT? Это не обязательная часть, как ELSE в условии.
Title: Re: Вопрос по зацикливанию скрипта по условиям.
Post by: Cryolama on May 04, 2017, 09:08:35 AM
Не забываем, что я лошара и скрипты никогда не писал.

Это мое творчество вполне себе работает, теперь буду переписывать как посоветовали. И есть один нюанс.
Как сделать так, чтобы после 4-5-6 и последующих красных пикселях подряд, он выставлял только "1" до того момента, пока снова не встретится зеленый пиксель и вновь запускал скрипт с самого начала?

Code: [Select]
skip:
WAIT(1)
GETSCREEN(673,684, 696,694)// вариант №1

IF(PXL(682,690) = 7831869) // пошло по сценарию

   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)// дважды чтобы не париться с двухзначным числом
   WAITMS(5)
   KEYSTRING("1") // вписал
   WAITMS(5)
   KEYPRESS(#SPACE) // исполнение команды
   WAIT(1)
   GOTO(skip) // успешно, значит начинаем сначала
   
   
ELSE  // пошло не по сценарию

   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   KEYSTRING("3") // вписал
   KEYPRESS(#SPACE) // исполнение команды
   SOUND("play.wav") // уведомил, что пошло не так
END_IF

WAIT(5)
GETSCREEN(673,684, 696,694)// вариант №2

IF(PXL(682,690) = 7831869) // пошло по сценарию

   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   KEYSTRING("1") // вписал
   KEYPRESS(#SPACE) // исполнение команды
   WAITMS(100)
   GOTO(skip) // успешно, значит начинаем сначала
   
   
ELSE  // пошло не по сценарию

   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   KEYSTRING("9") // вписал
   KEYPRESS(#SPACE) // исполнение команды
END_IF

WAIT(1)

GETSCREEN(673,684, 696,694)// вариант №2

IF(PXL(682,690) = 7831869) // пошло по сценарию

   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   KEYSTRING("1") // вписал
   KEYPRESS(#SPACE) // исполнение команды
   WAITMS(100)
   GOTO(skip) // успешно, значит начинаем сначала
   
   
ELSE  // пошло не по сценарию

   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   KEYSTRING("30") // вписал
   KEYPRESS(#SPACE) // исполнение команды
END_IF 

WAIT(1) // ну и 4 варианта не дано, пошли по новой
Title: Re: Вопрос по зацикливанию скрипта по условиям.
Post by: Атеист on May 04, 2017, 12:24:54 PM
Зачем вы все постоянно пишите DEFAULT? Это не обязательная часть, как ELSE в условии.

Спасибо за подсказку, я не знал, что можно писать без DEFAULT. В Справке, про DEFAULT в SWITCH упоминается только это..
Code: (clickermann) [Select]
Часть default (по умолчанию) используется для всех остальных неописанных случаев. Она должа быть описана последней.
Вообще, я ожидал, что полетят тапки... вот только в другое место. :)  В строке 22 моей писанины, было бы уместнее использовать цикл FOR, вместо WHILE и изавиться от INC($red) в строке 24 и от UNDEFINE($red) в строке 41. Но думаю так даже лучше - из обсуждения криво написанного скрипта можно узнать больше интересных вариантов, чем из почти идеального готового решения, тоторых здесь много и которые как бэ даже не обсуждаются.

Теперь, что касается самого SWITCH'а - главная беда в том, что в этом сценарии, он вообще ненужен (как с DEFAULT, так и без него). Тут же не условие, а тупой безусловный перебор значений массива. Тяжкий грех, каюсь.  :-[
Короче, как обычно, поторопился я, зато хоть что-то успел написать. :)
Title: Re: Вопрос по зацикливанию скрипта по условиям.
Post by: Атеист on May 04, 2017, 03:04:30 PM
Как сделать так, чтобы после 4-5-6 и последующих красных пикселях подряд, он выставлял только "1" до того

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

Пробуйте так, со своими значениями цвета и координат (написал как понял задачу, не проверял, нет времени). Результаты см. в логе.
Code: (clickermann) [Select]
WAITMS(500)
STRSEPARATE("3:9:30", ":", $arr)
GETSCREEN
WHILE(1)
   FOR($n = 0, ($n < 3) & (PXL(10,10) = 255) ) // только 3 действия и только когда горит красный
      LOGWRITE ($arr[$n])
      // Ваше действие, в зависимости от значения переменной-сетчика $arr[$n]
      WAITMS(500)
      GETSCREEN
   END_CYC
   LOGWRITE ("1") // всегда, когда нет красного
   // Ваше действие по умолчанию
   WAITMS(500)
   GETSCREEN
END_CYC
Title: Re: Вопрос по зацикливанию скрипта по условиям.
Post by: Cryolama on May 05, 2017, 01:21:04 AM
Короче говоря, вроде разобрался, работает очень хорошо. Задержки обусловлены скоростью загрузки пикселей, значения так же поменял подстраиваясь под условия задачи. Все чётенько, работает. Для меня это самое главное. Спасибо большое за помощь!

Code: (clickermann) [Select]
WAIT(1)
STRSEPARATE("1:3:10", ":", $arr)
GETSCREEN(673,684, 696,694)
WHILE(1)
   FOR($n = 0, ($n < 3) & (PXL(682,690) = 6440571) ) // только 3 действия и только когда горит красный
   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   WAIT(1)
   KEYSTRING($arr[$n]) // вписал
   KEYPRESS(#SPACE)   // выполнение
LOGWRITE($arr[$n])
      // Ваше действие, в зависимости от значения переменной-сетчика $arr[$n]
      WAIT(1)
      GETSCREEN(673,684, 696,694)
   END_CYC
   LOGWRITE ("1") // всегда, когда нет красного
   KEYPRESS(#BACKSPACE)
   KEYPRESS(#BACKSPACE)
   WAIT(2)
   KEYSTRING("1") // вписал
   KEYPRESS(#SPACE)// выполнение
   WAIT(1)
   GETSCREEN
END_CYC