Author Topic: Несколько предложений по Кликерману  (Read 4390 times)

0 Members and 2 Guests are viewing this topic.

CMan_ProUser

  • Зашел в гости
  • *
  • Posts: 7
  • Постичь всю глубину кода, дано не каждому
    • View Profile
    Добрый день! С НГ и Рождеством всех читающих этот форум!!!
    Пишу на разных ЯП со школы. Кликерман (КМ) около 1,5 года. По показателю "написать бота" ставлю прогу на самый высокий уровень. Огромное спасибо  :-* автору КМ, что поддерживает проект. Отвечает на сообщения, что-то внедряет, другое переносит на будущее. Предлагаю и с нашей стороны поддержать, кто как может ...
    Успешно реализовывал код разной сложности, но по большей части пытался осуществить полную автоматизацию процесса. "Админу" - удовольствие, что всё работает, успех достигнут; $ растут, скилл качается, перс повышается и т.д. С утра снять сливки, поправить скрипт, запустить и уйти на работу и цикл повторяется  8) .
    Самыми большими проектами были: DemonSlaer, IdleHeroDefence, KingOfTowers, LootHeroes, PokieKingdom, swords-and-souls, GalacticClicker. Много мелких, связанных с рутиной автоматизации ручных процессов. Некоторые работают на андроиде, поэтому использовал эмулятор koplayer  :-\ .
    Прошу рассмотреть список моих предложений для включения в stable версию:

    1. Дополнением к уже озвученному в др. теме о задержке после выполнения любых команд управления мышью/клавиатурой: напр. LCLICK(x,y[,задерка]), хочу предложить использование данной возможности по умолчанию. А значение задержки вынести в изменяемую переменную(ые) в скрипте (-1 = задержка отсутствует). Таким образом, будет простая совместимость скриптов с предыдущими версиями. Команды управления не поменяются.

     2. Аналогичным образом внести два параметра в исполнение конструкции
WHILE (...)
...
END_CYC [(макс. кол-во выполнения, даже если не выполнится условие; задержка в конце)]

А для остальных  END_IF, END_SUB  оставить только задержку. Важная фича, избавляет от зацикливания и от нагромождения строк. Вот реальный пример:

Sub(MyTagIn,$tx,$ty) // ввод воина в бой
   $t=0
   while ((PXL($tx,$ty)! $cRed)|($t > 100))
      inc($t)   // счетчик антилаг
      lclick($tx,$ty)
      waitms($w)
      MyGetScr()
      waitms($w)
   END_CYC
   wait(1)
end_sub


А получилось бы так (11 против 6 строк кода):
Sub(MyTagIn,$tx,$ty) // ввод воина в бой
   while (PXL($tx,$ty)! $cRed)
      lclick($tx,$ty,$w)
      MyGetScr()
   END_CYC(100,$w)
end_sub(1000)
  ;)

    3. Читал, что отображение текущей выполняемой команды прямо в редакторе проблематично, предлагаю зайти на проблему с другой стороны, может будет легче: добавить кнопку, которая отображает окно (типа лога), где будут отображаться ТОЛЬКО выполняемые команды, допустим последние десять штук, этого "за глаза" хватит, чтоб определить зависший кусок.

    4. Особенно полезная фича будет отображение на экране (опционально), положения точки (в виде крестика), если курсор находится в внутри конструкции с координатами, а также прямоугольником для соответствующего случая. Завел курсор в LCLICK(1283,866), и сразу видишь где нажимается. Завел внутрь скобок PXLCOUNT(482,357,547,389,$cWhite),  и в соответствующем месте появляется прямоугольник.

    5. Добавить автоматическое применение изменений, поправил скрипт, сразу АЛТ-Ф1, и запускаешь, а так надо предварительно нажимать кнопку.

    6. Редактор. Не нашел, было ли где указано про неправильное "РАЗремирование". Сначала выделяем неск. строк внутри конструкции и комментируем кнопкой, получим:
THREAD(KR, 1)  // ручной запуск
   if(ISKEYDOWN(#CTRL)=1)
      $tkr=$tkr+1
//    if($tkr=4)
//         $c=1800


Затем нажимаем расставить отступы, и символы "//" уходят вправо:
THREAD(KR, 1)  // ручной запуск
      if(ISKEYDOWN(#CTRL)=1)
      $tkr=$tkr+1
      //    if($tkr=4)
      //         $c=1800

    После этого кнопкой комментарий убрать нельзя :). Только вручную. Если много срок закоментировал, нажал выровнять отступы - добавил себе работы.

    7. Внести определение направления сканирования пикселя (картинки). Хотя бы только четыре варианта - точки начала в прямоугольной области, всегда скан сначала по Х (влево или вправо), а потом переход на другой Y.

    8. Самое желанное. Ждем реализации простого GUI. Окно, куда можно кинуть кнопку, чекбокс (или группен чекбакс), и какой-нибудь лабель с полем для ввода (с предустановкой: ввод только чисел, ввод любых значений - хотя обычно только числа нужны). А в скрипте - определить по его имени процедуру запуска при нажатии. Так управлять сложным скриптом в разы проще. А пока управление действиями - через контроль времени нажатия кнопки.

     9. Редактор. При наборе команды и переходе к параметрам было бы неплохо показать варианты значений из справки. Так уже при наборе можно отследить, что набрано правильно, если появился всплывающий хинт под курсором (как в Делфи). Также нет контроля количества скобок. Конструкция while ((PXLCOUNT(482,357,547,389,$cWhite)! 183)|($t>10)) может работать, а иногда нет, если пропустить последнюю скобку. Тут главное, проверять дважды. Ошибки при пропуске не возникает.

     В целом имеющий функционал позволяет решать задачи в практически полном объеме!!! Если получится, то будем крайне рады новым возможностям.
ВСЁ, можете пинать меня!  ;D
С уважением, ...


CMan_ProUser

  • Зашел в гости
  • *
  • Posts: 7
  • Постичь всю глубину кода, дано не каждому
    • View Profile
Re: Несколько предложений по Кликерману
« Reply #1 on: January 08, 2018, 12:26:31 AM »
    7. Внести определение направления сканирования пикселя (картинки). Хотя бы только четыре варианта - точки начала в прямоугольной области, всегда скан сначала по Х (влево или вправо), а потом переход на другой Y.
Память в компьютере одномерна. Двумерные изображения хранятся в памяти в виде одномерных массивов. Обычно они записываются построчно: сначала идёт 0-я строка, затем 1-я и т.д.
Последовательный доступ к памяти осуществляется быстрее, чем произвольный. Это связано с работой кэша процессора, который помещает данные из памяти в кэш большими блоками, например, по 32 байта . В этот блок попадают сразу несколько соседних по горизонтали пикселей. Значит, при обращении к последующим пикселям в той же строке скорость доступа будет выше, чем к последующим пикселям в столбце. Делаем вывод: имеющийся сейчас способ сканирования потенциально самый быстрый  и все предложенные вами варианты будут работать ощутимо медленнее.
777! :o

Вас понял. :)  Эх, хоть и несколько гигагерцев под капотом - перебор будет идти медленно ?!  :( Честно на низком уровне не замерял, возможен ли такой способ и будет ли влиять при обратном обращении к памяти. Вроде бы GETSCREEN, копирует в свой буфер в ОЗУ, а там можно творить, что хошь, хоть по "диагонали катайся". Мы же не из видеопамяти берем. Но может вы и правы, и гигагерцы ничто по сравнению с красотой кода:). А ведь когда то мы на олимпиадах за миллисекунды боролись по алгоритмам сортировки, решения сложных задач, поиска простых чисел...
Однако, как вариант, можно создать предварительно генерируемый перед IF_PIXEL_IN буфер заносить данные в него в соответствии с направлением поиска. Тогда анализ точки (картинки) будет всегда по одному алгоритму, а в буфер данные попадают уже в отраженном или перевернутом виде. В общем, есть пара идей). Тогда время на операцию IF увеличится только на время прямого обращения (что очень быстро) и никакого обратного чтения!!! Ввиду необычности этой задачи (п.7), лучше оставить на потом, или вообще забыть. Спс за ответ.
« Last Edit: January 08, 2018, 12:41:53 AM by CMan_ProUser »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Несколько предложений по Кликерману
« Reply #2 on: January 08, 2018, 09:12:41 AM »
Вот реальный пример:

Sub(MyTagIn,$tx,$ty) // ввод воина в бой
   $t=0
   while ((PXL($tx,$ty)! $cRed)|($t > 100))
      inc($t)   // счетчик антилаг
      lclick($tx,$ty)
      waitms($w)
      MyGetScr()
      waitms($w)
   END_CYC
   wait(1)
end_sub


А получилось бы так (11 против 6 строк кода):
Sub(MyTagIn,$tx,$ty) // ввод воина в бой
   while (PXL($tx,$ty)! $cRed)
      lclick($tx,$ty,$w)
      MyGetScr()
   END_CYC(100,$w)
end_sub(1000)
  ;)

Я бы тебе посоветовал еще раз подумать над своими "реальными примерами" и проверить код.
По условию у тебя $t больше 100. А в начале $t равна 0. Дак там еще и оператор сравнения "ИЛИ"
В результате если пиксел будет найден 100 раз цикл станет бесконечным.

На счет само отсчета переменной, так ведь на это есть цикл FOR.
Правильный код:
Code: (clickermann) [Select]
Sub(MyTagIn,$tx,$ty) // ввод воина в бой
   FOR($i=0,(PXL($tx,$ty)!$cRed)&($i<100))
      lclick($tx,$ty)
      waitms($w)
      MyGetScr()
   END_CYC
   wait(1)
end_sub

На счет пункта 6 в версии 4.13 это исправлено.
Можешь заценить тестируемую бета версию
http://crapware.aidf.org/forum/index.php?topic=356.msg25321#msg25321
« Last Edit: January 08, 2018, 09:17:33 AM by Oraven »

CMan_ProUser

  • Зашел в гости
  • *
  • Posts: 7
  • Постичь всю глубину кода, дано не каждому
    • View Profile
Re: Несколько предложений по Кликерману
« Reply #3 on: January 08, 2018, 10:04:49 AM »
Oraven, Вас понял. Спасибо, с FOR никогда бы так не написал, двойное условие в цикл перебора!!! Спс, что заметил ошибку!!!