Author Topic: Помогите с циклом  (Read 1631 times)

0 Members and 1 Guest are viewing this topic.

Dimon

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Помогите с циклом
« on: May 31, 2015, 06:22:38 PM »
Цикл возникает там, где его по идее быть не должно....когда бой закончен, скрипт начинает применять лечение, вместо того, чтобы продолжить и перейти к следующему действию.
Code: (clickermann) [Select]
$check = 0    // начинаем бить
WHILE($check = 0)
GETSCREEN
COLORMODE(6)
IF_PIXEL_IN(1166,136, 1178,163, 4177791) // если нашли хп врага
   $check1 = 0    // ищем свои хп
   WHILE($check1 = 0)
   GETSCREEN
   COLORMODE(6)
   IF_PIXEL_IN(314,135, 316,157, 4177791) //ищем полоску своих хп
      $check1 = 0 //если нашли
      GOTO(f1) //то переходим по метке
   ELSE // если не нашли,продолжаем
      LCLICK(274,375) // применяем бинт
      WAITMS(200)
   END_IF
   f1://метка
    LCLICK(1198, 149) //атакуем соперника
   WAITMS(300)
ELSE
   $check = 1 //если не нашли хп соперника, прерываем цикл и продолжаем
END_IF
END_CYC

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Помогите с циклом
« Reply #1 on: May 31, 2015, 07:10:10 PM »
Потому что там у тебя ошибка, и вообще правильнее видимо будет так
Code: (clickermann) [Select]
$check = 0    // начинаем бить
WHILE($check = 0)
   GETSCREEN
   COLORMODE(6)
   IF_PIXEL_IN(1166,136, 1178,163, 4177791) // если нашли хп врага
      IF_PIXEL_IN(314,135, 316,157, 4177791) //ищем полоску своих хп
         LCLICK(1198, 149) //атакуем соперника
         WAITMS(300)
      ELSE // если не нашли,продолжаем
         LCLICK(274,375) // применяем бинт
         WAITMS(500)
      END_IF
   ELSE
      $check = 1 //если не нашли хп соперника, прерываем цикл и продолжаем
   END_IF
END_CYC

Dimon

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Помогите с циклом
« Reply #2 on: May 31, 2015, 07:32:20 PM »
Спасибо огромное, а то уже бестолковку чуть не сломал, комбинируя с этим вопросом)

Dimon

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Помогите с циклом
« Reply #3 on: June 01, 2015, 12:04:29 AM »
Если можно, укажите мою ошибку(ошибки), часть кода совсем не запускается(( заранее благодарю
Code: (clickermann) [Select]
s2: // метка2, ожидание хода
// ждем загрузку арены и своего хода
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (693,67, 743,98, "Hod_arena.bmp", -1, 30)
      $check = 1
      GOTO(s1) // перейти к метке 1 и начать бой
   ELSE
      WAITMS(50)
   END_IF
END_CYC
s1:
// начинаем бой
WAIT(2)
$check = 0
WHILE($check = 0)
   GETSCREEN
   COLORMODE(6)
   IF_PIXEL_IN(300,72, 411,98, 4177791) // если нашли свои хп
      IF_PICTURE_IN (1017,63, 1065,184, "zvezda_arena.bmp", -1, 80) // ищем игрока
         GETSCREEN
         COLORMODE(6)
         IF_PIXEL_IN($_return1-40,$_return2-31, $_return1+142,$_return2, 4177791) // если у игрока есть хп
            WAIT(1)
            LCLICK(274,382) // лечимся
            WAIT(1)
            LCLICK(274,337) //берем заряд
            WAIT(1)
            LCLICK($_return1, $_return2-7) //бьем игрока
            WAIT(5)
            GOTO(s2) //переход к метке 2
         END_IF
      ELSE // если не нашли игрока
         GETSCREEN
         IF_PICTURE_IN (950,60, 1165,200, "shturm_arena.bmp", -1, 75) // ищем бота
            GETSCREEN
            COLORMODE(6)
            IF_PIXEL_IN($_return1-40,$_return2-31, $_return1+142,$_return2, 4177791) //если у бота есть хп
               WAIT(1)
               LCLICK(274,382) // лечимся
               WAIT(1)
               LCLICK(274,337) //берем заряд
               WAIT(1)
               LCLICK($_return1, $_return2-7) //бьем бота
               WAIT(5)
               GOTO(s2)// перейти к метке2
            END_IF
         ELSE
            WAITMS(100)
         END_IF
      END_IF
   END_IF
END_CYC
//бой закончен, выходим в меню

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Помогите с циклом
« Reply #4 on: June 01, 2015, 07:54:39 AM »
Нельзя выпрыгивать из циклов через ГОТО.
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (693,67, 743,98, "Hod_arena.bmp", -1, 30) // ждем загрузку арены и своего хода
      // начинаем бой
      WAIT(2)
      GETSCREEN
      COLORMODE(6)
      IF_PIXEL_IN(300,72, 411,98, 4177791) // если нашли свои хп
         IF_PICTURE_IN (1017,63, 1065,184, "zvezda_arena.bmp", -1, 80) // ищем игрока
            IF_PIXEL_IN($_return1-40,$_return2-31, $_return1+142,$_return2, 4177791) // если у игрока есть хп
               WAIT(1)
               LCLICK(274,382) // лечимся
               WAIT(1)
               LCLICK(274,337) //берем заряд
               WAIT(1)
               LCLICK($_return1, $_return2-7) //бьем игрока
               WAIT(5)
            END_IF
         ELSE
            // если не нашли игрока
            GETSCREEN
            IF_PICTURE_IN (950,60, 1165,200, "shturm_arena.bmp", -1, 75) // ищем бота
               GETSCREEN
               COLORMODE(6)
               IF_PIXEL_IN($_return1-40,$_return2-31, $_return1+142,$_return2, 4177791) //если у бота есть хп
                  WAIT(1)
                  LCLICK(274,382) // лечимся
                  WAIT(1)
                  LCLICK(274,337) //берем заряд
                  WAIT(1)
                  LCLICK($_return1, $_return2-7) //бьем бота
                  WAIT(5)
               END_IF
            ELSE
               WAITMS(100)
            END_IF
         END_IF
      END_IF
   ELSE
      // если нет Hod_arena.bmp
      WAITMS(50)
   END_IF
END_CYC

Смысл цикла
Code: (clickermann) [Select]
$check = 0 // задаем переменной значение
WHILE($check = 0) // в условии цикла, каждый раз в начале проверяется это значение
   
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
      $check = 1 // если в какой то момент мы изменим значение переменной, то цикл на следующем проходе не повторится! То есть произойдет выход из цикла
      LCLICK($_return1, $_return2)
      WAITMS(100)
   ELSE
      WAITMS(100)
   END_IF   
   
END_CYC
В твоем скрипте нужно какое то условие которое которое прекратит выполнение цикла, а выпрыгивать из цикла куда тебе захочется неьзя, это приводит к ошибкам.

Еще один момент
Code: (clickermann) [Select]
    IF_PICTURE_IN (1017,63, 1065,184, "zvezda_arena.bmp", -1, 80) // ищем игрока
            IF_PIXEL_IN($_return1-40,$_return2-31, $_return1+142,$_return2, 4177791) // если у игрока есть хп
               WAIT(1)
               LCLICK(274,382) // лечимся
               WAIT(1)
               LCLICK(274,337) //берем заряд
               WAIT(1)
               LCLICK($_return1, $_return2-7) // Возвращенные координаты в return относятся к "если у игрока есть хп" !!!
               WAIT(5)
            END_IF
Если нужно кликнуть по "zvezda_arena.bmp" то нужно сохранить значения в каких нибудь переменных.
Code: (clickermann) [Select]
    IF_PICTURE_IN (1017,63, 1065,184, "zvezda_arena.bmp", -1, 80) // ищем игрока
         $savx = $_return1
         $savy = $_return2
            IF_PIXEL_IN($savx-40,$savy-31, $savx+142,$savy, 4177791) // если у игрока есть хп
               WAIT(1)
               LCLICK(274,382) // лечимся
               WAIT(1)
               LCLICK(274,337) //берем заряд
               WAIT(1)
               LCLICK($savx, $savy-7) //бьем игрока
               WAIT(5)
            END_IF

Dimon

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Помогите с циклом
« Reply #5 on: June 01, 2015, 08:22:28 AM »
Code: (clickermann) [Select]
IF_PICTURE_IN (1017,63, 1065,184, "zvezda_arena.bmp", -1, 80) // ищем игрока
            IF_PIXEL_IN($_return1-40,$_return2-31, $_return1+142,$_return2, 4177791) // если у игрока есть хп
               WAIT(1)
               LCLICK(274,382) // лечимся
               WAIT(1)
               LCLICK(274,337) //берем заряд
               WAIT(1)
               LCLICK($_return1, $_return2-7) // Возвращенные координаты в return относятся к "если у игрока есть хп" !!!
               WAIT(5)
            END_IF
Так и задумывалось, т.е. по "звезде" проверяется местоположение игрока(оно может меняться), когда мы его находим, нужно проверить жив он или нет(по наличию полоски хп), далее если жив, то нужно кликнуть именно по полоске хп. за цикл я могу сделать только 1 действие(бой проходит пошагово)-ударить или игрока или бота(в приоритете игрок)