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

0 Members and 1 Guest are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #75 on: September 12, 2014, 04:53:33 PM »
Не так. Не в последее условие, а на место 8 строки. Это же абстрактный пример.
Можно искать пиксел пола перед носом (как ты хочешь сделать)
Code: (clickermann) [Select]
   GETSCREEN
  IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Падали
...

А можно и у друга спросить
Code: (clickermann) [Select]
IF(упали?)
...

Абстрактные примеры не нужно так подробно пережевывать.

Я кажется понял что ты не понял  :D ;D
вот здесь http://crapware.aidf.org/forum/index.php?topic=1404.msg7031#msg7031
Вот я начал просматривать скрипт и дошел до команды - "$Time_Out = 1" и сразу в голове вопрос - "Эт че такое?..."
$Time_Out = 1 и Time Out:   это разные вещи никак не связанные друг с другом. Перваое - переменная, второе ссылка для GOTO, просто их назвали одинаково чтобы не путаться. Связать логически ты уже должен их сам через условие.

Так же и дальше у тебя http://crapware.aidf.org/forum/index.php?topic=1404.msg7107#msg7107
Code: (clickermann) [Select]
$1 = 0 .....это просто переменная с именем "$1". Никакого отношения к ссылке 1: она не имеет, никуда автоматом не переводит и никак не влияет. И может называться не $1, а хоть $vasya_pupkin

В этом примере    http://crapware.aidf.org/forum/index.php?topic=1404.msg7107#msg7107
показать что такое флаг бессмысленно, флаг нужен там где есть 2 и больше вариантов развития событий, а там у тебя один цикл через GOTO без вариантов.

Ну последний пример
Code: (clickermann) [Select]
SUB(MYSUB)
   IF_PIXEL_IN(933,115, 933,115, 10217469)
      $vasya_pupkin = 1
   Else
      $vasya_pupkin = 0
   END_IF
END_SUB



MYSUB()
IF($vasya_pupkin = 1)
   BEEP(300,200) // Низкий сигнал
Else
   $vasya_pupkin = 0
   BEEP(800,200) // Высокий сигнал
END_IF

если  найдёт цвет 10217469  будет низкий сигнал, иначе - высокий.

Всё, хорошь. Если никак, то забей и жди пока Джонни введёт команды return для саба и break/continue для циклов.

P.S. Если это троллизм, то мне по барабану. Мне не зазорно попасться на троллинг, смущённо чувствовать я себя не буду. В любом случае всегда исхожу из того, что собеседник нормальный.

Брат, вот я вторые сутки не отхожу от компа даже для того, чтобы поесть (не ел двое суток). Все мучился с этим вопросом. В туалет бегал галопом. А ты о каком-то троллизме говоришь... Я не только вас замучил, но и сам за два дня выкурил 6 пачек сигарет. Я не знаю сейчас - какими словами тебя отблагодарить... Спасибо большое!... Вот твой последний пример мне всё показал.
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #76 on: September 12, 2014, 04:54:54 PM »
Пойду поем
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #77 on: September 12, 2014, 05:48:52 PM »
Приятного аппетита. :)
Вот еще, на десерт, немного измененный вариант подпрограммы с циклом и флагом.
IF_PIXEL_IN(933,115, 933,115, 1255211) заменил на IF(PXL(933,115) ! 1255211), т.к. там область поиска размером в один пиксель.
Code: (clickermann) [Select]
// Переменная-флаг "$next" (имя произвольное), изначально имеет значение 0, необходимое для запуска цикла "WHILE($next = 0)".
// При условии, что $next = 0 - тело цикла выполнится.
// При условии, что $next ! 0 - тело цикла НЕ выполнится, или прервется уже выполняющийся цикл.

// Подпограмма "MYSUB" определяет цвета двух пикселей в указанных координатах.
// Завершается, если цвета обоих пикселей не равны искомым цветам.

SUB(MYSUB) //  // Начало описания подпрограммы "MYSUB" (обязательно выше её вызова)
   //
   $next = 0 // Ставим переключатель в положение "Вкл. цикл"
   //
   WHILE($next = 0) // Начало цикла
      //
      GETSCREEN
      //
      IF(PXL(933,115) ! 10217469) // Если цвет первого пикселя НЕ равен 10217469
         //
         BEEP(800,200) // Высокий сигнал
         WAITMS(1000)
         //
         IF(PXL(933,115) ! 1255211) // Если цвет второго пикселя НЕ равен 1255211 (проверяется, только если цвет первого не 10217469)
            BEEP(300,200) // Низкий сигнал
            $next = 1 // Чтобы выйти из цикла присваиваем переменной-флагу значение 1 (любое отличное от нуля)
            WAITMS(1000)
         END_IF
         //
      END_IF
      //
      WAITMS(500) // Частота цикла
      //
   END_CYC // Конец цикла
   //
END_SUB // Конец описания подпрограммы "MYSUB"

MYSUB() // Вызываем подпрограмму "MYSUB"

HALT

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #78 on: September 12, 2014, 06:02:25 PM »
Приятного аппетита. :)
Вот еще, на десерт, немного измененный вариант подпрограммы с циклом и флагом.
IF_PIXEL_IN(933,115, 933,115, 1255211) заменил на IF(PXL(933,115) ! 1255211), т.к. там область поиска размером в один пиксель.
Code: (clickermann) [Select]
// Переменная-флаг "$next" (имя произвольное), изначально имеет значение 0, необходимое для запуска цикла "WHILE($next = 0)".
// При условии, что $next = 0 - тело цикла выполнится.
// При условии, что $next ! 0 - тело цикла НЕ выполнится, или прервется уже выполняющийся цикл.

// Подпограмма "MYSUB" определяет цвета двух пикселей в указанных координатах.
// Завершается, если цвета обоих пикселей не равны искомым цветам.

SUB(MYSUB) //  // Начало описания подпрограммы "MYSUB" (обязательно выше её вызова)
   //
   $next = 0 // Ставим переключатель в положение "Вкл. цикл"
   //
   WHILE($next = 0) // Начало цикла
      //
      GETSCREEN
      //
      IF(PXL(933,115) ! 10217469) // Если цвет первого пикселя НЕ равен 10217469
         //
         BEEP(800,200) // Высокий сигнал
         WAITMS(1000)
         //
         IF(PXL(933,115) ! 1255211) // Если цвет второго пикселя НЕ равен 1255211 (проверяется, только если цвет первого не 10217469)
            BEEP(300,200) // Низкий сигнал
            $next = 1 // Чтобы выйти из цикла присваиваем переменной-флагу значение 1 (любое отличное от нуля)
            WAITMS(1000)
         END_IF
         //
      END_IF
      //
      WAITMS(500) // Частота цикла
      //
   END_CYC // Конец цикла
   //
END_SUB // Конец описания подпрограммы "MYSUB"

MYSUB() // Вызываем подпрограмму "MYSUB"

HALT

Ребят, спасибо большое - я просмотрю попозже. Мне остыть чуток надо  :) А пока хочу выложить макрос, в котором ответ на вопрос, который я тут искал двое суток, но только моим языком. Это на тот случай, если вдруг еще кто-нибудь, вроде меня, озадачится этим вопросом.

Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF_PIXEL_IN(1387,19, 1387,19, 9099498) // Ищем пиксель
      $vasya_pupkin = 1 // Тут называем результат именем "$vasya_pupkin" и ставим "1", что для нас и для кликера будет значить, что результат положительный. То есть - пиксель найден.
   Else
      $vasya_pupkin = 0 // Аналогично, называем результат именем "$vasya_pupkin" и ставим "0", что означает, что пиксель не был найден.
   END_IF
END_SUB

MYSUB()  // Собственно вызов подпрограммы

IF($vasya_pupkin = 1) // Команда видит, что в подпрограмме был найден пиксель и выполняет действие - BEEP(300,200)
   BEEP(300,200) // Низкий сигнал
Else
   $vasya_pupkin = 0 // Тут команда видит, что в подпрограмме не был найден пиксель и и выполняет действие - BEEP(800,200)
   BEEP(800,200) // Высокий сигнал
END_IF

// В данном скрипте будет срабатывать низкий сигнал, если в бодпрограмме пиксель будет найден. Высокий, если пиксель не будет найден. Если переключить наоборот:

IF($vasya_pupkin = 0) // Тут поставить 0
   BEEP(300,200)
Else
   $vasya_pupkin = 1 // А тут 1
   BEEP(800,200)
END_IF

// То будет срабатывать высокий сигнал, если в бодпрограмме пиксель будет найден и низкий, если пиксель не будет найден.

Всё. На сегодня я бухать пошел  :)
« Last Edit: September 12, 2014, 10:43:37 PM by Hito »
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #79 on: September 12, 2014, 06:46:43 PM »
Тогда еще вариации на тему "Поиск Васи Пупкина".  :)  Может еще как то можно это записать?
Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF(PXL(1387,19) = 9099498)
      BEEP(300,200) // Низкий сигнал
   ELSE
      BEEP(800,200) // Высокий сигнал
   END_IF
END_SUB

//-------------------------------- Или так...

SUB(MYSUB)
   GETSCREEN
   SWITCH(PXL(1387,19))
   CASE(9099498)
      BEEP(300,200)
   DEFAULT
      BEEP(800,200)
   END_SWITCH
END_SUB

Да, можно, про PXLCRC() и PXLXOR() чуть не забыл.
« Last Edit: September 12, 2014, 06:50:59 PM by Atas »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #80 on: September 13, 2014, 03:56:23 AM »
Тогда еще вариации на тему "Поиск Васи Пупкина".  :)  Может еще как то можно это записать?
Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF(PXL(1387,19) = 9099498)
      BEEP(300,200) // Низкий сигнал
   ELSE
      BEEP(800,200) // Высокий сигнал
   END_IF
END_SUB

//-------------------------------- Или так...

SUB(MYSUB)
   GETSCREEN
   SWITCH(PXL(1387,19))
   CASE(9099498)
      BEEP(300,200)
   DEFAULT
      BEEP(800,200)
   END_SWITCH
END_SUB

Да, можно, про PXLCRC() и PXLXOR() чуть не забыл.

Ты меня убить хочешь?  ;D Опять незнакомые команды...

Ребят, бухнул я сегодня с соседом и посмотрели мы приключения Шурика, а сам никак не могу удержать мысли от дальнейшего развития событий в этой теме... А могу я поставить не два, а три флага? И потом определять по ним состояние перса и решать - в какой из трех подпрограм его направить. Вот так:

Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Хп перса
      IF_PIXEL_IN(0,0, $_xmax,$_ymax, 366) // Хп моба
         $sostoyanie = 2 // И перс, и моб живы.
      Else
         $sostoyanie = 1 //  Перс жив - моб слился.
      END_IF
   Else
      $sostoyanie = 0 // ХП перса не видно.
   END_IF
END_SUB

SUB(slepoy boy)
   // Тело
END_SUB

SUB(boy)
   // Тело
END_SUB

SUB(Time Out)
   // Тело
END_SUB

IF($sostoyanie = 1)
   Time Out()
END_IF

IF($sostoyanie = 2)
   boy()
END_IF

IF($sostoyanie = 0)
   slepoy boy()
END_IF
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #81 on: September 13, 2014, 04:31:17 AM »
Уже попробовал - так нельзя...
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #83 on: September 13, 2014, 05:05:13 AM »
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #84 on: September 13, 2014, 12:05:22 PM »
Уже попробовал - так нельзя...
Можно однако. Просто ошибки есть в твоем коде.
Подпрограмму SUB(MYSUB) надо вызывать однако, в строке 25, перед проверкой условий IF($sostoyanie = 1). И имена подпрограмм писать слитно надо, одним словом. Например, SUB(Time_Out) и вызов подпрограммы естественно тоже Time_Out(). В остальном всё OK вроде. Должно работать.  :)

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #85 on: September 13, 2014, 01:21:34 PM »
Оооо!... Сейчас попробуем... Спс ))
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #86 on: September 13, 2014, 01:25:31 PM »
Атас, ты, кстати, не переживай  :) Я до твоих "десертов" и вариаций позже дойду... Не обрадуешься  ;D
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #87 on: September 13, 2014, 01:52:44 PM »
Ес!!!! Получилось!!!  :D Вот теперь - прощай прыжки из подпрограмм по GOTO!
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #88 on: September 13, 2014, 03:50:48 PM »
А вот избавиться от GOTO, без ущерба для сценария (скорость, размер), не удавалось еще никому. Если конечно применение GOTO оправдано в каком-то месте скрипта.
GOTO очень хороший и нужный инструмент, которого многие боятся, только потому, что какой-то там типа "гуру", что то там ляпнул в интернете, что GOTO - зло, "авторитетно" заявляя, что якобы, выпрыгивая из подпрограмм и циклов мы оставляем в памяти "тонны мусора", и что якобы скрипт становится "не читаемым", и прочий бред. Все увещевания программистов (которые даже boot.ini для Windows XP написать не могут) про "хороший тон написания кода" - бред сивой кобылы (просто НЕ "сношайтесь на Красной Площади" и ваш код будет ИДЕАЛЬНЫМ). Какой мусор? Сколько этого мусора? Приведите цифры. Этого не знает НИКТО(!), боюсь, что даже Создатель. Однако, предостережения, касающиеся применения GOTO, из Справки Clickermann'а потихоньку исчезли. Приведите пример скрипта который докажет, что выпрыгивание по GOTO пагубно влияет на что либо. Но даже если это и так, то,  за сколько лет GOTO сожрет мои 16GB оперативки и затормозит работу Core i7, если я запускаю свои скрипты не более чем на 5 часов в сутки, и на ночь комп выключаю?! Всё очень ситуативно.
Другое дело, что не надо пихать GOTO куда ни попадя, это так же относится к сабам, массивам, инклюдам, ... и другим полезным вещам. И трёп, типа - "Вот когда научитесь писать скрипты, тогда сможете обходиться без GOTO..." - это просто тупые понты. Не нравится (не умеете) не пользуйтесь.
НИКТО ПОКА НЕ СМОГ ПОЛНОСТЬЮ ОТКАЗАТЬСЯ ОТ ПРИМЕНЕНИЯ GOTO. Можете опровергнуть?
Название темы "помогите мне вылечиться от goto", звучит как "Помогите мне кастрировать Clickermann !!!". Лучше бы просили избавиться от STRCONCAT, явный же костыль (для языка столь высокого уровня).
Вот такое мое мнение. Я хозяин_своих_сценариев(!) - как_хочу_так_и_пишу. И если это работает, то почему бы и нет? Это не значит, что я отказываюсь учиться и слушать советы тех кто знает лучше, не надо путать. Но экспериментировать то "с тем что нельзя" тоже надо. :)

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #89 on: September 13, 2014, 04:33:22 PM »
Вот такое мое мнение. Я хозяин_своих_сценариев(!) - как_хочу_так_и_пишу. И если это работает, то почему бы и нет? Это не значит, что я отказываюсь учиться и слушать советы тех кто знает лучше, не надо путать. Но экспериментировать то "с тем что нельзя" тоже надо. :)

Я примерно так и думаю  :) Я тут уже как-то говорил (на этом форуме - не помню, где) - "Не я же прыгаю, а кликер... Дак почему не заставить его прыгать, если у него это получается?" Я согласен с тобой. Но в моем случае... Я не мало узнал, пытаясь избавиться от GOTO  :) Правда вас напряг - сорри...
Я не ду... Потому и не бу...