Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Huligan812 on November 28, 2014, 10:51:05 AM
-
День добрый.
В скрипте есть такой кусок:
$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 секунды.
Есть ли какая-то команда на принудительный выход из цикла?
-
Для оптимизации вначале вложи условия друг в друга. Первыми поставь у которых вероятность нахождения больше. Тогда при нахождении ты не будешь терять времени совсем.
И ещё, период поиска лучше задавать не в количестве проходов цикла (разные компы и циклы разной длины будут давать разный результат), а опираясь на системное время.
$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 - то нашли
-
3-4 секунды эт че то многовато, уменьши картинки до того чтобы поиск занимал миллисекунды и был почти мгновенным. Размер картинок должен быть маленьким 20х20.
Вот такая еще версия кода.
$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) - нужно для возвращения целого числа, потому что при делении оно может быть с остатком.
-
Если время выдерживать не критично, то можно использовать и $_time_t.
Мне на малых значениях ±1 сек. иногда многовато, большой разброс. Точнее -999...+999 мс.
-
Спасибо за помощь
-
может такой способ подойдет?
$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 ("вышли из цикла")
-
может такой способ подойдет?
Не люблю я костыли из GOTO. Нас препод по Basic'у далеком 92м по рукам за это бил. Стараюсь использовать очень редко
-
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
-
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Никто не спорит. Только где полезность в примере "Begem0t"? Тем более выпрыгнул из цикла.
-
2Begem0t
$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 (переключатель) ты можешь делать с полученным результатом что тебе угодно.
-
вот из-за таких преподов выросло поколение GOTO-фобов.
Довольно полезная команда, только пользовать с умом надо
Я не GOTO-фоб, я его использую. Но стараюсь использовать его там, где больше уже ничего "не помогает"
Из цикла твой скрипт выйдет в любом случае, зато в конструкции SWITCH (переключатель) ты можешь делать с полученным результатом что тебе угодно.
Все супер, только этом варианте скрипт будет все 6 картинок, даже если найдет первую, а в варианте Oraven'a как только нашел первую - вышел из цикла