Author Topic: Подскажите что не так.  (Read 3445 times)

0 Members and 3 Guests are viewing this topic.

dalyx

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Подскажите что не так.
« on: January 29, 2017, 10:25:52 AM »
Всем привет. Возникла необходимость в написание кода для игры.
Задачи:
1. Ищем кнопку боя (по скриншоту). Немного Ждем, дабы прогрузиться.
2. Во время боя смотрим наличие, закрывающего крестика (опять по скриншоту). Если есть то просто на него нажимаем.
3. Ждем когда закончится бой. Ведем проверку по наличию кнопки нового боя.
4. Также одновременно, во время боя,  проверяем на наличие выпадения карточек (бонусов, по скриншоту), они появляются по окончании каждого третьего боя. Но так как они появляются раньше чем кнопка нового боя, то и определять мне кажется придется все время. Когда появились, выбираем случайную карту, и жмем крестик.

Код написал, но вот проблемка, думает долго, сбивается и выходит совсем. Сбоев. Потому что когда ведет проверку крестика (закрытия окна), видит крестик основного окна. (

Code: (clickermann) [Select]

FOR($a, $a < 19)

star:
GETSCREEN

WAIT(3)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопка боя.bmp", -1, 100)
    LCLICK($_return1, $_return2)
WAIT(15)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "проверка крестика.bmp", -1, 100)
    LCLICK($_return1, $_return2)   
END_IF
END_IF

//Зашли в бой и ждем кнопки боя
$check = 0
WHILE($check = 0)
WAIT(3)
   GETSCREEN
   
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
   LCLICK($_return1, $_return2)   
END_IF
WAIT(5)   
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "проверка крестика.bmp", -1, 100)
   LCLICK($_return1, $_return2)   
 END_IF
WAIT(5)   
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопка боя.bmp", -1, 100)
WAIT(10)
GOTO(star)
   ELSE
      WAITMS(30)
   END_IF
END_CYC

END_CYC



Badimboy

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: Подскажите что не так.
« Reply #1 on: January 29, 2017, 10:35:39 AM »
Попробуй ограничить область поиска, тоесть искать не по всему экрану. Тогда крестик основного окна будет вне области, да и работать будет быстрее.
А по коду тебе лучше Гуру подскажут, но они точно не будут в восторге что ты из цикла по GoTo выскакиваешь  :)
« Last Edit: January 29, 2017, 10:43:13 AM by Badimboy »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Подскажите что не так.
« Reply #2 on: January 29, 2017, 10:45:29 AM »
У цикла FOR нет параметра начального значения, он выполнится 15 раз и перестанет.
снимок надо делать непосредственно перед анализом.
Из циклов выпрыгивать нельзя. Для чего у тебя там переменная $check?

Верный скрипт
Code: (clickermann) [Select]
FOR($a=0, $a < 19)
   
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопка боя.bmp", -1, 100)
      LCLICK($_return1, $_return2)
      WAIT(15)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "проверка крестика.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAITMS(50)
      END_IF
   END_IF
   
   //Зашли в бой и ждем кнопки боя
   $check = 0
   WHILE($check = 0)
      WAIT(3)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAITMS(50)
      END_IF
      WAIT(5)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "проверка крестика.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAITMS(50)
      END_IF
      WAIT(5)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопка боя.bmp", -1, 100)
         WAIT(10)
         $check = 1
      ELSE
         WAITMS(30)
      END_IF
   END_CYC
   
END_CYC

HALT

dalyx

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Подскажите что не так.
« Reply #3 on: January 29, 2017, 12:45:33 PM »
Попробуй ограничить область поиска, тоесть искать не по всему экрану. Тогда крестик основного окна будет вне области, да и работать будет быстрее.
А по коду тебе лучше Гуру подскажут, но они точно не будут в восторге что ты из цикла по GoTo выскакиваешь  :)


Ограничить не получится, так как местоположение "крестика" основного окна совпадает с тем что ищем(


У цикла FOR нет параметра начального значения, он выполнится 15 раз и перестанет.
снимок надо делать непосредственно перед анализом.
Из циклов выпрыгивать нельзя. Для чего у тебя там переменная $check?

Спасибо за правки. Думал, как закончить цикл, придумал только GOTO.
Но, все таки скрипт таке, давал сбои(

С учетом комментариев выхода из цикла, построил другую конструкцию.


Code: (clickermann) [Select]

$timer=$timer+1
LOGWRITE ("Цикл №", $timer)
//=============================================

SUB(pboi)
  //Зашли в бой и ждем кнопки боя
GETSCREEN
          IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100)
             LCLICK($_return1, $_return2)
            END_IF
WAITMS(500)
         
        $check = 0
       WHILE($check = 0)         
     
          GETSCREEN
          IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
             LCLICK($_return1, $_return2)
             WAIT(10)
         
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100)
             LCLICK($_return1, $_return2)
            END_IF
   
          $check = 1
          END_IF
          WAIT(5)
       END_CYC
END_SUB
//=============================================

   
       GETSCREEN
       IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Кнопка боя.bmp", -1, 100)
          LCLICK($_return1, $_return2)
MOVE(10,10)
          LOGWRITE ("Нашли кнопку боя")
       END_IF
WAIT(15)       


IF($timer=3)
pboi()
LOGWRITE ("Проверяем на цикле №", $timer)
END_IF
IF($timer=6)
pboi()
LOGWRITE ("Проверяем на цикле №", $timer)
END_IF
IF($timer=9)
pboi()
LOGWRITE ("Проверяем на цикле №", $timer)
END_IF
IF($timer=12)
pboi()
LOGWRITE ("Проверяем на цикле №", $timer)
END_IF
IF($timer=15)
pboi()
LOGWRITE ("Проверяем на цикле №", $timer)
END_IF       

 
       //ждем кнопки боя
        $boi = 0
       WHILE($boi = 0)
LOGWRITE ("Ждем кнопку боя")
          GETSCREEN
          IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Кнопка боя.bmp", -1, 100)
               $boi = 1
          ELSE
             WAIT(10)
          END_IF    
END_CYC

Скрипт работает, вроде пока без проблем.
Но вопрос касательно конструкции IF. А именно, чтобы SUB, вызывался, только на циклах 3, 6, 9, 12, 15. Есть, что нибудь, чтобы заменить 5 вызовов IF?

P.S. LOGWRITE - это для себя, чтобы видеть на тесте что делает скрипт. Потом удалю их

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Подскажите что не так.
« Reply #4 on: January 29, 2017, 12:53:45 PM »
Code: (clickermann) [Select]
//=============================================

SUB(pboi)
   //Зашли в бой и ждем кнопки боя
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100)
      LCLICK($_return1, $_return2)
   END_IF
   WAITMS(500)
   
   $check = 0
   WHILE($check = 0)
     
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAIT(10)
         
         IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100)
            LCLICK($_return1, $_return2)
         END_IF
         
         $check = 1
      END_IF
      WAIT(5)
   END_CYC
END_SUB
//=============================================

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Кнопка боя.bmp", -1, 100)
   LCLICK($_return1, $_return2)
   MOVE(10,10)
   LOGWRITE ("Нашли кнопку боя")
END_IF
WAIT(15)

INC($timer,1)
LOGWRITE ("Цикл №", $timer)

IF(($timer=3)|($timer=6)|($timer=9)|($timer=12)|($timer=15))
   pboi()
   LOGWRITE ("Проверяем на цикле №", $timer)
END_IF

//ждем кнопки боя
   LOGWRITE ("Ждем кнопку боя")
$boi = 0
WHILE($boi = 0)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Кнопка боя.bmp", -1, 100)
      $boi = 1
   ELSE
      WAITMS(100) // зачем раз в 10 сек когда 100 мс не будут напрягать процессор
   END_IF
END_CYC

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Подскажите что не так.
« Reply #5 on: January 29, 2017, 12:56:39 PM »
вот например это нормально?
Code: (clickermann) [Select]
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAIT(10)

         IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100) // ищем крестик по снимку сделанному до карточки.bmp
            LCLICK($_return1, $_return2)
         END_IF
 
         $check = 1
      END_IF

dalyx

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Подскажите что не так.
« Reply #6 on: January 29, 2017, 01:40:11 PM »
вот например это нормально?
Code: (clickermann) [Select]
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAIT(10)

         IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100) // ищем крестик по снимку сделанному до карточки.bmp
            LCLICK($_return1, $_return2)
         END_IF
 
         $check = 1
      END_IF

Да нормально, скрин сделанный перед карточками один и тот же. Нет необходимости его обновлять.

dalyx

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Подскажите что не так.
« Reply #7 on: January 29, 2017, 01:42:57 PM »
Code: (clickermann) [Select]
//=============================================

SUB(pboi)
   //Зашли в бой и ждем кнопки боя
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100)
      LCLICK($_return1, $_return2)
   END_IF
   WAITMS(500)
   
   $check = 0
   WHILE($check = 0)
     
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "карточки.bmp", -1, 100)
         LCLICK($_return1, $_return2)
         WAIT(10)
         
         IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Проверка крестика.bmp", -1, 100)
            LCLICK($_return1, $_return2)
         END_IF
         
         $check = 1
      END_IF
      WAIT(5)
   END_CYC
END_SUB
//=============================================

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Кнопка боя.bmp", -1, 100)
   LCLICK($_return1, $_return2)
   MOVE(10,10)
   LOGWRITE ("Нашли кнопку боя")
END_IF
WAIT(15)

INC($timer,1)
LOGWRITE ("Цикл №", $timer)

IF(($timer=3)|($timer=6)|($timer=9)|($timer=12)|($timer=15))
   pboi()
   LOGWRITE ("Проверяем на цикле №", $timer)
END_IF

//ждем кнопки боя
   LOGWRITE ("Ждем кнопку боя")
$boi = 0
WHILE($boi = 0)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Кнопка боя.bmp", -1, 100)
      $boi = 1
   ELSE
      WAITMS(100) // зачем раз в 10 сек когда 100 мс не будут напрягать процессор
   END_IF
END_CYC


Вот эту конструкцию и искал
Code: (clickermann) [Select]
IF(($timer=3)|($timer=6)|($timer=9)|($timer=12)|($timer=15))

Но не смог найти, как задать несколько условий в IF  :'(

Теперь все работает, спасибо за помощь/подсказки.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Подскажите что не так.
« Reply #8 on: January 29, 2017, 02:35:41 PM »
Вот эту конструкцию и искал
Code: (clickermann) [Select]
IF(($timer=3)|($timer=6)|($timer=9)|($timer=12)|($timer=15))

Но не смог найти, как задать несколько условий в IF  :'(

Где только вы ищете непонятно, все описано в справке

dalyx

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Подскажите что не так.
« Reply #9 on: January 29, 2017, 02:54:17 PM »
Где только вы ищете непонятно, все описано в справке


Вот не поверишь, именно в справке смотрел, но не по глазам было (