Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Анклав on April 17, 2015, 06:18:22 AM
-
Я по образованию гуманитарий, поэтому извините, если пишу слишком глупые вещи.
В общем, у меня получилось нагромождение условий друг на друга.
Изначально задача следующая - посмотреть на область экрана. В этой области на заданных позициях должны быть пикселы. Пикселы должны появляться в строгом порядке (от 1 до 10).
Смотрим на точку 1, если на ней нет пиксела, то делаем так, чтобы он появился. Как только он появился, смотрим на точку 2, есть ли там пиксел...
Очень важно то, что, как только на точке появился пиксель, то про эту точку можно вообще забыть до следующего запуска THREAD.
Вот что у меня получилось(код в спойлере):
THREAD(test, 0)
:odin
IF(PXL(1051,695) = 8355839)
wait(1)
LOGWRITE ("odin - OK")
WAIT(1)
goto(dva)
:dva
IF(PXL(1117,692) = 8355839)
wait(1)
LOGWRITE ("dva - OK")
WAIT(1)
goto(tri)
:tri
IF(PXL(1165,693) = 8355839)
wait(1)
LOGWRITE ("tri - OK")
WAIT(1)
goto(chetire)
:chetire
IF(PXL(1082,717) = 8388479)
wait(1)
LOGWRITE ("chetire - OK")
WAIT(1)
goto(pyat)
:pyat
IF(PXL(1137,737) = 16744447)
wait(1)
LOGWRITE ("pyat - OK")
WAIT(1)
halt // для примера решил остановиться здесь
ELSE
LOGWRITE ("pyat - NE OK")
WAIT(1)
KEYPRESS(#L)
WAIT(1)
LCLICK(1302,96)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1344,402)
DBLCLICK(1344,402)
DBLCLICK(1344,402)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
goto(pyat)
END_IF
ELSE
LOGWRITE ("chetire - NE OK")
WAIT(1)
KEYPRESS(#L)
WAIT(1)
LCLICK(1302,96)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1185,425)
DBLCLICK(1185,425)
DBLCLICK(1185,425)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
goto(chetire)
END_IF
ELSE
LOGWRITE ("tri - NE OK")
WAIT(1)
KEYPRESS(#L)
WAIT(1)
LCLICK(1302,96)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1143,374)
DBLCLICK(1143,374)
DBLCLICK(1143,374)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
goto(tri)
END_IF
ELSE
LOGWRITE ("dva - NE OK")
WAIT(1)
KEYPRESS(#L)
WAIT(1)
LCLICK(1183,100)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1274,237)
DBLCLICK(1274,237)
DBLCLICK(1274,237)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
goto(dva)
END_IF
ELSE
LOGWRITE ("odin - NE OK")
WAIT(1)
KEYPRESS(#L)
WAIT(1)
LCLICK(1183,100)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1270,205)
DBLCLICK(1270,205)
DBLCLICK(1270,205)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
goto(odin)
END_IF
END_THREAD
Это укороченный вариант. На самом деле там не 5, а 10 условий. В принципе, это работает, НО работает криво.
Нужно, чтобы работа была так:
1. Проверка точки 1
1.1. Проверка удачная -> идем к точке 2
1.2. Проверка неудачная -> выполняем "определенные действия" и делаем по новой проверку точки 1. Количество "определенных действий" заранее неизвестно, может хватить 1 раза, может не хватить 100 раз.
2. Проверка точки 2
1.2 Проверка удачная ->идём к точке 3
...
и т.д.
А как это на самом деле:
[spoiler]Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная
Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная
Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная
Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная
Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 НЕ удачная
Проверка точки 1 удачная
Проверка точки 2 удачная
Проверка точки 3 удачная
Проверка точки 4 удачная
Проверка точки 5 удачная
Проверка точки 6 удачная
Проверка точки 7 удачная
Проверка точки 8 НЕ удачная[/spoiler]
То есть программа каждый раз начинает проверять ВСЕ точки, хотя в этом нет никакого смысла. Их статус до перезапуска THREAD не изменится. Как только условие в точке выполнилось, про эту точку нужно забыть и перейти к следующей.
Проблема не в том, что в программе много текста. Проблема не в том, что в логах идёт спам.
Проблема в том, что системные ресурсы тратятся бесполезно, нагружается процессор. Ведь я вам показал только один из потоков скрипта.
Спасибо!
-
можно использовать подпрограммы. канечно у тебя куча пораметров, да и черт с ними. но если есть какаято закономерность в координатах lclick и dblclick то можно убрать эти пораметры в вызове.
SUB(pix, $pxl_x, $pxl_y, $pxl_c, $lc_x, $lc_y, $dblc_x, $dblc_y, $n)
GETSCREEN
WHILE(PXL($pxl_x,$pxl_y) ! $pxl_c)
LOGWRITE ($n, " - NE OK")
WAIT(1)
KEYPRESS(#L)
WAIT(1)
LCLICK($lc_x,$lc_y)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK($dblc_x,$dblc_y)
DBLCLICK($dblc_x,$dblc_y)
DBLCLICK($dblc_x,$dblc_y)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
GETSCREEN
END_CYC
wait(1)
LOGWRITE ($n," - OK")
WAIT(1)
END_SUB
//______________________________________________
pix(1051,695,8355839,1183,100,1270,205,1)
pix(1117,692,8355839,1183,100,1270,205,2)
pix(1165,693,8355839,1302,96,1143,374,3)
pix(1082,717,8388479,1302,96,1185,425,4)
pix(1137,737,16744447,1302,96,1344,402,5)
-
Начнем с того что метки так не пишутся :odin а пишутся так odin:
Таким образом твои гото у тебя вообще не работали.
Но правильнее использовать в твоем случаи, циклы WHILE
Вот верный вариант.
THREAD(test, 0)
$check1 = 0
WHILE($check1 = 0)
GETSCREEN
IF(PXL(1051,695) = 8355839)
$check1 = 1
LOGWRITE ("1 - OK")
ELSE
LOGWRITE ("1 - NE OK")
KEYPRESS(#L)
WAIT(1)
LCLICK(1183,100)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1270,205)
DBLCLICK(1270,205)
DBLCLICK(1270,205)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
END_IF
END_CYC
$check2 = 0
WHILE($check2 = 0)
GETSCREEN
IF(PXL(1117,692) = 8355839)
$check2 = 1
LOGWRITE ("2 - OK")
ELSE
LOGWRITE ("2 - NE OK")
KEYPRESS(#L)
WAIT(1)
LCLICK(1183,100)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1274,237)
DBLCLICK(1274,237)
DBLCLICK(1274,237)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
END_IF
END_CYC
$check3 = 0
WHILE($check3 = 0)
GETSCREEN
IF(PXL(1165,693) = 8355839)
$check3 = 1
LOGWRITE ("3 - OK")
ELSE
LOGWRITE ("3 - NE OK")
KEYPRESS(#L)
WAIT(1)
LCLICK(1302,96)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1143,374)
DBLCLICK(1143,374)
DBLCLICK(1143,374)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
END_IF
END_CYC
$check4 = 0
WHILE($check4 = 0)
GETSCREEN
IF(PXL(1082,717) = 8388479)
$check4 = 1
LOGWRITE ("4 - OK")
ELSE
LOGWRITE ("4 - NE OK")
KEYPRESS(#L)
WAIT(1)
LCLICK(1302,96)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1185,425)
DBLCLICK(1185,425)
DBLCLICK(1185,425)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
END_IF
END_CYC
$check5 = 0
WHILE($check5 = 0)
GETSCREEN
IF(PXL(1137,737) = 16744447)
$check5 = 1
LOGWRITE ("5 - OK")
halt // для примера решил остановиться здесь
ELSE
LOGWRITE ("5 - NE OK")
KEYPRESS(#L)
WAIT(1)
LCLICK(1302,96)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK(1344,402)
DBLCLICK(1344,402)
DBLCLICK(1344,402)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
END_IF
END_CYC
END_THREAD
А вот оптимизированный вариант с использованием подпрограммы.
THREAD(test, 0)
SUB(CHECK1, $log, $pixl1,$pixl2, $color, $clk1,$clk2, $dbclk1,$dbclk2) // подпрограмма
$check1 = 0
WHILE($check1 = 0)
GETSCREEN
IF(PXL($pixl1,$pixl2) = $color)
$check1 = 1
LOGWRITE ($log," - OK")
ELSE
LOGWRITE ($log," - NE OK")
KEYPRESS(#L)
WAIT(1)
LCLICK($clk1,$clk2)
WAIT(1)
KEYDOWN(#S)
WAIT(1)
DBLCLICK($dbclk1,$dbclk2)
DBLCLICK($dbclk1,$dbclk2)
DBLCLICK($dbclk1,$dbclk2)
WAIT(1)
KEYUP(#S)
WAIT(1)
KEYPRESS(#L)
WAIT(11)
END_IF
END_CYC
END_SUB
// в подпрограмму передаются параметры: Номер, координата анализа, цвет, координаты клика и даблклика
CHECK1(1, 1051,695, 8355839, 1183,100, 1270,205)
CHECK1(2, 1117,692, 8355839, 1183,100, 1274,237)
CHECK1(3, 1165,693, 8355839, 1302,96, 1143,374)
CHECK1(4, 1082,717, 8388479, 1302,96, 1185,425)
CHECK1(5, 1137,737, 16744447, 1302,96, 1344,402)
halt // для примера решил остановиться здесь
END_THREAD
Как видишь все просто, и дописать еще 5 вариантов не составит труда.
-
Огромное спасибо, ребята! Именно это мне и нужно было, только я не знал, чего именно хочу! :)
Прочитал давно, а потестил только сегодня. В оптимизированном варианте всё просто супер, всё ок, за исключением того, что теперь, если в предыдущем раунде бот остановился на 5, то сейчас с 5 начинает...
Т.е. он не обнуляет свою память почему-то.
p.s. новый раунд у меня в коде прописывается как-то так
...
SETTHREAD (test, 0)
...
SETTHREAD (test, 1)
-
Т.е. он не обнуляет свою память почему-то.
Ничего удивительного, SETTHREAD может либо запустить поток, либо поставить его на паузу.
Так ли необходимы тебе потоки? Как всегда стоит появиться новой функции и её начинают использовать не целенаправленно.
-
Т.е. он не обнуляет свою память почему-то.
Ничего удивительного, SETTHREAD может либо запустить поток, либо поставить его на паузу.
Так ли необходимы тебе потоки? Как всегда стоит появиться новой функции и её начинают использовать не целенаправленно.
У меня была такая задача, чтобы разделить программу на несколько независимых частей, чтобы менеджер управлял ими по ситуации. Я подумал, что SETTHREAD идеально для этого подходит, т.к. им просто выключать и выключать все части в любой комбинации. В целом всё хорошо, за исключением этого небольшого момента с паузой.
Я его обошёл так, что написал bat файл, в котором поочереди нажимаются alt+s, alt+a, это помогло, но мое стремление к перфекционизму намекает мне, что это костыль. :)