Adomb |
Отправлено: 30 Июля, 2015 - 11:15:08
|
Мастер
Покинул форум
Сообщений всего: 185
Дата рег-ции: Июль 2015
Репутация: 1
|
Допустим так
CODE:
loop:
...
здесь что-нидь исполняется
...
и хоп-
function B()
...
sleep(500);
goto loop;
function B()
{
mb: sendmouse(LEFT, x, y, main); //ткнуть
sleep(500);
if ((1@()==1)||(2@()==1))goto mb2;
else goto mb;
mb2:
}
1@ и 2@, соответственно, ищут картинки.
Ткнули, если картинки не найдены, снова ткнули.
Если найдена хоть одна - как прыгнуть, например, на loop (goto loop), а не на mb2?
Или закончить выполнение функции без goto mb2? Я сначала сделал:
CODE:function B()
{
mb: sendmouse(LEFT, x, y, main); //ткнуть
sleep(500);
if ((1@()==1)||(2@()==1));
else goto mb;
}
чувствовал, что будет ошибка, так и вышло - отсутствует метка goto.(Отредактировано автором: 30 Июля, 2015 - 11:17:09) |
|
|
Adomb |
Отправлено: 30 Июля, 2015 - 12:37:55
|
Мастер
Покинул форум
Сообщений всего: 185
Дата рег-ции: Июль 2015
Репутация: 1
|
Ну в цикле у меня картинки ищутся через "if (функция найти картинку()==1)", и бот ищет картинки круглосуточно, так как события происходят постоянно. Но мысль понятна.
UPD. А, имеется ввиду, что когда зайдёт на функцию B() и в ней картинка по какой-либо причине не появится, бот зациклится и "сломается"
Ясно. Да, очень хорошая идея.
(Добавление)
В главном цикле у меня есть метки, которые останавливают скрипт, если что-то не так пошло.(Отредактировано автором: 30 Июля, 2015 - 12:42:19) |
|
|
Adomb |
Отправлено: 30 Июля, 2015 - 14:58:26
|
Мастер
Покинул форум
Сообщений всего: 185
Дата рег-ции: Июль 2015
Репутация: 1
|
CODE:int a=1;
if (B()==-1) {messagebox ("бла..бла..");goto er;}
B();
er:
function B()
{
int t=gettime();
beep(2500, 1000); // какое-нибудь действие
sleep(500);
mb:
beep(2500, 400); //действие, которое зацикливается, если a не равно 1
sleep(500);
if (a==1)return 1;
if (gettime()-t<4000)goto mb;
return -1;
}
Но, если с таймером, получается он функцию два раза с начала проходит, если условие верно, прежде чем сработает a=1. По писку понятно. Должен же на "if (a==1)return 1; " просто выйти из функции, а выходит только на второй раз. Почему так?
(Добавление)
Хотя таймер не причём, так тоже 2 раза функцию обрабатывает.
CODE:int a=1;
if (B()==-1) {messagebox ("бла..бла..");goto er;}
B();
er:
function B()
{
int t=gettime();
beep(2500, 1000); // какое-нидь действие
sleep(500);
mb:
beep(2500, 400); //действие, которое зацикливается, если a не равно 1
sleep(500);
if (a==1)return 1;
if (a!=1)goto mb;
return -1;
}
(Добавление)
А если добавить переменную
CODE:int a=1;
int b=B(); //добавили переменную
if (B()==-1) {messagebox ("бла..бла..");goto er;}
B();
er:
function B()
{
beep(2500, 1000); // какое-нидь действие
sleep(500);
mb:
beep(2500, 400); //действие, которое зацикливается, если a не равно 1
sleep(500);
if (a==1)return 1;
if (a!=1)goto mb;
return -1;
}
то вообще три раза срабатывает. Я не могу понять. (Отредактировано автором: 30 Июля, 2015 - 15:03:22) |
|
|
Adomb |
Отправлено: 30 Июля, 2015 - 16:05:43
|
Мастер
Покинул форум
Сообщений всего: 185
Дата рег-ции: Июль 2015
Репутация: 1
|
Вы, наверно, не поняли
код (Отобразить)CODE:int a=1;
if (B()==-1) {messagebox ("бла..бла..");goto er;}
B();
er:
function B()
{
beep(2500, 1000); // какое-нидь действие
sleep(500);
mb:
beep(2500, 400); //действие, которое зацикливается, если a не равно 1
sleep(500);
if (a==1)return 1;
if (a!=1)goto mb;
return -1;
}
Функция B() вызывается один раз и, если условие верно (a==1), скрипт должен просто выйти из функции, и закончить свою работу. Но это не происходит, пока функция не сработает дважды. Понимаете? Только после двух раз, это можно отловить запустив скрипт. Должно пикнуть - 1 длинный и один короткий, а пикает по кругу 2 раза. Если вместо пика кликать мышью, скрипт сделает лишние клики.(Отредактировано автором: 30 Июля, 2015 - 16:07:41) |
|
|
|