Author Topic: Подстановка двух значений в условии IF  (Read 4665 times)

0 Members and 3 Guests are viewing this topic.

HasTigeR

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Добрый день, вот код

Code: (clickermann) [Select]
DEFINE($a)
FOR($a, $a < 20)
GETSCREEN($nkan_x,$nkan_y,$nkan_x+1,$nkan_y+1)
DEFINE($nkan)
$nkan = PXL($nkan_x,$nkan_y)
PRINT("nkan", $nkan)
IF($nkan = 11862012)            //если на главном окне
goto(zagr)
ELSE
WAIT(1)
END_IF
END_CYC
goto(end)
zagr:
UNDEFINE($nkan)
UNDEFINE($a)
DEFINE($a)
FOR($a,$a < 60) //проверка не идёт ли загрузка
DEFINE($zagr)
GETSCREEN($zagr_x,$zagr_y,$zagr_x+1,$zagr_y+1)
$zagr = PXL($zagr_x,$zagr_y)
PRINT("zagr",$zagr)
IF ($zagr = 16579068) // подставить 16579068 если метаморфоз или 1600355 если стандартное древо
goto(arena)
ELSE
WAIT(1)
END_IF
END_CYC
goto(end)
arena:
UNDEFINE($a)
UNDEFINE($zagr)
LCLICK($arena_x,$arena_y)  //идем на арену

Как правильно прописать два условия в строку
Code: (clickermann) [Select]
IF ($zagr = 16579068) // подставить 16579068 если метаморфоз или 1600355 если стандартное древо
потому что такие коды почему то
Code: (clickermann) [Select]
IF ($zagr = 16579068 ^  $zagr = 1600355)
IF ($zagr = 16579068 |  $zagr = 1600355)
IF ($zagr = (16579068 ^1600355))
не работают
заранее спасибо

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Немного поправил. Выпрыгивать из циклов по goto() ЗАПРЕЩЕНО!
Code: (clickermann) [Select]
FOR($a=0, $a < 20)
   GETSCREEN($nkan_x,$nkan_y,$nkan_x+1,$nkan_y+1)
   $nkan = PXL($nkan_x,$nkan_y)
   PRINT("nkan", $nkan)
   IF($nkan = 11862012)            //если на главном окне
      $a=99
      FOR($b=0,$b < 60) //проверка не идёт ли загрузка
         GETSCREEN($zagr_x,$zagr_y,$zagr_x+1,$zagr_y+1)
         $zagr = PXL($zagr_x,$zagr_y)
         PRINT("zagr",$zagr)
         IF (($zagr = 16579068)|($zagr = 1600355)) // подставить 16579068 если метаморфоз или 1600355 если стандартное древо
            $b=99
            LCLICK($arena_x,$arena_y)  //идем на арену
         ELSE
            WAIT(1)
         END_IF
      END_CYC
   ELSE
      WAIT(1)
   END_IF
END_CYC
« Last Edit: July 11, 2017, 06:05:50 PM by open_78 »

HasTigeR

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Немного поправил. Выпрыгивать из циклов по goto() ЗАПРЕЩЕНО!
Почему запрещено? проблема в том что мне надо что то вроде проверок на ошибки, то есть 
Code: (clickermann) [Select]
DEFINE($a)
FOR($a, $a < 20)
GETSCREEN($nkan_x,$nkan_y,$nkan_x+1,$nkan_y+1)
DEFINE($nkan)
$nkan = PXL($nkan_x,$nkan_y)
PRINT("nkan", $nkan)
IF($nkan = 11862012)            //если на главном окне
goto(zagr)
ELSE
WAIT(1)
END_IF
END_CYC
goto(end)
....
end:
IF (проверка)
//исправить и начать цикл заново
ELSE IF(следующая проверка)
//исправить и начать цикл заново
ELSE
....
...
END_IF
END_IF
и так по отношению почти к каждому циклу. Что то вроде тотального контроля. И я вообще не представляю как это сделать без goto. Точнее представляю, но код будет в разы объёмнее.
И еще, разве объявлять переменные не требуется? у вас в коде DEFINE отсутствует, и такое не в первые вижу. Не пойму этой механики

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Нет не требуется. Кликер сам при первом упоминании объявляет переменную. Функция DEFINE может пригодиться если нужно объявить переменную с каким то начальным значением и после не менять это значение пока переменная существует
Code: (clickermann) [Select]
DEFINE($a, 1000)
LOGWRITE ($a)
INC($a,1)
WAITMS(500)

Выпрыгивать из циклов и подпрограмм нельзя. Конечно если ты так напишешь кликер молчком будет молотить код но это неминуемо приведет к глюкам. Потому что выполнение, для себя, не вышло из подпрограммы или цикла, и когда ты снова войдешь в подпрограмму то кликер подумает что ты входишь в подпрограмму в подпрограмме.
Вот пример показывающий глюк
Code: (clickermann) [Select]
SUB(prog, $a)
   skip:
   WHILE($q < 3)   
      inc($q)
      print($q)
      GOTO(skip)
   END_CYC
   print($a," в подпрограмме")
END_SUB

print("начало")

prog("подпрограмма")

print("конец")

HALT
Лог:
Code: [Select]
21:10:04 начало
21:10:04 1
21:10:04 2
21:10:04 3
21:10:04 подпрограмма в подпрограмме
21:10:04 0 в подпрограмме
21:10:04 0 в подпрограмме
21:10:04 0 в подпрограмме
21:10:04 конец

Кликер подумал что было 3 вложенных цикла и поэтому еще три раза прокрутил подпрограмму написав 0 в подпрограмме чего в нормальном скрипте быть не может.

HasTigeR

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Спасибо, понял, то есть первый проход будет нормальный, а потом глюки. Тогда такой код будет рабочим?
Code: (clickermann) [Select]
FOR($c = 0, $c < 300)
FOR($a = 0, $a < 15)
IF(условие)
$a = 16
ELSE
WAIT(1)
END_IF
END_CYC
IF ($a = 14)
#include "error cms"
goto(end)
END_IF
FOR($a = 0, $a < 15)
IF(условие)
$a = 16
ELSE
WAIT(1)
END_IF
END_CYC
IF ($a = 14)
#include "error cms"
goto(end)
END_IF
end:
END_CYC
а в файле error.cms
Code: (clickermann) [Select]
IF(//проверка)
//устранение ошибки
goto(endEr)
ELSE
IF(//проверка)
//устранение ошибки
goto(endEr)
ELSE
IF
...
goto(endEr)
ELSE
END_IF
END_IF
END_IF
Вроде goto не в циклах получается. А то меня вложенные циклы выше немного смутили)
« Last Edit: July 11, 2017, 08:43:55 PM by HasTigeR »

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Code: (clickermann) [Select]
FOR($a = 0, $a < 15)
   IF(условие)
      $a = 16  //  если условие верно прерываем цикл
   ELSE
      WAIT(1)
   END_IF
   //  Цикл наращивает переменную в этом месте. А это значит что при выходе из цикла переменная будет равна:  В случае если условие верно - 17, если не верно - 15.
END_CYC

IF ($a = 14)  //  Значит это условие не сработает.
   #include "error.cms"  //  если эта строка находится внутри цикла, и в файле error.cms есть переход на метку, а сама метка находится за пределами цикла, это считается "прыжком" из него.
   goto(end)
END_IF

HasTigeR

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Code: (clickermann) [Select]
FOR($a = 0, $a < 15)
   IF(условие)
      $a = 16  //  если условие верно прерываем цикл
   ELSE
      WAIT(1)
   END_IF
   //  Цикл наращивает переменную в этом месте. А это значит что при выходе из цикла переменная будет равна:  В случае если условие верно - 17, если не верно - 15.
END_CYC

IF ($a = 14)  //  Значит это условие не сработает.
   #include "error.cms"  //  если эта строка находится внутри цикла, и в файле error.cms есть переход на метку, а сама метка находится за пределами цикла, это считается "прыжком" из него.
   goto(end)
END_IF
да спасибо, немного ошибся. Не подумал что он всё равно нарастит ещё единицу после прерывания цикла.
Code: (clickermann) [Select]
FOR($c = 0, $c < 300)
FOR($a = 0, $a < 15)
IF(условие)
$a = 16
ELSE
WAIT(1)
END_IF
END_CYC
IF ($a = 15)
#include "error.cms"
goto(end)
END_IF
FOR($a = 0, $a < 15)
IF(условие)
$a = 16
ELSE
WAIT(1)
END_IF
END_CYC
IF ($a = 15)
#include "error.cms"
goto(end)
END_IF
end:
END_CYC
error.cms
Code: (clickermann) [Select]
IF(//проверка)
//устранение ошибки
goto(endEr)
ELSE
IF(//проверка)
//устранение ошибки
goto(endEr)
ELSE
IF
...
goto(endEr)
ELSE
END_IF
END_IF
END_IF
endEr:
Так будет работать?

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Работать будет. Но лучше избавляйся от goto(). Ну ооочень у тебя их много.  :)
В error.cms они вообще не нужны. Там в любом случае все придет в нужное место.
« Last Edit: July 11, 2017, 11:29:35 PM by open_78 »

HasTigeR

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Работать будет. Но лучше избавляйся от goto(). Ну ооочень у тебя их много.  :)
В error.cms они вообще не нужны. Там в любом случае все придет в нужное место.
ну уже появилась идея свитчем делать error.cms, потом подумаю :D главное принцип работы понял :)
не хватает операторов типа break; continue; из с++ мне)