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

Основной раздел => Общие вопросы => Topic started by: Huligan812 on November 28, 2014, 10:51:05 AM

Title: Принудительный выход из цикла
Post by: Huligan812 on November 28, 2014, 10:51:05 AM
День добрый.
В скрипте есть такой кусок:
Code: [Select]
$time_2 = 0
WHILE($time_2 < 10)
GETSCREEN
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Boi)
Print ("__$Boi")
$time_2 = 10
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Napali)
Print ("__$Napali")
$err_code = 1
$time_2 = 10
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Chasto)
Print ("__$Chasto")
$err_code = 2
$time_2 = 10
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Zanjat)
Print ("__$Zanjat")
$err_code = 3
$time_2 = 10
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $travma)
Print ("__$travma")
$err_code = 4
$time_2 = 10
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Dostatochno)
Print ("__$Dostatochno")
$err_code = 5
$time_2 = 10
END_IF

$time_2 = $time_2 + 1
END_CYC
Print ("вышли из цикла")
Суть была в том, чтобы в течении 5 секунд скрипт искал кнопки/сообщения игры и по итогам - или рестартил бой или делал всякие дествия.
Но из-за того, что в цикле аж целых шесть IF_PICTURE_IN каждый проход цикла длится 3-4 секунды.

Есть ли какая-то команда на принудительный выход из цикла?
Title: Re: Принудительный выход из цикла
Post by: Vint on November 28, 2014, 11:53:52 AM
Для оптимизации вначале вложи условия друг в друга. Первыми поставь у которых вероятность нахождения больше. Тогда при нахождении ты не будешь терять времени совсем.
И ещё, период поиска лучше задавать не в количестве проходов цикла (разные компы и циклы разной длины будут давать разный результат), а опираясь на системное время.
Code: (clickermann) [Select]
$time_2 = $_ms + 5000
WHILE($time_2 > $_ms)
   GETSCREEN
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Boi)
      Print ("__$Boi")
      $time_2 = 0
   ELSE
      IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Napali)
         Print ("__$Napali")
         $err_code = 1
         $time_2 = 0
      ELSE
         IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Chasto)
            Print ("__$Chasto")
            $err_code = 2
            $time_2 = 0
         ELSE
            IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Zanjat)
               Print ("__$Zanjat")
               $err_code = 3
               $time_2 = 0
            ELSE
               IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $travma)
                  Print ("__$travma")
                  $err_code = 4
                  $time_2 = 0
               ELSE
                  IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Dostatochno)
                     Print ("__$Dostatochno")
                     $err_code = 5
                     $time_2 = 0
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
   END_IF
END_CYC
Print ("вышли из цикла")

Кстати, после выхода мы по переменной $time_2 можем понять нашли что нибудь или закончили по времени. Если $time_2 = 0  - то нашли
Title: Re: Принудительный выход из цикла
Post by: Oraven on November 28, 2014, 12:01:06 PM
3-4 секунды эт че то многовато, уменьши картинки до того чтобы поиск занимал миллисекунды и был почти мгновенным. Размер картинок должен быть маленьким 20х20.

Вот такая еще версия кода.
Code: (clickermann) [Select]
$time_2 = $_time_t + 5 // таймер на 5 секунд
WHILE($time_2 > $_time_t)
   GETSCREEN
   IF_PICTURE_IN (INT($_xmax/2), 0, $_xmax, $_ymax, $Boi)
      Print ("__$Boi")
      $time_2 = 0
   ELSE
      IF_PICTURE_IN (INT($_xmax/2), 0, $_xmax, $_ymax, $Napali)
         Print ("__$Napali")
         $err_code = 1
         $time_2 = 0
      ELSE
         IF_PICTURE_IN (INT($_xmax/2), 0, $_xmax, $_ymax, $Chasto)
            Print ("__$Chasto")
            $err_code = 2
            $time_2 = 0
         ELSE
            IF_PICTURE_IN (INT($_xmax/2), 0, $_xmax, $_ymax, $Zanjat)
               Print ("__$Zanjat")
               $err_code = 3
               $time_2 = 0
            ELSE
               IF_PICTURE_IN (INT($_xmax/2), 0, $_xmax, $_ymax, $travma)
                  Print ("__$travma")
                  $err_code = 4
                  $time_2 = 0
               ELSE
                  IF_PICTURE_IN (INT($_xmax/2), 0, $_xmax, $_ymax, $Dostatochno)
                     Print ("__$Dostatochno")
                     $err_code = 5
                     $time_2 = 0
                  ELSE
                     WAITMS(50)
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
   END_IF
END_CYC
Print ("вышли из цикла")

IF($time_2 ! 0)
   LOGWRITE ("Не найдено за 5 сек")
END_IF

INT($_xmax/2) - нужно для возвращения целого числа, потому что при делении оно может быть с остатком.
Title: Re: Принудительный выход из цикла
Post by: Vint on November 28, 2014, 12:19:18 PM
Если время выдерживать не критично, то можно использовать и $_time_t.
Мне на малых значениях ±1 сек. иногда многовато, большой разброс. Точнее -999...+999 мс.
Title: Re: Принудительный выход из цикла
Post by: Huligan812 on December 01, 2014, 11:55:20 AM
Спасибо за помощь
Title: Re: Принудительный выход из цикла
Post by: Begem0t on December 05, 2014, 09:44:49 PM
может такой способ подойдет?         
Code: [Select]
                        $time_2 = 0
WHILE($time_2 < 10)
GETSCREEN
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Boi)
Print ("__$Boi")
$time_2 = 10
                                        goto(1)//если условие совпало то выход из цикла
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Napali)
Print ("__$Napali")
$err_code = 1
$time_2 = 10
                                        goto(1)//если условие совпало то выход из цикла
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Chasto)
Print ("__$Chasto")
$err_code = 2
$time_2 = 10
                                        goto(1)//если условие совпало то выход из цикла
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Zanjat)
Print ("__$Zanjat")
$err_code = 3
$time_2 = 10
                                        goto(1)//если условие совпало то выход из цикла
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $travma)
Print ("__$travma")
$err_code = 4
$time_2 = 10
                                        goto(1)//если условие совпало то выход из цикла
END_IF
IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Dostatochno)
Print ("__$Dostatochno")
$err_code = 5
$time_2 = 10
                                        goto(1)//если условие совпало то выход из цикла
END_IF

$time_2 = $time_2 + 1
END_CYC
1://переход сюда если одно из  условий выполнено
Print ("вышли из цикла")
Title: Re: Принудительный выход из цикла
Post by: Huligan812 on December 08, 2014, 10:33:12 AM
может такой способ подойдет?
Не люблю я костыли из GOTO. Нас препод по Basic'у далеком 92м по рукам за это бил. Стараюсь использовать очень редко
Title: Re: Принудительный выход из цикла
Post by: quant13 on December 08, 2014, 02:05:57 PM
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Title: Re: Принудительный выход из цикла
Post by: Vint on December 08, 2014, 02:07:30 PM
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Никто не спорит. Только где полезность в примере "Begem0t"?  Тем более выпрыгнул из цикла.
Title: Re: Принудительный выход из цикла
Post by: quant13 on December 08, 2014, 02:24:13 PM
2Begem0t
Code: (Clickermann) [Select]
$time_2 = 0
WHILE($time_2 < 10)
   GETSCREEN
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Boi)
      $var=1
      $time_2 = 10
   END_IF
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Napali)
      $var=2
      $time_2 = 10
   END_IF
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Chasto)
      $var=3
      $time_2 = 10
   END_IF
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Zanjat)
      $var=4
      $time_2 = 10
   END_IF
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $travma)
      $var=5
      $time_2 = 10
   END_IF
   IF_PICTURE_IN ($_xmax/2, 0, $_xmax, $_ymax, $Dostatochno)
      $var=6
      $time_2 = 10
   END_IF
   $time_2 = $time_2 + 1
END_CYC

switch($var)
case(1)
  Print ("__$Boi")
case(2)
  Print ("__$Napali")
  $err_code = 1
case(3)
  Print ("__$Chasto")
  $err_code = 2
case(4)
  Print ("__$Zanjat")
  $err_code = 3
case(5)
  Print ("__$travma")
  $err_code = 4
case(6)
  Print ("__$Dostatochno")
  $err_code = 5
default
  print("smth else")
  print("$var = ", $var) 
end_switch

Из цикла твой скрипт выйдет в любом случае, зато в конструкции SWITCH (переключатель) ты можешь делать  с полученным результатом что тебе угодно.
Title: Re: Принудительный выход из цикла
Post by: Huligan812 on December 08, 2014, 02:32:37 PM
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Я не GOTO-фоб, я его использую. Но стараюсь использовать его там, где больше уже ничего "не помогает"


Из цикла твой скрипт выйдет в любом случае, зато в конструкции SWITCH (переключатель) ты можешь делать  с полученным результатом что тебе угодно.
Все супер, только этом варианте скрипт будет все 6 картинок, даже если найдет первую, а в варианте Oraven'a как только нашел первую - вышел из цикла