Author Topic: Помогите найти ошибку, скрипт перестал работать  (Read 14250 times)

0 Members and 1 Guest are viewing this topic.

Sweets

  • Освоившийся
  • **
  • Posts: 50
    • View Profile
Спасибо, попробую

Sweets

  • Освоившийся
  • **
  • Posts: 50
    • View Profile
Проблема в том, условия в точке А и В одни и те же, но они в разных расположениях, если в точке А пиксель IF(PXL(453,184) = 1118481), то идти в точку В и там нажимать условия IF(PXL(495,181) = 200070), если в точке В IF(PXL(453,184) = 1118481) то идти в точку А и нажимать там IF(PXL(495,181) = 200070), и так по кругу, можно ли это как сделать?

Code: (clickermann) [Select]
GETSCREEN   // находимся в точке А
IF(PXL(495,181) = 200070) // находим пиксель
   LCLICK(RND(491,537),RND(182,187)) // нажимаем, ждем ( тут время рандомно очень отличается, не выставить когда нажимать, поставила по картинке что бы нажимал
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")  // находим картинку
      WAIT(RND(1,3)) // ждем
   END_IF
END_IF
WAIT(RND(2,5))

GETSCREEN
IF(PXL(453,184) = 1118481)          // находимся пиксель в точке А
   LCLICK(RND(566,579),RND(372,379)) // нажимаем
   WAIT(RND(16,18)) // идем в точку В
   IF(PXL(495,180) = 200070) // тут все повторяется что в точке А
      LCLICK(RND(491,537),RND(182,187))
      IF_PICTURE_IN (330,611, 385,690, "2.bmp")
         WAIT(RND(1,3))
      END_IF
   END_IF
END_IF
WAIT(RND(2,5))

GETSCREEN
IF(PXL(453,184) = 1118481)     // находимся в точке В, находим пиксель
   LCLICK(RND(506,522),RND(317,320)) // жмем
   WAIT(RND(16,18)) // идем в точку А
   IF(PXL(495,181) = 200070) // тут опять всё повторяется
      LCLICK(RND(491,537),RND(182,187)) //нажимаем, ждём
      IF_PICTURE_IN (330,611, 385,690, "2.bmp")
         WAIT(RND(1,3))
      END_IF
   END_IF
END_IF
WAIT(RND(2,5))

GETSCREEN
IF_PICTURE_IN (239,681, 319,688, "1.bmp")
   WAIT(2)
   LCLICK(RND(274,394),RND(216,224))
   WAIT(2)
   LCLICK(RND(275,350),RND(267,271))
   WAIT(2)
   LCLICK(RND(393,404),RND(237,248))
   HALT
END_IF



Sweets

  • Освоившийся
  • **
  • Posts: 50
    • View Profile
Перенесите тему в "Общие вопросы".                      Спасибо.
« Last Edit: November 07, 2016, 01:08:32 PM by Sweets »

Sweets

  • Освоившийся
  • **
  • Posts: 50
    • View Profile
Перенесите тему в "Общие вопросы".   Спасибо.

Считаете, что здесь как-то затрагиваются Вопросы по интерфейсу, языку сценариев, алгоритмике?

Скорее ваша тема должна улететь в раздел использование.

Скорее, но точно не в ошибках программы, где я её создала.

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
 Проблема в том, условия в точке А и В одни и те же, но они в разных расположениях

IF(PXL(453,184) = 1118481)          // находимся пиксель в точке А
IF(PXL(453,184) = 1118481)         // находимся в точке В, находим пиксель

Вы очень противоречивы, поэтому помочь вам трудно.

Sweets

  • Освоившийся
  • **
  • Posts: 50
    • View Profile
А можно сделать так?
Что бы он выполнял вот это условие:
Code: (clickermann) [Select]
GETSCREEN
IF(PXL(495,181) = 200070)
   LCLICK(RND(491,537),RND(182,187))
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")
      WAIT(RND(1,3))
   END_IF
END_IF
WAIT(RND(2,5))
Потом через какое время выполнил вот это условие:
Code: (clickermann) [Select]
GETSCREEN
IF(PXL(453,184) = 1118481)
   LCLICK(RND(566,579),RND(372,379))
   WAIT(RND(16,18))
END_IF
 
Потом опять начал выполнять вот это условие:
Code: (clickermann) [Select]
GETSCREEN
IF(PXL(495,181) = 200070)
   LCLICK(RND(491,537),RND(182,187))
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")
      WAIT(RND(1,3))
   END_IF
END_IF
WAIT(RND(2,5))
через какое время выполнил это   
Code: (clickermann) [Select]
GETSCREEN
IF(PXL(453,184) = 1118481)
      LCLICK(RND(506,522),RND(317,320))
      WAIT(RND(16,18))
END_IF
WAIT(RND(2,5))
и опять начал выполнять эти условия
Code: (clickermann) [Select]
GETSCREEN
IF(PXL(495,181) = 200070)
   LCLICK(RND(491,537),RND(182,187))
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")
      WAIT(RND(1,3))
   END_IF
END_IF
WAIT(RND(2,5))


Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Code: (clickermann) [Select]
//можно сделать так в полном соответствии с вашим описанием

GETSCREEN
IF(PXL(495,181) = 200070) //Что бы он выполнял вот это условие:
   LCLICK(RND(491,537),RND(182,187))
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")
      WAIT(RND(1,3))
   END_IF
END_IF
WAIT(RND(2,5))//Потом через какое время

GETSCREEN
IF(PXL(453,184) = 1118481) // время выполнил вот это условие:
   LCLICK(RND(566,579),RND(372,379))
   WAIT(RND(16,18))
END_IF

GETSCREEN
IF(PXL(495,181) = 200070) //Потом опять начал выполнять вот это условие:
   LCLICK(RND(491,537),RND(182,187))
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")
      WAIT(RND(1,3))
   END_IF
END_IF
WAIT(RND(2,5)) //через какое время
   
GETSCREEN
IF(PXL(453,184) = 1118481) //выполнил это
      LCLICK(RND(506,522),RND(317,320))
      WAIT(RND(16,18))
END_IF
WAIT(RND(2,5))   //через какое время

GETSCREEN
IF(PXL(495,181) = 200070) //и опять начал выполнять эти условия
   LCLICK(RND(491,537),RND(182,187))
   IF_PICTURE_IN (330,611, 385,690, "2.bmp")
      WAIT(RND(1,3))
   END_IF
END_IF
WAIT(RND(2,5))  //через какое время

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Конечно, меня щас заклюют ассы скриптования, но я б посоветовал разбить все ваши условия по отдельным потокам-тредам (в справке к программе разделе Язык сценариев/Основные конструкции есть в конце страницы подраздел про треды). Почему по потокам? Потому что тогда все ваши условия будут выполняться независимо друг от друга, и для каждого из них можно выставить свою задержку, тем более пример в справке с тик-таком как раз соответствует вашему случаю, хотя очевидно здесь можно обойтись и без тредов, тем более задержки у вас между проверками достаточно большие (не в мс) и не должны подвесить комп. Если разобьёте по тредам, не забывайте про проставить задержки в конце каждого потока, но они собственно уже есть.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Прям заклюют...

Зачем разбивать на потоки то, что должно выполняться последовательно? Потоки предназначены для распараллеливания действий, не нужно их пихать везде где не попадя. Это не панацея. В других темах дошло уже до того, что человек не может нормально картинку найти и сразу "эврика!" - "Если я разобью на потоки, будет искать?"  :o :o :o

И потоки не достаточно изолированы, чтобы с ними было легко и приятно. Десяток потоков с поисками и каждый со своим GETSCREEN или завесит всё на свете на 100% (привет, привеееет :D ), или как минимум будет не всегда находить (естественно, 10 художников одновременно перерисовывают одно полотно ещё и действуя вразнобой), или не туда потом кликать/не от тех мест отталкиваться - $_return1/2.
Ну слава богу последнее здесь не грозит, всё намертво приколочено.


Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Прям заклюют...
Не, ну это метафора такая, просто мне и самому действительно интересно для ся разобраться: почему б и не использовать эти потоки? А вот Золотой любит и потроллить вопрошающих, ему наверно кажется, что они всё соображают в своих скриптах, а спрашивают так, от нечего делать или чтоб пуще раздосадовать его Величество  :) Хотя не спорю, советы у Золотого бывают очень толковые, когда он снисходит до них)

Зачем разбивать на потоки то, что должно выполняться последовательно?
Ну не то чтоб прям "должно", скорее сказал бы что это всё-таки отдельные поиски (не последовательные), но здесь допустимо их последовательное использование ввиду больших делеев между поиска, а если бы дело б обстояло, как у меня с клавиатурой, где нажатие занимает 30 мс и при этом велика нагрузка на проц, то!.. Ну так и хочется туда потоки влепить!  :D

Потоки предназначены для распараллеливания действий, не нужно их пихать везде где не попадя. Это не панацея.
Ну так вот я и распараллеливаю различные по субъекту поиски, ведь они должны имхо выполняться независимо друг от друга.

В других темах дошло уже до того, что человек не может нормально картинку найти и сразу "эврика!" - "Если я разобью на потоки, будет искать?"  :o :o :o
Здесь я не спорю, логика в каждом из потоков должна быть построена правильно, введение потоков никак не отменяет требования к логичности скрипта, как и наоборот, введение потоков не сможет исправить ошибок в логике. Но просто.. для чего-то ж эти потоки нужны! Или что иначе ими распараллеливать?  Вот можно пару рабочих, жизненных примеров, где без потоков не обойтись? Или без них всегда можно и нужно обходиться?

И потоки не достаточно изолированы, чтобы с ними было легко и приятно. Десяток потоков с поисками и каждый со своим GETSCREEN или завесит всё на свете на 100%, или как минимум будет не всегда находить (естественно, 10 художников одновременно перерисовывают одно полотно ещё и действуя вразнобой), или не туда потом кликать/не от тех мест отталкиваться - $_return1/2.
А вот это уже действительно аргумент против потоков, о котором я кстати не подумал! И оч существенный аргумент надо сказать! И здесь самая проблема имхо не с лишними гетскринами, лишним гетскрином кашу особо не испортишь, только чуть ударит по загруженности (хотя не знаю, как может повести себя кликер при одновременном вызове сразу нескольких гетскринов), а вот одинаковые имена переменных $_return1/2 во всех поиска могут действительно стать проблемой и выдать неверные, "не те" координаты в перемежающихся вызовах гетскрина. Я об этих совпадающих $_return1/2 тож иногда задумываюсь, когда в скриптах они встречаются). Так что наверно беру свои слова обратно про необходимость делать скрипт этот на тредах. Единственно, что можно попытаться выйти из этой ситуации путём присвоения полученных значений $_return1/2 сразу же на другие переменные, уникальные для каждого треда, но опять же нет гарантии, что гетскрин одного цикла не станет предыдущим тактом вычисления процессора для присвоения значений гетскрина из другого треда, и тогда ошибки наверно не избежать, хотя может и здесь можно было б сделать какую хитрую проверку. И хоть вероятность такого события очень мала, но раз скрипт будет выполняться множество раз (причём возможно в автоматическом режиме, без присутствия юзера), то и такая вероятность может рано/ поздно наступить. Т. ч. лучше действительно не страдать ерундой и не пытаться "обмануть судьбу" и сделать все поиски линейно, тем более если события случаются не часто, и навряд ли подвесят проц.

Убедил  ;D

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ну не то чтоб прям "должно", скорее сказал бы что это всё-таки отдельные поиски (не последовательные)
...
Ну так вот я и распараллеливаю различные по субъекту поиски, ведь они должны имхо выполняться независимо друг от друга.

Как же так. Ведь там русским по белому:
Quote
Что бы он выполнял вот это...
Потом через какое время выполнил вот это...
Потом опять начал выполнять вот это...
через какое время выполнил это...   
и опять начал выполнять эти условия...

По мне так последовательней не бывает.
То что это всё поиски и они похожи, совсем не говорит о том что они  друг от друга независимы и их можно выполнять параллельно и циклично.
« Last Edit: November 23, 2016, 03:48:11 PM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Вот можно пару рабочих, жизненных примеров, где без потоков не обойтись?

Да легко.

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

Опять же всякие клики:
F1 - раз в 3 секунды
F3 - раз в 5 секунд
F5 - раз в 10 секунд...
При этом есть основное действие скрипта. Удобней всего это реализовать потоками.



Не нравится пример с игрой?
Тогда вот в браузере работа, не дай бог ещё во флеше. Нужно постоянно следить не упал ли флеш и не упал ли браузер. Всё это не отходя от конвейера.
« Last Edit: November 23, 2016, 03:45:01 PM by Vint »


Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Опять же всякие клики:
F1 - раз в 3 секунды
F3 - раз в 5 секунд
F5 - раз в 10 секунд...
При этом есть основное действие скрипта. Удобней всего это реализовать потоками.
Есть основное действие? Сразу хочется спросить: а что же тогда, все эти F1/F3/F5 -- не основные?))

Не нравится пример с игрой?
Тогда вот в браузере работа, не дай бог ещё во флеше. Нужно постоянно следить не упал ли флеш и не упал ли браузер. Всё это не отходя от конвейера.
Не то чтоб не нравится пример, просто игрухи немного не моя тема, ну профан я в них. Я фанат всяких расширений и фишек.
А так вообще по браузеру -- правда, у него бывает не только падения, но и куча всяких неожиданно вылетающих модальных окошечек, которые преграждают работу скрипту. И зачастую, чтоб обеспечить стабильную работу простецкого скрипта, нужно предусмотреть целую кучу эксепшенов и прочих радостных ивентов, что плавно выливается в геморрой, посему выходит, что надо бы поскорее все эти обработчики/ чекеры включить в одну унифицированную либу, дабы упростить до максимума разработку кода.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Сразу хочется спросить: а что же тогда, все эти F1/F3/F5 -- не основные?))
Это самые частые задачи.
Я тоже не игрок. Обычно это во всяких RPG бонусные удары прокачанные. У каждого своё время восстановленя.
А основное действие - двигаться туда-сюда, отбегать и бить дефолтным оружием.


Sweets

  • Освоившийся
  • **
  • Posts: 50
    • View Profile
Пока не разобралась с этим и не нашла другово решения :( как это всё объединить и сделать, и для меня такие сложные вещи предложили...