Author Topic: помогите мне вылечиться от goto  (Read 35577 times)

0 Members and 2 Guests are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #15 on: September 10, 2014, 05:30:39 PM »
Вот мой пример МОИХ "флагов". Вот это я еще понимаю. Вот если на моем примере вы вставите свои флаги, то возможно я смогу понять эту систему...

А я тебе уже показывал на твоём примере http://crapware.aidf.org/forum/index.php?topic=1406.msg6995#msg6995

стр 71, 82, 94-96, 147, 153, 166-169
Ты прости, но я там вот этих команд - "boy = 1", "slepoy_boy = 1", "WHILE(boy = 1)", "WHILE(slepoy_boy = 1)" - вообще не понял... И к тому же я не понял, какое отношение эти команды относятся к вопросу, который мы обсуждаем СЕЙЧАС...
Вы простите меня, ребят. С одной стороны очень хочется все это понять, но с другой и вас тут раздражать не охота своей деревянностью...
Мы тут "флаг" обсуждаем и, на сколько я понял, это эта команда - "inc($flag)"? Какое отношение те твои правки к ней имеют отношение? Только пойми меня правильно - это не предъявы. Я просто понять пытаюсь...
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #16 on: September 10, 2014, 05:48:29 PM »
Ну вот так не будет выпрыгивание из подпрограммы. В самой подпрограмме происходит присваивание значения переменной и прыжок в конец. После подпрограммы идут условия и если они сработают то выполнение прыгнет на одну из меток.
Code: (clickermann) [Select]
SUB(dar)
   LOGWRITE ("dar")
   IF($time1 < $_time_t)
      KEYPRESS(189)
      WAITMS(600)
      $time1 = $_time_t + 9
   END_IF
END_SUB

SUB(boy)
   boy:
   LOGWRITE ("boy")
   dar() // Юзаем тикающюю хилку
   GETSCREEN
   IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем моба если он на персе, то юзаем скилы ударов.
      IF_PIXEL_IN(588,847, 588,847, 329753) // Рывок
         KEYPRESS(51)
         WAITMS(850)
      Else
         IF_PIXEL_IN(629,847, 629,847, 738459,6791167)  // Тройной 1
            KEYPRESS(52)
            WAITMS(650)
         Else
            IF_PIXEL_IN(629,847, 629,847, 666529) // Тройной 2
               KEYPRESS(52)
               WAITMS(650)
            Else
               IF_PIXEL_IN(629,847, 629,847, 465195) // Тройной 3
                  KEYPRESS(52)
                  WAITMS(1200)
               END_IF
            END_IF
         END_IF
      END_IF
   Else // Если моба нет, то проверяем минимум ХП у перса. Это нужно для того, что если моб уделает перса настолько, что экран затянет красной пеленой, то кликер ослепнет и не будет видеть не только ХП моба, но и ХП перса и скилы.
      IF_PIXEL_IN(80,64, 80,64, 1930288) // Минимум хп
         // Если ХП перса найдены, а ХП моба мы до этого не нашли, то значит бой окончен и отправляем перса в Time Out
         $Time_Out = 1
         GOTO(end boy)
      Else // Если же и ХП перса не найдено, то это значит, что перс в трудном положении, о чем мы сигнализируем и переводим перса в слепой бой, так сказать...
         BEEP(800,200)
         slepoy boy:
         LOGWRITE ("slepoy boy")
         dar()  // Юзаем тикающюю хилку
         GETSCREEN
         IF_PIXEL_IN(80,64, 80,64, 1930288) // Проверяем минимум ХП перса и если они найдены, то значет перса нужно выводить из слепого боя, в котором он юзает скилы наощупь, так сказать...
            $begin = 1
            GOTO(end boy)
         Else // Если ХП перса не проявились, то юзаем минимальные (безоткатные) скилы вслепую.
            BEEP(800,200)
            KEYPRESS(#4)
            WAITMS(700)
            KEYPRESS(52)
            WAITMS(700)
            KEYPRESS(#4)
            WAITMS(1250)
            GOTO(slepoy boy)
         END_IF
      END_IF
   Else
      $Time_Out = 1
      GOTO(end boy)
   END_IF
   GOTO(boy)
   end boy:
END_SUB

1:
$begin = 0
$Time_Out = 0

GETSCREEN
IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем - не висит ли на персе моб.
   boy()  // Если висит, то отправляем в boy
   IF($begin = 1)
      $begin = 0
      GOTO(1)
   END_IF
   IF($Time_Out = 1)
      $Time_Out = 0
      GOTO(Time Out)
   END_IF
Else
   WAITMS(100)
END_IF

Time Out:
LOGWRITE ("Time Out")

GETSCREEN
IF_PIXEL_IN(749,645, 749,645, 16449535) // Дроп
   KEYPRESS(#F)
   WAITMS(2000)
Else
   COLORMODE(6)
   IF_PICTURE_IN (2,44, 320,96, "хп-мп.bmp", -1, 100)  // Проверяем полное восстановление ХП и МП
      KEYPRESS(#E) // Если восстановилось, то берем моба в таргет.
      WAITMS(100)
      GETSCREEN
      IF_PIXEL_IN(571,63, 571,63, 4539822) // Если моб в таргете, то отправляем перса в boy
         boy()
         IF($begin = 1)
            $begin = 0
            GOTO(1)
         END_IF
         IF($Time_Out = 1)
            $Time_Out = 0
            GOTO(Time Out)
         END_IF
      Else
         GOTO(1) // Если моб в таргете не появился, то в Time Out
      END_IF
   Else // Если ХП, или МП не восстановлены (как и сразу после боя), то не теряем время и проверяем наличие бафов.
      IF_PICTURE_IN (1,83, 353,163, "второе дыхание.bmp", -1, 100) // Если бафы в норме, то ничего не делаем и ждем дальше восстановления ХП и МП, Предварительно проверив, не сагрился ли на нас какой-нибудь моб (скрипт перейдет на позицию 1)
      Else // Если бафы слетели, то бафаемся.
         KEYDOWN (#SHIFT)
         WAITMS (50)
         KEYPRESS (189)
         WAITMS (50)
         KEYUP (#SHIFT)
         WAITMS(1300)
      END_IF
   END_IF
END_IF
WAITMS(100)

Создавать подпрограмму оправдано если код будет вызываться хотя бы два раза за проход скрипта.
Писать GETSCREEN к каждому анализу конечно не ошибка, но оптимально если нет задержек между анализами то GETSCREEN не пишут, это снижает нагрузку на проц.

Пример:
Code: (clickermann) [Select]
GETSCREEN // снимок делается один раз
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
   LCLICK($_return1, $_return2)
   WAITMS(100)
ELSE
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 15423488)
      LCLICK($_return1, $_return2)
      WAITMS(100)
   Else
      IF_PIXEL_IN(0,0, $_xmax,$_ymax, 16777215)
         LCLICK($_return1, $_return2)
         WAITMS(100)
      END_IF
   END_IF
END_IF
« Last Edit: September 10, 2014, 05:54:31 PM by Oraven »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #17 on: September 10, 2014, 05:53:01 PM »
Ну вот так не будет выпрыгивание из подпрограммы. В самой подпрограмме происходит присваивание значения переменной и прыжок в конец. После подпрограммы идут условия и если они сработают то выполнение прыгнет на одну из меток.
Code: (clickermann) [Select]
SUB(dar)
   LOGWRITE ("dar")
   IF($time1 < $_time_t)
      KEYPRESS(189)
      WAITMS(600)
      $time1 = $_time_t + 9
   END_IF
END_SUB

SUB(boy)
   boy:
   LOGWRITE ("boy")
   dar() // Юзаем тикающюю хилку
   GETSCREEN
   IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем моба если он на персе, то юзаем скилы ударов.
      IF_PIXEL_IN(588,847, 588,847, 329753) // Рывок
         KEYPRESS(51)
         WAITMS(850)
      Else
         IF_PIXEL_IN(629,847, 629,847, 738459,6791167)  // Тройной 1
            KEYPRESS(52)
            WAITMS(650)
         Else
            IF_PIXEL_IN(629,847, 629,847, 666529) // Тройной 2
               KEYPRESS(52)
               WAITMS(650)
            Else
               IF_PIXEL_IN(629,847, 629,847, 465195) // Тройной 3
                  KEYPRESS(52)
                  WAITMS(1200)
               END_IF
            END_IF
         END_IF
      END_IF
   Else // Если моба нет, то проверяем минимум ХП у перса. Это нужно для того, что если моб уделает перса настолько, что экран затянет красной пеленой, то кликер ослепнет и не будет видеть не только ХП моба, но и ХП перса и скилы.
      IF_PIXEL_IN(80,64, 80,64, 1930288) // Минимум хп
         // Если ХП перса найдены, а ХП моба мы до этого не нашли, то значит бой окончен и отправляем перса в Time Out
         $Time_Out = 1
         GOTO(end boy)
      Else // Если же и ХП перса не найдено, то это значит, что перс в трудном положении, о чем мы сигнализируем и переводим перса в слепой бой, так сказать...
         BEEP(800,200)
         slepoy boy:
         LOGWRITE ("slepoy boy")
         dar()  // Юзаем тикающюю хилку
         GETSCREEN
         IF_PIXEL_IN(80,64, 80,64, 1930288) // Проверяем минимум ХП перса и если они найдены, то значет перса нужно выводить из слепого боя, в котором он юзает скилы наощупь, так сказать...
            $begin = 1
            GOTO(end boy)
         Else // Если ХП перса не проявились, то юзаем минимальные (безоткатные) скилы вслепую.
            BEEP(800,200)
            KEYPRESS(#4)
            WAITMS(700)
            KEYPRESS(52)
            WAITMS(700)
            KEYPRESS(#4)
            WAITMS(1250)
            GOTO(slepoy boy)
         END_IF
      END_IF
   Else
      $Time_Out = 1
      GOTO(end boy)
   END_IF
   GOTO(boy)
   end boy:
END_SUB

1:
$begin = 0
$Time_Out = 0

GETSCREEN
IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем - не висит ли на персе моб.
   boy()  // Если висит, то отправляем в boy
   IF($begin = 1)
      $begin = 0
      GOTO(1)
   END_IF
   IF($Time_Out = 1)
      $Time_Out = 0
      GOTO(Time Out)
   END_IF
Else
   WAITMS(100)
END_IF

Time Out:
LOGWRITE ("Time Out")

GETSCREEN
IF_PIXEL_IN(749,645, 749,645, 16449535) // Дроп
   KEYPRESS(#F)
   WAITMS(2000)
Else
   COLORMODE(6)
   IF_PICTURE_IN (2,44, 320,96, "хп-мп.bmp", -1, 100)  // Проверяем полное восстановление ХП и МП
      KEYPRESS(#E) // Если восстановилось, то берем моба в таргет.
      WAITMS(100)
      GETSCREEN
      IF_PIXEL_IN(571,63, 571,63, 4539822) // Если моб в таргете, то отправляем перса в boy
         boy()
         IF($begin = 1)
            $begin = 0
            GOTO(1)
         END_IF
         IF($Time_Out = 1)
            $Time_Out = 0
            GOTO(Time Out)
         END_IF
      Else
         GOTO(1) // Если моб в таргете не появился, то в Time Out
      END_IF
   Else // Если ХП, или МП не восстановлены (как и сразу после боя), то не теряем время и проверяем наличие бафов.
      IF_PICTURE_IN (1,83, 353,163, "второе дыхание.bmp", -1, 100) // Если бафы в норме, то ничего не делаем и ждем дальше восстановления ХП и МП, Предварительно проверив, не сагрился ли на нас какой-нибудь моб (скрипт перейдет на позицию 1)
      Else // Если бафы слетели, то бафаемся.
         KEYDOWN (#SHIFT)
         WAITMS (50)
         KEYPRESS (189)
         WAITMS (50)
         KEYUP (#SHIFT)
         WAITMS(1300)
      END_IF
   END_IF
END_IF
WAITMS(100)
Вот я начал просматривать скрипт и дошел до команды - "$Time_Out = 1" и сразу в голове вопрос - "Эт че такое?..."
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #18 on: September 10, 2014, 05:56:54 PM »
А вот про GETSCREEN понял - спс. Реально проц аж подпрыгивает, когда я скрипты свои включаю...)))
« Last Edit: September 10, 2014, 05:58:55 PM by Hito »
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #19 on: September 10, 2014, 05:57:15 PM »
$Time_Out = 1 Переменная переключатель, в подпрограмме $Time_Out присвоится 1 и по гото произойдет переход в конец подпрограммы, далее она завершится и выполнение перейдет на следующую строчку после вызова а там у нас серия условий
Code: (clickermann) [Select]
   boy()  // Если висит, то отправляем в boy
  IF($begin = 1)
     $begin = 0
     GOTO(1)
  END_IF
  IF($Time_Out = 1)
     $Time_Out = 0
     GOTO(Time Out)
  END_IF
И если одно из них сработает выполнение скаканет либо в начало 1: либо к Time Out:

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #20 on: September 10, 2014, 05:59:11 PM »
Таким образом ты обойдешь "неправильное" выпрыгивание из подпрограммы.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #21 on: September 10, 2014, 06:00:29 PM »
Что занчит - "$Time_Out присвоится 1"?
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #22 on: September 10, 2014, 06:05:30 PM »
Ппц. У меня голова в дыму... Что значит - "$Time_Out = 0"? Что за команда вообще - "$begin = 0"?... Мне надо остыть чуток. Я на перекур...
Я не ду... Потому и не бу...

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #23 on: September 10, 2014, 06:15:06 PM »
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #24 on: September 10, 2014, 06:16:03 PM »
$Time_Out = 1 Переменная переключатель, в подпрограмме $Time_Out присвоится 1 и по гото произойдет переход в конец подпрограммы, далее она завершится и выполнение перейдет на следующую строчку после вызова а там у нас серия условий
Code: (clickermann) [Select]
   boy()  // Если висит, то отправляем в boy
  IF($begin = 1)
     $begin = 0
     GOTO(1)
  END_IF
  IF($Time_Out = 1)
     $Time_Out = 0
     GOTO(Time Out)
  END_IF
И если одно из них сработает выполнение скаканет либо в начало 1: либо к Time Out:

Над этими командами я даже задумываться боюсь...)
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #25 on: September 10, 2014, 06:17:09 PM »
Ой ну ты даешь  :D Это переменная, ячейка памяти хранящая какую то информацию. Я написал две переменные чтобы сообщить условиям после отработки подпрограммы с каким результатом она закончилась, и что надо делать по условию дальше, прыгнуть или пойти дальше по выполнению.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #26 on: September 10, 2014, 06:18:18 PM »
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )
У меня слов нет... Откуда столько терпения... Сейчас попробую понять. Но даже если не пойму - БОЛЬШОЕ спс за попытку!...
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #27 on: September 10, 2014, 06:20:57 PM »
Ой ну ты даешь  :D Это переменная, ячейка памяти хранящая какую то информацию. Я написал две переменные чтобы сообщить условиям после отработки подпрограммы с каким результатом она закончилась, и что надо делать по условию дальше, прыгнуть или пойти дальше по выполнению.
Прости... То ли я перегрелся, то ли я в натуре такой деревянный... Я сейчас даже вот этого сообщения не понял. Просто буквы знакомые увидел. Наверно на сегодня нужно сделать паузу...
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #28 on: September 10, 2014, 06:24:34 PM »
Да ты на имя то не смотри, переменную можно как хочешь обозвать, главное английскими буквами и без пробелов. Обычно им пишут осмысленные названия чтоб не запутаться и знать что она делает.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #29 on: September 10, 2014, 06:25:04 PM »
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )

Открыл картинку... Сразу температура подскочила до предела от слов:

Инициализация:
- установка параметров по умолчанию
- выбор изменяемых парамеиров

На остальных картинках хоть слова знакомые... Изучаю дальше...
Я не ду... Потому и не бу...