Clickermann не работает цикл

Clickermann не работает цикл

Условия, циклы, подпрограммы

Сложные составные конструкции, делающие программы более умными, а сценарии более короткими и лаконичными.

IF (expression) . END_IF — проверяет истинность выражения и выполняет блоки инструкций в зависимости от результата

expression — выражение (либо выражения, объединенные логическим оператором), состоящее из двух членов (переменных или функций) и знака отношения; при этом оба члена должны быть одного типа: численного либо строкового

Выражение считается истинным, если его результат больше 0. В остальных случаях выражение считается ложным. Результат выражения — число, полученное путем вычисления выражения с использованием арифметических операций, битовых операций и операций сравнения. Для понимания этого была написана подробная статья «Условия и битовые операции» в разделе «Учебные статьи» на официальном форуме, с которой рекомендуется ознакомиться, так как там содержится много примеров и знаний для общего развития.

(a > b) = 1, если a > b (вслучае если a и b строки, сравниваются их длины)
(a < b) = 1, если a < b (вслучае если a и b строки, сравниваются их длины)
(a = b) = 1, если a равно b (поддерживает строки)
(a ! b) = 1, если a неравно b (поддерживает строки)

На самом деле, битовые операции (см. учебную статью на форуме). Однако в контексте данного параграфа просто позволяют объединять логические выражения и операции сравнения в комплексные условия
Логическое И: (a & b) = 1 если и a = 1 и b = 1
Логическое ИЛИ: (a | b) = 1 если a = 1 или b = 1, или оба
Логическое исключающее ИЛИ: (a ^ b) = 1 если только a = 1 или только b = 1, но не оба

ELSE — блок «иначе»; определяет инструкции, выполняющиеся в случае если условие ложно

Блок ELSE позволяет объявить блок комманд, которые выполнятся в том и только в том случае если условие ложно. Блок ELSE описывается прямо в блоке условия между заголовком и END_IF. Блок ELSE доступен для следующих условных конструкций: IF, IF_PICTURE_IN, IF_PIXEL_IN.

Переключатель (чаще говорят просто свитч) используется когда нагромождение условий (if) нецелесообразно и портит читаемость скрипта. Переключатель анализирует входную переменную и в зависимости от ее значения выполняет часть своего внутреннего кода.
Часть case(x) используется для явного указания значения, где x — ожидаемое значение входной переменной $var. Часть default (по умолчанию) используется для всех остальных неописанных случаев. Она должа быть описана последней.

FOR (цикл с параметром)

FOR ($var, expression, [step]) . END_CYC — организует цикл с параметром

$var — переменная, которая будет наращиваться на значение step после каждой итерации цикла (параметр цикла)
expression — логическое выражение, при истинности которого выполняется тело цикла (см. IF)
step — значение шага, на которое каждую итерацию увеличивается переменная; необязательный параметр

Существует возможность инициализировать переменную в заголовке цикла через знак «=». Например Если переменная до выполнения цикла уже была инициализирована (в том числе в этом же цикле на прошлом прогоне скрипта), то цикл начнется с использованием текущего значения переменной. Если это «новая» переменная, она будет инициализирована нулем.
Перед каждым выполнением итерации (тела цикла) проверяется условие expression и если оно истинно, то тело цикла выполняется, в противном случае цикл завершается. После каждой итерации параметр цикла автоматически увеличивается на step. Если значение опущено (необязательный параметр), что считается что step = 1.

WHILE (expression) . END_CYC — организует цикл с предусловием

expression — логическое выражение (см. IF), при истинности которого выполняется тело цикла

Упрощенная версия цикла FOR, без параметра и шага. Действует так же, за тем исключением, что просто проверяет условие expression и в случае его истинности выполняет тело цикла.

SUB (sub_name, [$par1, . ]) . END_SUB — описывает подпрограмму

sub_name — имя подпрограммы
$par1, . — параметры подпрограммы

Подпрограмма это последовательность действий, объединенная в блок с собственным именем и набором параметров. Подпрограмму можно описать в любом месте сценария. Однако, описание подпрограммы должно быть раньше (выше) любого из ее вызовов. Хорошим тоном считается вынесение тел подпрограмм в отдельный внешний файл, подключаемый затем через директиву #include

Параметры, описанные в заголовке подпрограммы после ее имени, доступны в теле подпрограммы как переменные. Для вызова подпрограммы необходимо написать ее имя в сценарии вместе со всеми параметрами. Очень важно чтобы количество параметров в описании и в вызове совпадало. После выполнения подпрограммы, сценарий продолжится с момента вызова подпрограммы. Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
Вызов подпрограммы без параметров все равно должен включать в себя пустые скобки ()

THREAD (thread_name, [init_state]) . END_THREAD — описывает дочерний поток

thread_name — имя потока
init_state — начальное состояние, где 1 — означает рабочее, 0 — приостановленное; необязательный параметр, значение по умолчанию — 1

Поток представляет собой независимую цепочку действий, выполняющихся одновременно с основным телом скрипта (он же родительский поток) и другими потоками.
Каждый дочерний поток имеет следующие особенности:

  • два состояния: приостановленное и рабочее; в рабочем состоянии выполняется тело потока, в приостановленном соответственно нет
  • собственный таймер, обрабатывающий задержки независимо от состояния родительского и других потоков; задержки, вызванные работой команд так же не влияют на параллельные потоки
  • собственные процедуры; при необходимости использования внутри потока процедуру, она описывается и вызывается внутри тела потока; внешний вызов и описание процедур не в рамках одного тела потока не допускается
  • родительский и все дочерние потоки имеют общий доступ к графическому буферу и переменным
  • возможность приостанавливать и возобновлять потоки (кроме родительского (не считая команды HALT))
  • при запуске основного скрипта все дочерние потоки находятся в приостоновленном состоянии; при паузе и останове работу прерывают все дочерние и основной поток

    SetThread (thread_name, state) — меняет состояние дочернего потока

    thread_name — имя потока
    state — задаваемое состояние

    0 — поток ставится на паузу
    1 — поток продолжает выполнение с места, где был остановлен
    2 — поток ставится на паузу, при этом при повторной его активации он начинает выполняться с начала, независимо от того, на каком этапе он был остановлен

    Данный простейший пример показывает одновременную работу трех потоков: родительского и двух дочерних. Все они «тикают» с разным интервалом, однако, не мешая друг другу.

    Источник

    Clickermann не работает цикл

    KEYPRESS(#A)
    WAIT(3)
    $check = 0
    WHILE($check = 0)
    GETSCREEN
    IF_PIXEL_IN(773,421,856,505,8048369)
    LOGWRITE (8048369) // так? и сюда?
    $check = 1
    KEYPRESS(#A)
    WAITMS(50)
    ELSE
    WAITMS(50)
    END_IF
    END_CYC

    FOR($c=0,$c Нравится Показать список оценивших

    Обнавляю страницу каждые 10 сек

    LCLICK (X,Y)
    WAITMS (10000)

    Можно ли сделать так: после обновление страницы, мышка если видит определенное изображение перемещала туда быстро стрелку? (изображение к примеру красное и мышка переместилась на него)

    Артур, В шаблонах есть ожидание картинки:

    $check = 0
    WHILE($check = 0)
    GETSCREEN
    IF_PICTURE_IN (0,0, $_xmax,$_ymax, «file.bmp», -1, 100)
    $check = 1
    LCLICK($_return1, $_return2)
    WAITMS(100)
    ELSE
    WAITMS(50)
    END_IF
    END_CYC

    А свой предыдущий скрипт тоже суда нужно вставить?

    Источник

    Clickermann не работает цикл

    Андрей, Спасибо за участие! Проблема в том, что это не вкладка — это отдельное ОКНО Моззилы. Т.е есть Файрфокс с кучей вкладок, и есть отдельно висящее окно Файрфокса только с этим адресом.

    Возможно, вы не заметили обновление моего предыдущего комментария, т.к я его несколько раз редактировал. Напишу тут:

    P.S — один нюанс, может в этом дело. Ссылка эта — https, и редактировать ее в адресной строке НЕЛЬЗЯ — она серая там, «наглухо» вбитая. Но поставить ручками курсор в позицию мышки и обновить Enterом- можно. Может автор программы не предусмотрел такую ситуацию?

    Саша, Ну и наконец а скакого перепугу ты кликаешь и жмешь ентер если можно жать просто F5 .

    sub(kocka)
    GETSCREEN
    for($var<5)
    IF_PIXEL_IN (76, 70, 1155,810, 16744319)//Cvet korobki 16744319
    LCLICK($_return1-rnd(0,1),$_return2+rnd(1,2))
    //LCLICK($_return1-10,$_return2+10)
    waitms(2200)
    goto(skip)
    else
    IF_TIME(«*:*:10»)
    wait(1)
    goto(skip)
    END_IF
    IF_TIME(«*:*:40»)
    wait(1)
    GETSCREEN
    colormode(0)
    if( PXL(570,501) = 2172609) // потеряли связь с игрой
    waitms(100)
    LCLICK(536,563)
    end_if //подключение END
    colormode(5)
    wait(1)
    goto(skip)
    END_IF

    skip:
    IF_PIXEL_IN(19,890,299,922, 2734325, 2734325, 2734325) //Proverka Admina na chat, i LS
    sound(admin.wav)
    END_IF
    IF_PIXEL_IN (975, 900, 1004,945, 10485759, 6283263, 4186111, 2072575, 2064383) // proverka protivnuka
    LCLICK(1228,810)
    wait(10)
    goto(skip)
    else
    waitms(300)
    //lclick( RND(1018,1250), RND(792,936) )
    lclick( RND(1040,1227), RND(792,936) )
    goto(skip1)
    end_if

    выдает ошибку: ошибка при интерпретации End_cyc

    Джонни, Андрей — нашла вроде как серьезный баг.

    Вот такая конструкция:
    WNDSTATE ($HWND, 0)
    waitms(2000)
    LOGWRITE («Svernuli»)
    WNDSTATE ($HWND, 1)
    LOGWRITE («razvernuli»)
    waitms(5000)
    работает нестабильно, т.е окно отказывается разворачиваться. В одной из причин я разобралась четко:

    Конструкция работать НЕ будет, если Кликерманн свернут в трей, а поверх сворачиваемого-разворачиваемого окна лежит другое окно. Т.е в свернутом состоянии он будет разворачивать нужное нам окно, только, если оно видимо. Что самое интересное, если мы после этого развернем кликкерман, он все-равно разворачивать окно не станет, пока мы не дождемся выполнения этой конструкции скрипта, и, ПРИ ЭТОМ, кликкерман должен быть поверх остальных окон. Как только это произойдет, тогда кликкерман можно убирать под низ (но не сворачивать в трей) — нужное окно теперь будет всплывать. Короче, Кликкерман каким-то образом намертво привязывается к нужному нам окну — когда всплывает окно, всплывает и кликкерман с логом, если кликкерман не всплывает — то и окно не всплывет, и скрипт не будет работать правильно. У меня XP SP3

    2) Ущербный алгоритм наименования скриншотов.
    Допустим есть shot1, shot2, shot3, shot4, shot5. Я ручками удаляю shot3. Следующий скрин сделанный кликкерманом будет shot3, после чего он сделает shot6. Зачем программа создает эту путаницу, заполняя созданные пользователям»дыры»? Однозначно нужно продолжать с последнего существующего номера.

    Источник

    Clickermann не работает цикл

    Подскажите, пожалуйста, как правильно учитывать фон при поиске изображений?
    Пишу на кликере программу, которая играет в Мемориз (надо открыть 2 одинаковые картинки из набора картинок). При этом столкнулся с такой трудностью, что процентное соотношение фона и полезного изображения в анализируемой области отличается для каждой пары картинок. Например, на одной картинке может быть 99% полезного изображения, а на другой — 10% изображения и 90% фона.

    Из-за этого не могу подобрать нужный диапазон параметра [currency] для процедуры
    IF_PICTURE_IN (x, y, x2, y2, file, [bgcolor], [currency] ), потому как для 2х разных картинок с большой долей фона программа считает их одинаковыми (фон совпадает при данном [currency]), а для 2х картинок, где мало фона, она не может увидеть сходство между ними ( [currency] слишком велик, чтобы засчитать совпадение)

    По идее как я понимаю, если задать [bgcolor], то он просто не будет учитываться при поиске. Но в этом случае программа начинает почему-то считать очень разные картинки одинаковыми. Получается, что за вычетом фона они работает даже хуже. Не понимаю, что я не так делаю с ней.

    С чем может быть связана эта проблема?

    Фрагмент программы, сравнивающий картинку с предыдущими выглядит так:

    Нестор, Если изображения затеняется до 10% от изображения, то и поиск должен быть по 10% изображения. Маска цвета предназначена для указания прозрачности в искомом изображении. Например изображение чисто красное, а фон чёрный. Укажешь фоновый цвет чёрный и во всех красных областях будет находить это изображение.

    С currency нужно быть осторожным. Поставишь 50% и круг станет квадратом. Он для коррекции нескольких пикселей, не более того.

    Если форма предметов сохраняется, попробуй считать PXLCOUNT по фону в каждой из областей поиска. Если изображение одно итоже, то и область поиска должна быть одинакова. Цветами при этом можно пренебречь, главное одинаковая форма. PXLCOUNT разумеется придётся получить опытным путём.

    Иван, Клавиши назначенные на «цикл» (на самом деле перезапуск потока). Без цикла (в потоках) проверка клавиш не грузит проц. С циклом (даже пустым) проц нагружен. Зато в цикле можно сделать триггер не привязанный ко времени. Здесь поток постоянно перезапускается, переменные сбрасываются, так что триггер привязан только ко времени задержки.

    //Зажал 1
    Thread(thr1,1)
    IF(ISKEYDOWN(#1)=1)
    //Получил турборежим на кнопку 1
    KEYPRESS(#1)
    END_IF
    WAITMS(10)
    End_thread

    //Зажал 2
    Thread(thr2,1)
    IF(ISKEYDOWN(#2)=1)
    //Получил турборежим на кнопку 2
    KEYPRESS(#2)
    END_IF
    WAITMS(10)
    End_thread

    //Тригер с циклом на кнопку 3. Промежуток нажатия должен уложиться в WAITMS(50).
    Thread(thr3,1)
    //Если $S1!нажатой в следующий момент клавише, значит она нажималась, значит врубаем цикл, пока не нажмётся ещё раз. Интервал нажатия 50 мс
    $S1=ISKEYDOWN(#3)
    WAITMS(50)
    IF((ISKEYDOWN(#3)!$S1))//временной тригер в 50 мс по разнице с $S1
    $S1=0
    $SS1=0
    WHILE($S1=0 and $SS1=0)//между 50 мс клавиша не нажималась
    KEYPRESS(#3)//нажимаю пока ты не нажмёшь
    $S1=ISKEYDOWN(#3)//проверяю нажал ли ты
    WAITMS(50)
    $SS1=ISKEYDOWN(#3)
    END_CYC
    WAITMS(100)//обязательно отдыхаем иначе не остановимся\не запустимся
    END_IF
    End_thread

    спасибо за идеи.

    1) Пока я привязал Currency к pxlcount фона, основываясь на том, что действительно коррелируют рабочий диапазон Currency и количество фона при данной маске цветокоррекции.

    2) уникальные пиксели — тут у меня просто графика проходит через кучу фильтров (эмулятор внутри ОС, потом в самом эмуляторе фильтры, сглаживание, настройки быстродействия меняют), плюс графика игры и набор изображений периодически обновляется и пр.. Короче, в ручную возиться с библиотекой пикселей того не стоит, учитывая, что нет гарантии этот самый пиксель потом найти

    3) по поводу формы предметов — не очень понял в чем идея. Ты предлагаешь разбить картинку на участки, в которых посчитать фон? То есть получить двумерную сетку с числами количества фона, которая будет уникальна для каждого изображения и по сути характеризует силуэт предмета?

    Тут такой момент, что в данной программе у меня точность определения местоположения картинки меняется +/- несколько пикселей вправо влево. Точно так же, и размер изображения может меняться тоже на несколько %.
    Изначально я беру с карточки изображения центральный участок изображения размером 50х50 пикселей (некоторые изображения целиком попадают туда, некоторые частично), который идет в память — какая картинка на какой из карточек находится (массив картинок, которые сохраняет программа автоматически), потом она эти изображения ищет на каждой новой карточке, но уже в области 60х60 пикселей. Эта разница в 1100 пикселей как раз и покрывает ту погрешность определения местоположения.

    Источник

    Читайте также:  Как может сломаться электрогитара
  • Оцените статью