Author Topic: Принудительный выход из цикла  (Read 5695 times)

0 Members and 1 Guest are viewing this topic.

Huligan812

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Принудительный выход из цикла
« 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 секунды.

Есть ли какая-то команда на принудительный выход из цикла?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Принудительный выход из цикла
« Reply #1 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  - то нашли
« Last Edit: November 28, 2014, 12:16:38 PM by Vint »


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Принудительный выход из цикла
« Reply #2 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) - нужно для возвращения целого числа, потому что при делении оно может быть с остатком.
« Last Edit: November 28, 2014, 12:07:19 PM by Oraven »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Принудительный выход из цикла
« Reply #3 on: November 28, 2014, 12:19:18 PM »
Если время выдерживать не критично, то можно использовать и $_time_t.
Мне на малых значениях ±1 сек. иногда многовато, большой разброс. Точнее -999...+999 мс.


Huligan812

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Принудительный выход из цикла
« Reply #4 on: December 01, 2014, 11:55:20 AM »
Спасибо за помощь

Begem0t

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Re: Принудительный выход из цикла
« Reply #5 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 ("вышли из цикла")

Huligan812

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Принудительный выход из цикла
« Reply #6 on: December 08, 2014, 10:33:12 AM »
может такой способ подойдет?
Не люблю я костыли из GOTO. Нас препод по Basic'у далеком 92м по рукам за это бил. Стараюсь использовать очень редко

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Принудительный выход из цикла
« Reply #7 on: December 08, 2014, 02:05:57 PM »
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Принудительный выход из цикла
« Reply #8 on: December 08, 2014, 02:07:30 PM »
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Никто не спорит. Только где полезность в примере "Begem0t"?  Тем более выпрыгнул из цикла.


quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Принудительный выход из цикла
« Reply #9 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 (переключатель) ты можешь делать  с полученным результатом что тебе угодно.

Huligan812

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Принудительный выход из цикла
« Reply #10 on: December 08, 2014, 02:32:37 PM »
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Я не GOTO-фоб, я его использую. Но стараюсь использовать его там, где больше уже ничего "не помогает"


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