Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Полуночник on July 30, 2014, 09:34:18 PM

Title: Периодические ошибки выполнения сценария
Post by: Полуночник on July 30, 2014, 09:34:18 PM
Может конечно что то я в скрипте напортачил. Он работает, но время от времени случаются ошибки выполнения.
Скрипт для чистки почты в игре Гнев Богов:
[spoiler]
Code: [Select]
// почта
// Автор: Полуночник
// Версия: 15.3 (30.07.2014)
A:
HINTPOPUP("Чищу почту")
LCLICK(95,85)       
$r1 = 467
$r2 = 344
$r3 = $r1+10
$r4 = $r2+10
GOSUB(Per)
$b1=0
WHILE($b1=0)
   $r1 = 467
   WAIT(1)
   GOSUB(Per)
   GETSCREEN
   if_pixel_in(870, 300, 900, 550, 1339325)
      LCLICK($_return1+10, $_return2+2)
      WAIT(1)
      GETSCREEN
      if_pixel_in(1045, 555, 1065, 575, 2286590)
      else
         LCLICK(1070, 540)
         $b2=0
         WHILE($b2=0)
            WAITMC(500)
            GETSCREEN
            IF_PIXEL_IN(815,340, 830, 360, 8901117)
               $b2 = 1
            END_IF
         END_CYC
         KEYPRESS(#ENTER)
         WAIT(1)
         GOSUB (Per)
         goto(D)
      end_if
      WHILE($r1<705)
         IF_PIXEL_IN($r1,$r2, $r3,$r4, 3158058)
            $j = $_return1
            $j2 = $_return2
            WAITMS(500)
            LCLICK(925,560)
            LDOWN(920,564)
            WAITMS(RND(700,900))
            MOVE($j,$j2)
            WAITMS(500)
            LUP($j,$j2)
            LCLICK(800,10)
            KEYPRESS(#ENTER)
            GOSUB (Per)
            $r1 = 706
         else
            INC($r1,53)
            INC($r3,53)
            WAITMS(100)
            IF($r1 = 732)
               INC($r2,53)
               INC($r4,53)
               $r1 = 467
               $r3 = $r1+10
               WAITMS(100)
               IF($r2>556)
                  $r1 = 706
                  $b1=1
               END_IF
            END_IF
         END_IF
      END_CYC
   else
      LCLICK(35,85)
      HINTPOPUP("нет писем")
      halt
   end_if
   D:
END_CYC

lClick(1399,58)
waitms(300)
lClick(131,550)
waitms(300)
$b = 0
WHILE($b = 0)
   WAIT(1)
   GETSCREEN
   if_pixel_in(170, 550, 171, 551, 16053492)
   else
      $b = 1
   END_IF
END_CYC
lClick(212,116)
goto(A)


SUB(Per)
   $b = 0
   WHILE($b = 0)
      WAIT(1)
      GETSCREEN
      if_pixel_in(820, 387, 821, 388, 9935251)
         $b = 1
      END_IF
   END_CYC
END_SUB


[/spoiler]

Ошибки бывают разные. Чаще всего встречается не выполнение участка кода
[spoiler]
else
            INC($r1,53)
            INC($r3,53)
            WHILE($r1 = 732)
               INC($r2,53)
               INC($r4,53)
               $r1 = 467
               $r3 = $r1+10
               IF($r2>556)
                  $r1 = 706
                  $b1=1
               END_IF
            END_CYC
         END_IF
[/spoiler]

но бывает что скрипт работает норм, а потом с 25 или 46, да неважно с какой строки просто перескакивает на 69 строку, на участок кода
[spoiler]      LCLICK(35,85)  ---- 69 строка
      HINTPOPUP("нет писем")
      halt
   end_if
[/spoiler]
Обьясните плииз в чём может быть заковырка?
Title: Re: Периодические ошибки выполнения сценария
Post by: Oraven on July 30, 2014, 10:20:28 PM
Цикл WHILE($r1 = 732) выполнится только если условие будет верным, в противном случае код будет пропущен. А если он и выполнится внутри цикла сразу же встречается $r1 = 467. То есть больше одной итерации по любому не будет! Вопрос, зачем там вообще цикл?
Title: Re: Периодические ошибки выполнения сценария
Post by: Полуночник on July 30, 2014, 10:31:52 PM
Цикл WHILE($r1 = 732) выполнится только если условие будет верным, в противном случае код будет пропущен. А если он и выполнится внутри цикла сразу же встречается $r1 = 467. То есть больше одной итерации по любому не будет! Вопрос, зачем там вообще цикл?
Хм..... да... наверное он теперь и не нужен... я его брал из старого скрипта. Сейчас правильнее будет вместо цикла сделать сравнение наверное. Сча покувыряемся))

Покувырялся.... Изменил тот участок кода. WHILE на IF. Праблы остались теже.... или не срабатывает участок кода тот же или так же перескакивает в конец скрипта((((
Title: Re: Периодические ошибки выполнения сценария
Post by: Полуночник on July 31, 2014, 12:30:13 AM
Решил сделать запись лога... получилось следующее:
заданы переменные:
$r1 = 467
$r2 = 344
$r3 = $r1+10
$r4 = $r2+10

цикл:
WHILE($r2<556)

действия:
else
         print("занято, прибавляю")
         print("в начале r1:", $r1)
         INC($r1,53)
         $r3 = $r1+10
         print("сейчас r1:", $r1)
         IF($r1 = 732)
            INC($r2,53)
            $r4 = $r2+10
            print("сейчас r2", $r2)
            $r1 = 467
         END_IF

и вот что в логе нахожу:
1:22:27 занято, прибавляю
1:22:27 в начале r1:626
1:22:27 сейчас r1:679
1:22:27 занято, прибавляю
1:22:27 в начале r1:679
1:22:27 сейчас r1:732
1:22:27 место свободно тут r1:648 ----- НУ ОТКУДА 648 появилось??????????? если по условиям должен искать в координатах от 626 до 3-636, потом 679*689 а в координатах 648 вообще не должен искать????????
я в шоке
Title: Re: Периодические ошибки выполнения сценария
Post by: Полуночник on July 31, 2014, 01:14:02 AM
Короче я так и не понял что это за глюк был((( порядка 20 раз переделывал скрипт.... сейчас всё вернул как было при глюке.... вот только глюка больше нет..... откуда взялся? как куда пропал? теперь уже не понять....

Рано радовался... глюк не пропал(((( Оставил выполнение скрипта на ночь. Утром проснулся и наблюдал что скрипт стоит в ступоре из -за глюка того же.
Вот скрипт в каком виде сейчас:
[spoiler]
Code: [Select]

// почта
// Автор: Полуночник
// Версия: 15.5 (30.07.2014)
A:
HINTPOPUP("Чищу почту")
LCLICK(95,85)
WAIT(4)
$r1 = 467
$r2 = 352
$r3 = $r1+10
$r4 = $r2+10
GOSUB(Per)
WHILE($r2<564)
   WAITMS(200)
   GOSUB(Per)
   GETSCREEN
   if_pixel_in(870, 300, 900, 550, 1339325)
      LCLICK($_return1+10, $_return2+2)
      WAITMS(300)
      GETSCREEN
      if_pixel_in(1045, 555, 1065, 575, 2286590)
      else
         LCLICK(1070, 540)
         $b2=0
         WHILE($b2=0)
            WAITMC(300)
            GETSCREEN
            IF_PIXEL_IN(815,340, 830, 360, 8901117)
               $b2 = 1
            END_IF
         END_CYC
         KEYPRESS(#ENTER)
         WAITMS(200)
         GOSUB (Per)
         goto(D)
      end_if
      WAITMS(200)
      E:
      IF_PIXEL_IN($r1,$r2, $r3,$r4, 3158058)
         $j = $_return1
         $j2 = $_return2
         WAITMS(300)
         LCLICK(925,560)
         LDOWN(920,564)
         WAITMS(700)
         MOVE($j,$j2)
         WAITMS(500)
         LUP($j,$j2)
         LCLICK(800,10)
         WAITMS(200)
         KEYPRESS(#ENTER)
         GOSUB (Per)
      else
         INC($r1,53)
         $r3 = $r1+10
         WAITMS(100)
         IF($r1 = 732)
            INC($r2,53)
            $r4 = $r2+10
            $r1 = 467
            WAITMS(100)
         END_IF
         IF($r2 = 564)
            goto(D)
         END_IF
         goto(E)
      END_IF
   else
      LCLICK(35,85)
      HINTPOPUP("нет писем")
      halt
   end_if
   D:
END_CYC

lClick(1399,58)
waitms(300)
lClick(131,550)
waitms(300)
$b = 0
WHILE($b = 0)
   WAIT(1)
   GETSCREEN
   if_pixel_in(170, 550, 171, 551, 16053492)
   else
      $b = 1
   END_IF
END_CYC
lClick(212,116)
goto(A)


SUB(Per)
   $b = 0
   WHILE($b = 0)
      WAIT(1)
      GETSCREEN
      if_pixel_in(820, 387, 821, 388, 9935251)
         $b = 1
      END_IF
   END_CYC
END_SUB

[/spoiler]
По прежнему участок кода
else
         INC($r1,53)
         $r3 = $r1+10
         WAITMS(100)
         IF($r1 = 732)
            INC($r2,53)
            $r4 = $r2+10
            $r1 = 467
            WAITMS(100)
         END_IF
         IF($r2 = 564)
            goto(D)
         END_IF
         goto(E)
      END_IF
   else

даёт сбои и выдаёт непонятные результаты время от времени. Может минут 5 нормально проработать, а может каждые 30 сек лагать((((
Title: Re: Периодические ошибки выполнения сценария
Post by: Vint on July 31, 2014, 08:33:06 AM
Ты забыл про $r3.
Где-то 61 строкой должно быть
Code: (clickermann) [Select]
$r3 = $r1+10
Как я понимаю ты двигаешься по рядам сканируя ячейки. Вот при переходе на новую строку ты забываешь про правую границу и начиная со строки 2 он ищет не по ячейкам, а по всей строке. Ну и вероятно пытается обработать больше 1 раза одно место.

И ещё проверь все буквы в строке 26 "WAITMC(300)"
Title: Re: Периодические ошибки выполнения сценария
Post by: Полуночник on July 31, 2014, 10:20:10 AM
Ты забыл про $r3.
Где-то 61 строкой должно быть

Vint спасибо. Ты прав. Из-за отсутствия $r3 в 61 строке все праблы. 1.5 часа после исправления - полёт нормальный))))
И ещё проверь все буквы в строке 26 "WAITMC(300)"
Не, тут всё норм.
Title: Re: Периодические ошибки выполнения сценария
Post by: Vint on July 31, 2014, 12:21:51 PM
Не, тут всё норм.
Не нормально. Прочитай по буквам.
Title: Re: Периодические ошибки выполнения сценария
Post by: aden on July 31, 2014, 12:43:40 PM
Не, тут всё норм.
Не нормально. Прочитай по буквам.

намальна намальна я твая панимать =)
Title: Re: Периодические ошибки выполнения сценария
Post by: Полуночник on July 31, 2014, 04:31:27 PM
Да я понял о чём)) Просто сам уже давно исправил))