Author Topic: Нагромождение условий  (Read 2514 times)

0 Members and 4 Guests are viewing this topic.

Анклав

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Нагромождение условий
« on: April 17, 2015, 06:18:22 AM »
Я по образованию гуманитарий, поэтому извините, если пишу слишком глупые вещи.

В общем, у меня получилось нагромождение условий друг на друга.

Изначально задача следующая - посмотреть на область экрана. В этой области на заданных позициях должны быть пикселы. Пикселы должны появляться в строгом порядке (от 1 до 10).

Смотрим на точку 1, если на ней нет пиксела, то делаем так, чтобы он появился. Как только он появился, смотрим на точку 2, есть ли там пиксел...


Очень важно то, что, как только на точке появился пиксель, то про эту точку можно вообще забыть до следующего запуска THREAD.

Вот что у меня получилось(код в спойлере):
Code: [Select]
THREAD(test, 0)

:odin
IF(PXL(1051,695) = 8355839)
   wait(1)
   LOGWRITE ("odin - OK")
   WAIT(1)
   goto(dva)
   
   :dva
   IF(PXL(1117,692) = 8355839)
      wait(1)
      LOGWRITE ("dva - OK")
      WAIT(1)
      goto(tri)
     
      :tri
      IF(PXL(1165,693) = 8355839)
         wait(1)
         LOGWRITE ("tri - OK")
         WAIT(1)
         goto(chetire)
         
         :chetire
         IF(PXL(1082,717) = 8388479)
            wait(1)
            LOGWRITE ("chetire - OK")
            WAIT(1)
            goto(pyat)
           
            :pyat
            IF(PXL(1137,737) = 16744447)
               wait(1)
               LOGWRITE ("pyat - OK")
               WAIT(1)
               
               halt     // для примера решил остановиться здесь
               
               
            ELSE
               LOGWRITE ("pyat - NE OK")
               WAIT(1)
               KEYPRESS(#L)
               WAIT(1)
               LCLICK(1302,96)
               WAIT(1)
               KEYDOWN(#S)
               WAIT(1)
               DBLCLICK(1344,402)
               DBLCLICK(1344,402)
               DBLCLICK(1344,402)
               WAIT(1)
               KEYUP(#S)
               WAIT(1)
               KEYPRESS(#L)
               WAIT(11)
               goto(pyat)
               
            END_IF
           
         ELSE
            LOGWRITE ("chetire - NE OK")
            WAIT(1)
            KEYPRESS(#L)
            WAIT(1)
            LCLICK(1302,96)
            WAIT(1)
            KEYDOWN(#S)
            WAIT(1)
            DBLCLICK(1185,425)
            DBLCLICK(1185,425)
            DBLCLICK(1185,425)
            WAIT(1)
            KEYUP(#S)
            WAIT(1)
            KEYPRESS(#L)
            WAIT(11)
            goto(chetire)
           
         END_IF
         
      ELSE
         LOGWRITE ("tri - NE OK")
         WAIT(1)
         KEYPRESS(#L)
         WAIT(1)
         LCLICK(1302,96)
         WAIT(1)
         KEYDOWN(#S)
         WAIT(1)
         DBLCLICK(1143,374)
         DBLCLICK(1143,374)
         DBLCLICK(1143,374)
         WAIT(1)
         KEYUP(#S)
         WAIT(1)
         KEYPRESS(#L)
         WAIT(11)
         goto(tri)
         
      END_IF
     
   ELSE
      LOGWRITE ("dva - NE OK")
      WAIT(1)
      KEYPRESS(#L)
      WAIT(1)
      LCLICK(1183,100)
      WAIT(1)
      KEYDOWN(#S)
      WAIT(1)
      DBLCLICK(1274,237)
      DBLCLICK(1274,237)
      DBLCLICK(1274,237)
      WAIT(1)
      KEYUP(#S)
      WAIT(1)
      KEYPRESS(#L)
      WAIT(11)
      goto(dva)
     
   END_IF
   
   
ELSE
   LOGWRITE ("odin - NE OK")
   WAIT(1)
   KEYPRESS(#L)
   WAIT(1)
   LCLICK(1183,100)
   WAIT(1)
   KEYDOWN(#S)
   WAIT(1)
   DBLCLICK(1270,205)
   DBLCLICK(1270,205)
   DBLCLICK(1270,205)
   WAIT(1)
   KEYUP(#S)
   WAIT(1)
   KEYPRESS(#L)
   WAIT(11)
   goto(odin)
   
END_IF


END_THREAD

Это укороченный вариант. На самом деле там не 5, а 10 условий.  В принципе, это работает, НО работает криво.

Нужно, чтобы работа была так:

1. Проверка точки 1
1.1. Проверка удачная -> идем к точке 2
1.2. Проверка неудачная -> выполняем "определенные действия" и делаем по новой проверку точки 1. Количество "определенных действий" заранее неизвестно, может хватить 1 раза, может не хватить 100 раз.
 2. Проверка точки 2
1.2 Проверка удачная ->идём к точке 3
...
и т.д.


А как это на самом деле:

[spoiler]Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная


Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная


Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная


Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная


Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная


Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 удачная
Проверка точки 8 НЕ удачная[/spoiler]


То есть программа каждый раз начинает проверять ВСЕ точки, хотя в этом нет никакого смысла. Их статус до перезапуска THREAD не изменится. Как только условие в точке выполнилось, про эту точку нужно забыть и перейти к следующей.


Проблема не в том, что в программе много текста. Проблема не в том, что в логах идёт спам.
Проблема в том, что системные ресурсы тратятся бесполезно, нагружается процессор. Ведь я вам показал только один из потоков скрипта.


Спасибо!
« Last Edit: April 17, 2015, 06:23:08 AM by Анклав »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Нагромождение условий
« Reply #1 on: April 17, 2015, 08:12:39 AM »
можно использовать подпрограммы. канечно у тебя куча пораметров, да и черт с ними. но если есть какаято закономерность в координатах lclick и dblclick то можно убрать эти пораметры в вызове.

Code: (clickermann) [Select]
SUB(pix, $pxl_x, $pxl_y, $pxl_c, $lc_x, $lc_y, $dblc_x, $dblc_y, $n)
   GETSCREEN
   WHILE(PXL($pxl_x,$pxl_y) ! $pxl_c)
      LOGWRITE ($n, " - NE OK")
      WAIT(1)
      KEYPRESS(#L)
      WAIT(1)
      LCLICK($lc_x,$lc_y)
      WAIT(1)
      KEYDOWN(#S)
      WAIT(1)
      DBLCLICK($dblc_x,$dblc_y)
      DBLCLICK($dblc_x,$dblc_y)
      DBLCLICK($dblc_x,$dblc_y)
      WAIT(1)
      KEYUP(#S)
      WAIT(1)
      KEYPRESS(#L)
      WAIT(11)
      GETSCREEN
   END_CYC
   wait(1)
   LOGWRITE ($n," - OK")
   WAIT(1)
END_SUB

//______________________________________________

pix(1051,695,8355839,1183,100,1270,205,1)
pix(1117,692,8355839,1183,100,1270,205,2)
pix(1165,693,8355839,1302,96,1143,374,3)
pix(1082,717,8388479,1302,96,1185,425,4)
pix(1137,737,16744447,1302,96,1344,402,5)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Нагромождение условий
« Reply #2 on: April 17, 2015, 08:23:33 AM »
Начнем с того что метки так не пишутся :odin а пишутся так odin:
Таким образом твои гото у тебя вообще не работали.

Но правильнее использовать в твоем случаи, циклы WHILE
Вот верный вариант.
Code: (clickermann) [Select]
THREAD(test, 0)
   
   $check1 = 0
   WHILE($check1 = 0)
      GETSCREEN
      IF(PXL(1051,695) = 8355839)
         $check1 = 1
         LOGWRITE ("1 - OK")
      ELSE
         LOGWRITE ("1 - NE OK")
         KEYPRESS(#L)
         WAIT(1)
         LCLICK(1183,100)
         WAIT(1)
         KEYDOWN(#S)
         WAIT(1)
         DBLCLICK(1270,205)
         DBLCLICK(1270,205)
         DBLCLICK(1270,205)
         WAIT(1)
         KEYUP(#S)
         WAIT(1)
         KEYPRESS(#L)
         WAIT(11)
      END_IF
   END_CYC
   
   $check2 = 0
   WHILE($check2 = 0)
      GETSCREEN
      IF(PXL(1117,692) = 8355839)
         $check2 = 1
         LOGWRITE ("2 - OK")
      ELSE
         LOGWRITE ("2 - NE OK")
         KEYPRESS(#L)
         WAIT(1)
         LCLICK(1183,100)
         WAIT(1)
         KEYDOWN(#S)
         WAIT(1)
         DBLCLICK(1274,237)
         DBLCLICK(1274,237)
         DBLCLICK(1274,237)
         WAIT(1)
         KEYUP(#S)
         WAIT(1)
         KEYPRESS(#L)
         WAIT(11)
      END_IF
   END_CYC
   
   $check3 = 0
   WHILE($check3 = 0)
      GETSCREEN
      IF(PXL(1165,693) = 8355839)
         $check3 = 1
         LOGWRITE ("3 - OK")
      ELSE
         LOGWRITE ("3 - NE OK")
         KEYPRESS(#L)
         WAIT(1)
         LCLICK(1302,96)
         WAIT(1)
         KEYDOWN(#S)
         WAIT(1)
         DBLCLICK(1143,374)
         DBLCLICK(1143,374)
         DBLCLICK(1143,374)
         WAIT(1)
         KEYUP(#S)
         WAIT(1)
         KEYPRESS(#L)
         WAIT(11)
      END_IF
   END_CYC
   
   $check4 = 0
   WHILE($check4 = 0)
      GETSCREEN
      IF(PXL(1082,717) = 8388479)
         $check4 = 1
         LOGWRITE ("4 - OK")
      ELSE
         LOGWRITE ("4 - NE OK")
         KEYPRESS(#L)
         WAIT(1)
         LCLICK(1302,96)
         WAIT(1)
         KEYDOWN(#S)
         WAIT(1)
         DBLCLICK(1185,425)
         DBLCLICK(1185,425)
         DBLCLICK(1185,425)
         WAIT(1)
         KEYUP(#S)
         WAIT(1)
         KEYPRESS(#L)
         WAIT(11)
      END_IF
   END_CYC
   
   $check5 = 0
   WHILE($check5 = 0)
      GETSCREEN
      IF(PXL(1137,737) = 16744447)
         $check5 = 1
         LOGWRITE ("5 - OK")
         halt     // для примера решил остановиться здесь
      ELSE
         LOGWRITE ("5 - NE OK")
         KEYPRESS(#L)
         WAIT(1)
         LCLICK(1302,96)
         WAIT(1)
         KEYDOWN(#S)
         WAIT(1)
         DBLCLICK(1344,402)
         DBLCLICK(1344,402)
         DBLCLICK(1344,402)
         WAIT(1)
         KEYUP(#S)
         WAIT(1)
         KEYPRESS(#L)
         WAIT(11)
      END_IF
   END_CYC
   
END_THREAD

А вот оптимизированный вариант с использованием подпрограммы.
Code: (clickermann) [Select]
THREAD(test, 0)
   
   SUB(CHECK1, $log, $pixl1,$pixl2, $color,  $clk1,$clk2, $dbclk1,$dbclk2) // подпрограмма
      $check1 = 0
      WHILE($check1 = 0)
         GETSCREEN
         IF(PXL($pixl1,$pixl2) = $color)
            $check1 = 1
            LOGWRITE ($log," - OK")
         ELSE
            LOGWRITE ($log," - NE OK")
            KEYPRESS(#L)
            WAIT(1)
            LCLICK($clk1,$clk2)
            WAIT(1)
            KEYDOWN(#S)
            WAIT(1)
            DBLCLICK($dbclk1,$dbclk2)
            DBLCLICK($dbclk1,$dbclk2)
            DBLCLICK($dbclk1,$dbclk2)
            WAIT(1)
            KEYUP(#S)
            WAIT(1)
            KEYPRESS(#L)
            WAIT(11)
         END_IF
      END_CYC
   END_SUB
   
   // в подпрограмму передаются параметры: Номер, координата анализа, цвет, координаты клика и даблклика
   CHECK1(1, 1051,695, 8355839, 1183,100, 1270,205)
   CHECK1(2, 1117,692, 8355839, 1183,100, 1274,237)
   CHECK1(3, 1165,693, 8355839, 1302,96, 1143,374)
   CHECK1(4, 1082,717, 8388479, 1302,96, 1185,425)
   CHECK1(5, 1137,737, 16744447, 1302,96, 1344,402)
   halt     // для примера решил остановиться здесь
   
END_THREAD

Как видишь все просто, и дописать еще 5 вариантов не составит труда.
« Last Edit: April 17, 2015, 08:28:22 AM by Oraven »

Анклав

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Нагромождение условий
« Reply #3 on: April 19, 2015, 03:59:37 PM »
Огромное спасибо, ребята! Именно это мне и нужно было, только я не знал, чего именно хочу!  :)
 
Прочитал давно, а потестил только сегодня. В оптимизированном варианте всё просто супер, всё ок, за исключением того, что теперь, если в предыдущем раунде бот остановился на 5, то сейчас с 5 начинает...

Т.е. он не обнуляет свою память почему-то.

p.s. новый раунд у меня в коде прописывается как-то так
Code: [Select]
...
 SETTHREAD (test, 0)
...
 SETTHREAD (test, 1)
« Last Edit: April 19, 2015, 04:01:46 PM by Анклав »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Нагромождение условий
« Reply #4 on: April 19, 2015, 05:17:48 PM »
Т.е. он не обнуляет свою память почему-то.
Ничего удивительного, SETTHREAD может либо запустить поток, либо поставить его на паузу.
Так ли необходимы тебе потоки? Как всегда стоит появиться новой функции и её начинают использовать не целенаправленно.

Анклав

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Нагромождение условий
« Reply #5 on: April 19, 2015, 05:42:40 PM »
Т.е. он не обнуляет свою память почему-то.
Ничего удивительного, SETTHREAD может либо запустить поток, либо поставить его на паузу.
Так ли необходимы тебе потоки? Как всегда стоит появиться новой функции и её начинают использовать не целенаправленно.
У меня была такая задача, чтобы разделить программу на несколько независимых частей, чтобы менеджер управлял ими по ситуации. Я подумал, что SETTHREAD идеально для этого подходит, т.к. им просто выключать и выключать все части в любой комбинации. В целом всё хорошо, за исключением этого небольшого момента с паузой.
 
Я его обошёл так, что написал bat файл, в котором поочереди нажимаются alt+s, alt+a, это помогло, но мое стремление к перфекционизму намекает мне, что это костыль.  :)