Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Ramzesia on May 25, 2022, 10:57:26 PM
-
Помогите оптимизировать, эти масивы все не как не поддаются...
Еще проблема иногда тупо не работает, не могу понять почему.
Образец в закрепе
$Start = 0
WHILE($Start = 0) // Получаю начало координат х и у
GETSCREEN (15,590, 145,615)
COLORMODE(8, 15,590, 145,615)
IF_PICTURE_IN (15,590, 145,615, "Коры\x.bmp")
$Sx = $_return1+15
$Sy = $_return2
IF_PICTURE_IN (15,590, 145,615, "Коры\y.bmp")
$Start = 1
$Sx2 = $_return1+15
$Sy2 = $_return2
WAITMS(10)
ELSE
WAITMS(10)
LOGWRITE ("нет координат")
END_IF
END_IF
END_CYC
// Сканирую цифры по х
UNDEFINE($arr)
$Stop = 0
WHILE($Stop = 0)
FOR($No = 0, $No <= 10)
IF_PICTURE_IN ($Sx,$Sy, $Sx+7,$Sy+11, STRCONCAT("Коры\",$No,".bmp"))
IF($No = 10)
$Stop = 1
ELSE
ARRPUSH($arr, $No)
END_IF
$No = 777
END_IF
END_CYC
INC($Sx,7)
END_CYC
$x = ""
FOR($a=0,$a<ARRSIZE($arr))
$x = STRCONCAT($x,$arr[$a])
END_CYC
// Сканирую цифры по у
UNDEFINE($arr)
$Stop = 0
WHILE($Stop = 0)
FOR($No = 0, $No <= 10)
IF_PICTURE_IN ($Sx2,$Sy2, $Sx2+7,$Sy2+11, STRCONCAT("Коры\",$No,".bmp"))
IF($No = 10)
$Stop = 1
ELSE
ARRPUSH($arr, $No)
END_IF
$No = 777
END_IF
END_CYC
INC($Sx2,7)
END_CYC
$y = ""
FOR($a=0,$a<ARRSIZE($arr))
$y = STRCONCAT($y,$arr[$a])
END_CYC
LOGWRITE ($x," - ", $y)
halt
(https://i120.fastpic.org/thumb/2022/0525/1b/96df2dacef6e0a4b484ba145878af61b.jpeg) (https://fastpic.org/view/120/2022/0525/96df2dacef6e0a4b484ba145878af61b.jpeg.html)
-
В начале цикл ждёт до победного одновременно две картинки x.bmp y.bmp . При чём если x.bmp нашли, а y.bmp нет то выводим "нет координат". Странное поведение.
Цикл стр. 22-35
ищем, я так понял, цифры 0-9 и знак окончания строки 10.bmp - это запятая?
Если нам что-то помешает её найти, то уйдём в бесконечный цикл. А по приложенному образцу в jpeg ничего нельзя гарантировать, там мусор.
А что именно оптимизировать?
Как минимум делается одно и то же 2 раза для X и Y, значит вынести в подпрограмму.
Раз начал делать велосипед... Если дальше оптимизировать и не перебирать на каждом знакоместе все цифры, то получится мой код где ищет через SCANPICTURE
Сейчас в худшем варианте при координатах 999999, 999999 будет 71+71 поиск.
-
Фотку находит всегда, ну во всяком случае еще не было так что бы не нашел, картинки нормальные, без всяких помех, находятся быстро и четко, совпадение 100%.
Фотку не могу выложить, пишет место заполненное свяжитесь с администратором.
ищем цифры от 0-9 10 это запятая, тоже находит 100%
Завернуть в подпрограмму не могу потому что этот кусок целиком является подпрограммой, и если его вызывать в подпрограмме то не работает.
Теперь по теме, методом лога после какждых манипуляций поставил запись в лог, иногда случается проблема, второй масив тупо не заполняется, картинки находит но размер масива тупо не выводится, и уходит в бесконечность в цикле на 60 строке. а насчет оптимизации, думал можно завернуть оба числа в 1 масив потом достать отдельно в переменные х у.
пытался твоим скриптом пользоватся, но он для моей простой задачи слишком сложный, я не смог в нем разобраться...
-
Завернуть в подпрограмму не могу потому что этот кусок целиком является подпрограммой, и если его вызывать в подпрограмме то не работает.
Это как так? Да хоть десяток подпрограмм. Следить только за не пересечением переменных.
SUB(scan_number, $Sx_sn, $Sy_sn)
UNDEFINE($arr_sn)
$Stop = 0
WHILE($Stop = 0)
FOR($No_sn = 0, $No <= 10)
IF_PICTURE_IN($Sx_sn,$Sy_sn, $Sx_sn+7,$Sy_sn+11, STRCONCAT("Коры\",$No_sn,".bmp"))
IF($No_sn = 10)
$Stop = 1
ELSE
ARRPUSH($arr_n, $No_sn)
END_IF
$No_sn = 777
END_IF
END_CYC
INC($Sx_sn, 7)
END_CYC
$number_result = ""
FOR($i=0, $i < ARRSIZE($arr_sn))
$number_result = STRCONCAT($number_result, $arr_sn[$i])
END_CYC
END_SUB
//==============================================================================
$Start = 0
WHILE($Start = 0) // Получаю начало координат х и у
GETSCREEN(15,590, 145,615)
COLORMODE(8, 15,590, 145,615)
IF_PICTURE_IN(15,590, 145,615, "Коры\x.bmp")
$Sx = $_return1 + 15
$Sy = $_return2
IF_PICTURE_IN(15,590, 145,615, "Коры\y.bmp")
$Start = 1
$Sx2 = $_return1 + 15
$Sy2 = $_return2
END_IF
END_IF
WAITMS(10)
END_CYC
// Сканирую цифры по х
scan_number($Sx, $Sy)
$x = $number_result
// Сканирую цифры по у
scan_number($Sx2, $Sy2)
$y = $number_result
LOGWRITE($x," - ", $y)
HALT
Теперь по теме, методом лога после какждых манипуляций поставил запись в лог, иногда случается проблема, второй масив тупо не заполняется, картинки находит но размер масива тупо не выводится, и уходит в бесконечность в цикле на 60 строке.
На 60 строке в приведённом скрипте он в бесконечный уйти не может, 60 это наверно в изменённом. А уходит как я писал, потому, что не находит символ окончания "запятая" может там Y не точно вырезан или возможно смещение меняется. В этом же скрипте всё по чётким размерам.
Не решить проблему, но избавиться от бесконечного цикла можно заменив цикл WHILE($Stop = 0) на FOR например по 20 итерациям (будет искать число не больше, чем в 10 знакомест), если вышли и переменная цикла последняя, то ничего не нашли и можно координате присваивать -10000 к примеру. Всё от задачи зависит.
-
Спасибо за ответ, а если такая ситуация, 1 файл с подпрограммой, в нем допустим 2 подпрограммы, во втором сабе вызов первого. Во вторм файле в скрипте вызываю эту подпрограмму она будет работать? Возможно я что и сделал не правильно. Вот такой пример будет работать?
// Файл1 с сабами
SUB(имя1)
// тело выполняется только после вызова
END_SUB
SUB(имя2)
/имя1()
END_SUB
// ========================================
// Файл2 со скриптом
SUB(имя3)
/имя2()
END_SUB
-
Спасибо за ответ, а если такая ситуация, 1 файл с подпрограммой, в нем допустим 2 подпрограммы, во втором сабе вызов первого. Во вторм файле в скрипте вызываю эту подпрограмму она будет работать? Возможно я что и сделал не правильно. Вот такой пример будет работать?
Будет.