Author Topic: Вопрос по зацикливанию скрипта по условиям.  (Read 4495 times)

0 Members and 2 Guests are viewing this topic.

Cryolama

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Я не особо соображаю, так что не ругайтесь на меня. Суть вопроса такая.
1. Изначально есть определенный пиксель зеленого цвета. И скрипт при виде этого пикселя (зеленый) выполняет команду, выставляя значение 1 в поле и жмет enter, это действие циклично и бесконечно повторяется с WAITMS, в случае если нет изменений.
2. Если пиксель стал красным, то он выставляет значение 3 и жмет enter.

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

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

Спасибо если поясните хотя бы основные принципы.

Атеист

  • Guest
Примерно так должно быть. Проверяйте на своих координатах. И коды красного и зеленого цветов свои поставьте.
Должно работать (я не проверял).

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Зачем вы все постоянно пишите DEFAULT? Это не обязательная часть, как ELSE в условии.


Cryolama

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Не забываем, что я лошара и скрипты никогда не писал.

Это мое творчество вполне себе работает, теперь буду переписывать как посоветовали. И есть один нюанс.
Как сделать так, чтобы после 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 варианта не дано, пошли по новой

Атеист

  • Guest
Зачем вы все постоянно пишите DEFAULT? Это не обязательная часть, как ELSE в условии.

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

Теперь, что касается самого SWITCH'а - главная беда в том, что в этом сценарии, он вообще ненужен (как с DEFAULT, так и без него). Тут же не условие, а тупой безусловный перебор значений массива. Тяжкий грех, каюсь.  :-[
Короче, как обычно, поторопился я, зато хоть что-то успел написать. :)

Атеист

  • Guest
Как сделать так, чтобы после 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
« Last Edit: May 04, 2017, 05:37:18 PM by Атеист »

Cryolama

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Короче говоря, вроде разобрался, работает очень хорошо. Задержки обусловлены скоростью загрузки пикселей, значения так же поменял подстраиваясь под условия задачи. Все чётенько, работает. Для меня это самое главное. Спасибо большое за помощь!

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