Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Vint

Pages: 1 2 3 [4]
46
Небольшое отступление...
Всегда реально не хватало некоторых возможностей. О них периодически задумывался, но в предложения никогда не писал. Не хотелось грузить своими просьбами. В новой версии часть из них реализовали. Такие как:
#logfile
#autorun
DIALOGBOX
Дробный WAIT
ну и конечно массивы

Хотя последние я ожидал многомерными и с поддержкой строковых данных, что бы там Johnny не говорил про условности многомерности...

Про компиляцию в exe (не с целью защиты) пока помолчу.

Так вот. Очень не хватает чего-то типа прерываний. В основном для стабилизации работы и исключения зацикливаний из-за помех которые невозможно учесть.
Можно сделать наподобие:
   
Code: [Select]
BREAKGOSUB(name, period)
или например
REGULARSUB(name, period)

где name - имя вызываемой подпрограммы,
period - регулярность вызова в мс
после данного оператора начинается регулярный вызов указанной подпрограммы через заданный промежуток времени.

Code: [Select]
STOPREGULARSUB(name) - этим оператором останавливать преведущую функцию.Имена условны.

В подпрограмме можно будет проверять приложение на падение или на сбой скрипта.
Или выводить счётчик/таймер параллельно работе основной программы.
Время от времени "следить" за каким нибудь второстепенным, но постоянным элементом.
Или выводить в лог номера строк скрипта (кстати не работает почему-то) для последующего анализа и отладки.
Можно ещё много применений найти.

Естественно "тяжесть" и частота вызываемой подпрограммы на совести и усмотрении создающего и в зависимости от задачи.

Просто устал распихивать GOSUB(проверка) по скрипту для отлавливания левых окон или непредвиденных ситуаций.
При этом скрипт начинает плохо читаться. Да и все нужные места не учтёшь.




47
Прочитав тему про переход на AutoIt, захотелось выложить пример совместного использования.
Как-то прочитав в контакте...
http://www.youtube.com/watch?v=ijoPWdnJbvQ&feature=youtu.be
... прочитав вконтакте вопрос о выводе простого диалогового окна с кнопками Да/Нет и дальнейшей обработкой результата, тоже подумал, что хорошо бы иметь такую возможность в кликере.
 Действительно, то что я использовал до этого функцию INPUTBOX было очень неудобно. Помимо того, что окно не выводилось поверх других приложений по умолчанию, так и вводить Да-нет или 1-0 было крайне неудобно, нужно прицелиться мышкой, выделить значение по умолчанию, ввести своё... Нет, для ввода данных это нормально. Для привычного диалога в системе нет.
Так вот не дожидаясь расширения функционала, быстренько состряпал в AutoIt заготовку буквально из 5 строк (благо там работа со всякими окнами поставлена широко). Скомпилировал в экзешник. И решил вызывать его с передачей необходимых параметров. Всё получилось, параметры я передал, осталось получить реакцию. Полез в справку кликера, т.к. помнил что читал про возврат параметров в $_return1.
Тут я жестоко обломался. Возврат параметров подразумевался только при вызове плагинов сделанных в dll. Так как я в написании и создании dll не в зуб ногой, вспомнив в очередной раз про текстовые файлы, решил передавать параметры обратно через ini файл (и туда заодно, для однородности).
Перекомпилив заготовку AutoIt на новый лад, всё прекрасно срослось.
Оформлено в виде 2 подпрограмм.
SUB(Window) - настраиваемое окно
SUB(Window_yes-no) - упрощённый вариант, запрос на перезапись файла.
Все передаваемые значения и возвращаемые результаты в комментариях.
Code: (clickermann) [Select]

#name "Window & Window_yes-no"
// Author: Vint
// Version: 1.0 (10.09.2013)


//==============================================================================
SUB(Window) //==========  Окно универсальное ===================================
   
   // $window_flag = 0 // Режим окна (сколько и какие кнопки)
   // $window_title = "Сообщение" // Заголовок окна
   // $window_text = "Перезаписать файл?" // текст в окне
   // $window_timeout = 5 // время оказа окна, "0"- без лимита
   // GOSUB(Window) // вызываем настраиваемое окно
   
   
   DEFINE($window_title, "Сообщение")
   DEFINE($window_text, "Текст")
   
   INIWRITE("Window.ini","flag",$window_flag, "Window")
   WAITMS(50)
   INIWRITE("Window.ini","title",$window_title, "Window")
   WAITMS(50)
   INIWRITE("Window.ini","text",$window_text, "Window")
   WAITMS(50)
   INIWRITE("Window.ini","timeout",$window_timeout, "Window")
   WAITMS(50)
   INIWRITE("Window.ini","return","0", "Window")
   WAITMS(100)
   
   EXECUTE("Window_ini.exe","Window")
   WAIT(1)
   WHILE(INT(INIREAD("Window.ini", "return", "Window")) = 0) // ожидание
      WAITMS(100)
   END_CYC
   
   $return = INT(INIREAD("Window.ini", "return", "Window"))
   IF($return = -1)
      LOGWRITE ("Кнопка не нажата, время вышло")
   ELSE
      LOGWRITE ("Нажата кнопка с кодом: ",$return)
   END_IF
   
   // Возвращаемые значения:
   // Время вышло $return = -1
   // OK $return = 1
   // Отмена (CANCEL) $return = 2
   // Прервать (ABORT) $return = 3
   // Повтор (RETRY) $return = 4
   // Пропустить (IGNORE) $return = 5
   // Да (YES) $return = 6
   // Нет (NO) $return = 7
   // Повторить (TRY AGAIN) $return = 10
   // Продолжить (CONTINUE) $return = 11
   
   
   //Параметр flag может быть комбинацией следующих значений:
   
   //десятичное значение Отображаемые кнопки 0x
   // 0 Кнопка OK 0x0
   // 1 Кнопки OK и Отмена 0x1
   // 2 Кнопки Прервать, Повтор и Пропустить 0x2
   // 3 Кнопки Да, Нет и Отмена 0x3
   // 4 Кнопки Да и Нет 0x4
   // 5 Кнопки Повтор и Отмена 0x5
   // 6 Кнопки Отмена, Повторить, Продолжить 0x6
   
   //десятичное значение Отображаемая иконка 0x
   // 0 (Нет) 0x0
   // 16 Иконка "стоп" 0x10
   // 32 Иконка "знак вопроса" 0x20
   // 48 Иконка "предупреждение" 0x30
   // 64 Иконка "информация", с 'i' в кружке 0x40
   
   //десятичное значение Выделенная кнопка по умолчанию 0x
   // 0 Первая кнопка 0x0
   // 256 Вторая кнопка 0x100
   // 512 Третья кнопка 0x200
   
   //десятичное значение Модальность 0x
   // 0 Приложение (Application) 0x0
   // 4096 Системная, поверх всех окон 0x1000
   // 8192 Блокирует родительское окно 0x2000
   
   // десятичное значение Другое 0x
   // 262144 имеет атрибут "поверх всех окон" 0x40000
   // 524288 Заголовок и текст выравниваются по правому краю 0x80000
   
END_SUB

//==============================================================================
SUB(Window_yes-no) //==========  Окно Да/нет ===================================
   
   // $window_title = "Сообщение" // Заголовок окна
   // $window_text = "Перезаписать файл?" // текст в окне
   // $window_timeout = 5 // время показа окна, "0"- без лимита
   // GOSUB(Window_yes-no) // вызываем окно Да/Нет
   
   DEFINE($window_title, "Сообщение")
   DEFINE($window_text, "Перезаписать файл?")
   DEFINE($window_timeout, 5)
   
   INIWRITE("Window.ini","flag","266532", "Windowyesno")
   WAITMS(50)
   INIWRITE("Window.ini","title",$window_title, "Windowyesno")
   WAITMS(50)
   INIWRITE("Window.ini","text",$window_text, "Windowyesno")
   WAITMS(50)
   INIWRITE("Window.ini","timeout",$window_timeout, "Windowyesno")
   WAITMS(50)
   INIWRITE("Window.ini","return","0", "Windowyesno")
   WAITMS(100)
   
   EXECUTE("Window_ini.exe","Windowyesno")
   WAIT(1)
   WHILE(INT(INIREAD("Window.ini", "return", "Windowyesno")) = 0) // ожидание
      WAITMS(100)
   END_CYC
   
   $return = INT(INIREAD("Window.ini", "return", "Windowyesno"))
   IF($return = 6)
      LOGWRITE ("Нажата кнопка - ДА -")
   ELSE
      IF($return = 7)
         LOGWRITE ("Нажата кнопка - Нет -")
      ELSE
         LOGWRITE ("Кнопка не нажата, время вышло")
      END_IF
   END_IF
   
   // Возвращаемые значения:
   // Время вышло $return = -1
   // Да (YES) $return = 6
   // Нет (NO) $return = 7
END_SUB

//==============================================================================

Обновлённые и расширенные версии здесь:
http://crapware.aidf.org/forum/index.php?topic=1147.msg5166#msg5166

48
Я понимаю, что после прочтения названия темы у некоторых постояльцев скажется рвотный рефлекс.
Но, спокойно! Сядьте, отдышитесь, закройте глаза...

Хотелось бы обсудить решение вопроса.
Конечно я знаю широко известный, в узких кругах  :), скрипт Андрея по поиску всех пикселов/картинок:
Code: (clickermann) [Select]
$sres = 0
$sres2 = 0
$size=40

GETSCREEN
IF_PIXEL_IN($xres1, $yres1, $xres2, $yres2, $color)
   //LOGWRITE("вводX: ", $_return1, " ","вводY: ", $_return2)
   $clresx = $_return1
   $clresy = $_return2
   GOSUB(клик2)
   
   WHILE($sres = 0)
      $sYres2 = $clresy + $size
      $sYres1 = $clresy
      $sres2 = 0
     
      WHILE($sres2 = 0)
         IF_PIXEL_IN($clresx + $size, $sYres1, $xres2, $sYres2, $color)
            //LOGWRITE("вводX: ", $_return1, " ","вводY: ", $_return2)
            $clresx = $_return1
            $clresy = $_return2
            GOSUB(клик2)
         ELSE
            $sres2 = 1
         END_IF
      END_CYC
     
      IF_PIXEL_IN($xres1, $clresy + $size, $xres2, $yres2, $color)
         //LOGWRITE("вводX: ", $_return1, " ","вводY: ", $_return2)
         $clresx = $_return1
         $clresy = $_return2
         GOSUB(клик2)
      ELSE
         $sres = 1
      END_IF
   END_CYC
END_IF

и его вариации.
Хотелось бы сразу уточнить, для многих задач применение отступа очень желательно. Это необходимо для избежания десятков повторов (и обработки) уже найденного участка.
Для поиска картинки скрипт подходит отлично. Можно задать минимальный отступ $size=1 и обыскивается весь экран. В этом случае отступ реализуется самим размером картинки. После "срезания" строки в 1 пиксел картинка уже не найдётся на том же месте.

Всё это хорошо только для картинки со 100% совпадением. Для поиска пиксела заданного цвета (и нововведения - процента совпадения картинки) вылезают проблемы. При использовании этого алгоритма поиска и нахождении пиксела как минимум дальше не обыскивается область левее найденной и высотой $size-1. Чем ближе к правой стороне области поиска будет найден пиксел, тем полоса шире. Ещё больше усугубляется при (повторном и далее) нахождении правее области отступа $size.
Поясняю на картинках (см. внизу).
В закрашенных серым областях мы сознательно не ищем совпадений.
Закрашеные жёлтым области выпадают из зоны поиска из-за недостатков алгоритма.
Для решения конечно предложат уменьшать отступ. Но это не решит проблемы полностью, если только отступ не будет равен 1. С другой стороны не хотелось бы лишаться отступа. К примеру поиск в Зомби ферме камней, дров и других элементов изменяющихся при масштабировании. Поиск по цвету который от масштаба может быть в другом месте искомого элемента даёт хорошие результаты и использование отступа примерно в ширину элемента необходимо.

Вчера думал как изменить или совсем переделать алгоритм чтобы небыло пропусков. В голову лезли какие-то ужасные многоэтажные конструкции с рекурсивным вызовом подпрограмм, подушки безопасности и пары воздушных шаров... а, нет это не то...
Короче ничего хорошего не придумал. Единственный возможный вариант представляется с использованием массивов или их заменителя с использованием текстового файла.

Принцип: обходим область с использованием смещения на 1 - бывшего отступа. После каждого нахождения записывать в файл координаты игнорируемой нерабочей области (высотой и шириной $size). При каждом новом совпадении проверять на попадание в записанные "нерабочие" области. Если не попадает обрабатываем и дописываем новую область, если попадает ничего не делаем и ищем дальше.

Даже проще... пишем найденные координаты, а при сравнении учитываем найденные+$size.

Но связываться с многократным чтением/записью в текстовый файл при анализе одного скрина не хочется. Думаю скорость пострадает из-за чтения с диска.

49
Хотелось бы узнать чем версия v4.7 SE (002) отличается от 001?
История версий молчит как рыба. Новости на сайте тоже. Может не нашёл.
Пробежался по справке - ничего не увидел. Учитываются ли ошибки из одноимённой темы?

В эту тему можно будет добавлять изменения по мере выхода новых версий. Если такие будут (хотелось бы надеяться).

50
Вопрос к автору программы:
Используешь ли сейчас Clickermann и в какой мере?

Понятно, что чаще всего появляется идея написать програму для себя, под определённые цели.
Не перерасло ли сейчас написание Clickermann-а в программирование ради самого программирования? Или практические цели сохранились?
Почему возник вопрос? Потому, что мы не видим практических примеров кода для Кликера от автора.

Допускаю, что опытному программисту использовать кликер становится не интересно, даже для мелких задач он набросает себе програмку на (кстати на чём?) Делфи или С++
Вот к примеру, для поддержания штанов данного форума регулярно работает программа по накрутке посетителей в виде гостей (см. вложение). Программа, возможно через прокси, забегает на форум толпой ботов с интервалом 0,1-3 минуты. Заходит в случайную тему или профиль пользователя и там сидит необходимое время, чтобы Яндекс поставил плюсик в своих мозгах. Вот эту программу ведь можно реализовать на Кликере... Можно. А на чём реализовал её автор?

51
Архив / Какой диапазон чисел
« on: January 15, 2013, 03:06:26 PM »
Какой возможен диапазон чисел в программе? Не нашёл описания.

Столкнулся с
Code: (clickermann) [Select]
$a= 0.00002
LOGWRITE ($a)
результат -3
Ну и так далее.
При $a= 0.00001    результат -4
Если нулей после запятой три, то всё нормально.

Да, и про верхний предел хотелось бы знать.

52
Предложения / Запрет на досрочный выход
« on: January 10, 2013, 03:22:59 PM »
Какой есть способ правильно экстренно выбраться из кучи вложенных циклов/подпрограмм  глобально ну хотя бы в «корень» скрипта?

Какие можно придумать способы? Мне пока в голову пришло только рекурсивно вызывать скрипт LOAD("скрипт.cms"). Можно ли так делать? Или это тот же досрочный выход из цикла? Я понимаю, что переменные сохраняются, а вот сбрасывается там стэк или как всё там реализовано не знаю. С программированием не знаком. В далёкие времена, для себя писал программки на ассемблере для Z80. Так там RET как раз был выход из подпрограммы. И выходов могло быть много (привет Оравэну). RET снимала с вершины стэка адрес возврата из подпрограммы. Можно было хитрым макаром, следя за стэком выскочить куда угодно из любого числа подпрограмм или вообще в любое место не нарушая работы.

Чёт я отвлёкся...

Зачем это нужно?  Всегда хочется правильной, если нужно длительной и бесперебойной работы скрипта. Речь сейчас не об ошибках в скрипте (представим, что ошибок нет), а о согласовании работы скрипта и целевого приложения. Для универсальности и исключения влияния нестабильной скорости интернет соединения, параллельно работающих программ и т.д., я если необходимо ожидать реакцию целевого приложения (например игры), в большинстве мест использую цикл ожидания с проверкой пиксела/картинки/суммы и т.п.

Типа такого:

Code: (clickermann) [Select]
      $fon = 1
      WHILE($fon = 1)
         GETSCREEN
         IF (PXL($lx+60, $ly-137)=6643283)
            $fon = 0              // выходим из цикла fon
         END_IF
         WAITMS(100)
      END_CYC

Так вот, если с целевой программой что-то пошло не так (не отработал клик или вылезло незапланированное окно), то всё из цикла мы уже не вылазим.
Сейчас я конечно использую внутри подобного цикла проверку на время ожидания или количество циклов. Выход правда получается сильно запутанным даже при двух вложениях, а если больше, наступает Амба с растущим числом проверок и перескоков GOTO к концу циклов/подпрограмм. Короче чёрт ногу сломит если делать всё по правильному.
Если можно использовать  LOAD самой себя из под кучи вложенных циклов то это хоть какой-то выход.

Пример:
Code: (clickermann) [Select]
#name "Рекурсия"

IF($reboot > 0)
   // здесь проводится обработка ошибок если нужно и разная реакция с раздачей слонов
   // перезагружаем страницу/перезапускаем приложение, топаем по метке внутрь скрипта и т.д.
   //...
   $reboot = 0
END_IF

// основная программа

//...
WHILE(условие1)
   WHILE(условие2)
      // и т.д.
       GOSUB(proverka)      //  проводим проверку на зависание/сбой
   END_CYC
END_CYC
//...

//--------------------------------
SUB (proverka)
   IF(условие)
      $reboot = 1
      LOAD("Опыты\Рекурсия.cms")
   END_IF
END_SUB
//--------------------------------


Если так нельзя, как можно? Может сделать хотя бы какой нибудь RESET который будет перезапускать скрипт с очисткой переменных и всяких входов в циклы. Короче то же что и стоп/пуск.

Если кого запутал - простите :)

53
Архив / Авторасстановка отступов
« on: January 09, 2013, 05:13:06 PM »
Авторасстановка отступов не работает ~10-60 строк (у меня так, может и др. количество) после вставки метки. Потом начинает опять работать.

54
Прочее / Юмор по теме и не только
« on: December 18, 2012, 05:23:43 PM »
Погода на эту неделю.

55
По поводу нововведения в 4.7...
Строковые переменные убрали, ну и ладушки.
Вот теперь столкнулся с косяком на старом скрипте.
Скрипт считывает данные с полей мозилы, записывает их в файл, затем вставляет из файла в определённом порядке.
Споткнулся на номерах телефонов (мобильных), теперь при помещении их из буфера обмена
через переменную он тупо из номера телефона высчитывает результат.
Code: (clickermann) [Select]
$a = FROMCLIP()
STRWRITELN ("file_teplovoi.txt", $a)

Я конечно в данном случае заменил на прямую запись
Code: (clickermann) [Select]
STRWRITELN ("file_DT.txt", FROMCLIP())А если STRWRITELN будет "многоэтажным" со всякими объединениями строки, потянет?
Даже если потянет очень нечитаемо выйдет.
Пример:

Code: (clickermann) [Select]
TOCLIP ("target.txt", (STRCONCAT(StrReadln("file.txt", 3), StrReadln("file.txt", 4), StrReadln("file.txt", 5))))Во блин, и я не уверен, что правильно написал и скобки посчитал.

Может сделать разделение на FROMCLIP() и например FROMCLIP("")
и TOCLIP туда же. Чтоб можно было присваивать переменным в строковом виде.

Или подскажите что делать.

56
Вот такое сегодня вылезло...
Развейте мои сомнения.
Кстати, на сам кликер у меня ни аваст ни каспер не ругался как у других.

Pages: 1 2 3 [4]