Author Topic: Пошоговые действия.Рандомные события - действия к ним  (Read 1895 times)

0 Members and 1 Guest are viewing this topic.

Jet

  • Зашел в гости
  • *
  • Posts: 2
  • Как-то так..
    • View Profile
Есть скрипт, он выполняет пошагово задания в игре, которые идут строго по порядку и элементы на экране появляються строго в определенной области. Ищу картинку/пиксел-кликаю по нему-жду пока пропадет-иду дальше и так по кругу.

Суть скрипта заключается:
1. Ожидает изображение с таймером
2. Если не нашел изображение с таймером - шаг назад к пункту 3 предыдущего такого-же сценария.
2.1 Снова ищу изображение/пиксель с таймером (если не нашел)
3. Если нашел - клик по нему ПОКА не исчезнет в установленное время

Как вижу это я:

Первое действие:
Code: (clickermann) [Select]
//
///Mission2
//
//
//
//
///Ожидаю пиксель
WHILE($time > $_time_t)     
   GETSCREEN (817,586,950,623)
   COLORMODE (8)
   IF_PICTURE_IN (817,586,950,623, "screens\Mission1.bmp", -1, 100)
      $time = 0
      print(Распознал_Mission1)
      WAITMS(100)
     
   END_IF
   waitms(100)
END_CYC
//
//
//
//
///Если не распознал
IF($time ! 0)

//Ожидаю предыдущее исчезновение пикселя
print(Не_распознал_Mission1)
$time = $_time_t + 10
WHILE($time > $_time_t)   
   GETSCREEN (990,217,1006,272)
   IF_PIXEL_IN (990,217,1006,272, 16053655)
   print(Действую_Mission0)
      waitms(300)
LCLICK($_return1, $_return2+10)
      waitms(500)
   ELSE
   $time = 0 
   waitms(100)
   print(Дальше)
   END_IF
END_CYC
//
//
//
//
///Снова ищу картинку
$time = $_time_t + 90
WHILE($time > $_time_t)     
   GETSCREEN (817,586,950,623)
   COLORMODE (8)
   IF_PICTURE_IN (817,586,950,623, "screens\Mission1.bmp", -1, 100)
      $time = 0
      print(Распознал_Mission1)
      WAITMS(100)
   END_IF
   waitms(100)
END_CYC

END_IF
//
//
//
//
///Ожидаю исчезновения картинки после нажатия на нее
$time = $_time_t + 10
WHILE($time > $_time_t)
 
   GETSCREEN (817,586,950,623)
   COLORMODE (8)
   IF_PICTURE_IN (817,586,950,623, "screens\Mission1.bmp", -1, 100)
   print(Действую_Mission1)
      waitms(300)
LCLICK($_return1, $_return2)
      waitms(500)
   ELSE
   $time = 0 
   waitms(100)
   print(Дальше)
   END_IF
END_CYC
 
IF($time > 0)
   print(Время_ожидания_исчерпано_Mission1)
   
END_IF

Второе дейстиве:
Code: (clickermann) [Select]
//
///Mission2
//
//
//

///Ожидаю пиксель
$time = $_time_t + 240
WHILE($time > $_time_t)     
   GETSCREEN (400,585,581,623)
   IF_PIXEL_IN (400,585,581,623, 10538475)
      $time = 0
      print(Распознал_Mission2)
      WAITMS(100)
     
   END_IF
   waitms(100)
END_CYC
//
//
//
///Если не распознал
IF($time ! 0)


///Ожидаю предыдущее исчезновение картинки
print(Не распознал_Mission2)

$time = $_time_t + 10
WHILE($time > $_time_t)
print(Возвращаюсь_на_шаг_назад) 
   GETSCREEN (817,586,950,623)
   IF_PIXEL_IN (817,586,950,623, 11197951)
   print(Действую_Mission1)
      waitms(300)
LCLICK($_return1, $_return2+10)
      waitms(500)
   ELSE
   $time = 0 
   waitms(100)
   print(Дальше)
   END_IF
END_CYC
//
//
//
//
///Снова ищу пиксель
$time = $_time_t + 190
WHILE($time > $_time_t)     
   GETSCREEN (400,585,581,623)
   IF_PIXEL_IN (400,585,581,623, 10538475)
      $time = 0
      print(Распознал_Mission2)
      WAITMS(100)
   END_IF
   waitms(100)
END_CYC

END_IF
//
//
//
//
//
///Ожидаю исчезновения картинки после нажатия на нее
$time = $_time_t + 10
WHILE($time > $_time_t)   
   GETSCREEN (400,585,581,623)
   IF_PIXEL_IN (400,585,581,623, 10538475)
   print(Действую_Mission2)
      waitms(300)
LCLICK($_return1, $_return2+10)
      waitms(500)
   ELSE
   $time = 0 
   waitms(100)
   print(Дальше)
   END_IF
END_CYC
 
IF($time > 0)
   print(Время_ожидания_исчерпано_Mission2)
   
END_IF

Каждое вот такое действие я пишу в отдельном файле и вызываю через #include в основном файле - суть которого заключается тупо распаковать чтобы не захламлять.
Например:

Code: (clickermann) [Select]
#include "steps\Mission1.cms"
waitms(3500)
#include "steps\Mission2.cms"
waitms(3500)

и так далее.Таких действий инклюдов в основном файле сотни лежат поочереди


Вобщем,правильно ли это дело написано,есть ли способ улучшить это,упростить как-то итд
Можно ли пользоваться Include в таких количествах (у меня их примерно 300-350шт)
не замедляет ли он весь скрипт?

После этих пошаговых действий идут рандомные события на которые я должен реагировать:

1. Кликаю на картинку/пиксель и после него может появиться одна из 3 разных картинок в разных координатах одновременно
2. нужно чтобы скрипт их искал с таймером, и предпринимал разные действия к разным картинкам исходя из того какую нашел
3. действия должны быть такие как в первом скрипте (жду элемент с таймером-кликаю на него пока не пропадет-если не нашел делай шаг назад - иду дальше)

Я знаю, что это делается примерно так,через Else:
Code: (clickermann) [Select]
//
//
//
///BLITZ2_Stamina
//
//
$time = $_time_t + 15
print(Ожидаю_BLITZ2_Stamina)
WHILE($time > $_time_t)     
   GETSCREEN (400,72,939,451)
   COLORMODE(7)//BLITZ 2
      IF_PICTURE_IN (574,110,791,138, "screens\blitz2.bmp", -1, 100)
      $time = 0
     
   print(Захожу_Blitz2)
      waitms(100)
   END_IF

     
      ELSE //Stamina
     
      IF_PIXEL_IN (408,314,939,451, 2281723 )
      $time = 0
      WAITMS(100)
            print(Действую_Stamina)
            waitms(300)
            LCLICK(687,525)  // 3422304
            waitms(1500)   
            LCLICK(1141,97)  // 4950978 
            waitms(100)
      END_IF

ELSE //PVP
     
      IF_PIXEL_IN (108,314,339,651, 1282723 )
      $time = 0
      WAITMS(100)
            print(Действую_PVP)
            waitms(300)
    LCLICK(687,525)  // 3422304
            waitms(1500)   
            LCLICK(1141,97)  // 4950978 
            waitms(100)
      END_IF
END_CYC

Но когда я после ифов елсов пишу еще свои ифы елсы циклы итд - оно все не работает:(
Короче,я хочу вставить код(примерно такую логику действий) в Елсы как в первом скрипте.Мне не достаточно простых процедур т.к. нужно еще чтобы проверяло исчезновение картинки с таймером и так далее.

Буду безумно благодарен любой помощи,любому совету.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Вобщем,правильно ли это дело написано,есть ли способ улучшить это,упростить как-то итд
Способ улучшить есть почти всегда. Используй подпрограммы.
Непонятна роль куска в районе строк 46-58. Он лишний. Дальше идёт этот же поиск опять.

Можно ли пользоваться Include в таких количествах (у меня их примерно 300-350шт)
не замедляет ли он весь скрипт?
Можно. Работу не замедляет. Может будет чуть дольше старт.


Дальше порядок действий непонятен, но код неправильный в любом случае.
Но когда я после ифов елсов пишу еще свои ифы елсы циклы итд - оно все не работает:(
Естественно. У блока WHILE не может быть своих ELSE. У тебя получается если посмотреть в упрощённом виде
Code: (clickermann) [Select]
WHILE($time > $_time_t)
    IF_PICTURE_IN (574,110,791,138, "screens\blitz2.bmp", -1, 100)

    END_IF 
ELSE //Stamina   
    IF_PIXEL_IN (408,314,939,451, 2281723 )

    END_IF   
ELSE //PVP   
    IF_PIXEL_IN (108,314,339,651, 1282723 )

    END_IF
END_CYC
ELSE бывают только в блоках IF и только по 1 штуке. Всё остальное делается вложенностью.


Мне не достаточно простых процедур т.к. нужно еще чтобы проверяло исчезновение картинки с таймером и так далее.
И почему здесь недостаточно процедур?

появиться одна из 3 разных картинок в разных координатах одновременно
Чтобы правильно написать этот кусок, нужно понимать что нужно. Код совсем не соответствует описанию, в нём нет поиска 3 картинок нив каком порядке.
Все вот эти "Кликаю на картинку/пиксель"  "действия к разным картинкам" и прочие общие слова ясности не добавляют. Нужно писать конкретно с привязкой к показанному коду.
Например: ищем картинку P1.bmp, должна обязательно/необязательно появится одна из/одна или несколько сразу  - P10.bmp, P20.bmp, P30.bmp
Нужно ждать пока появятся - все сразу/все по очереди/хотя бы одна и т.д. Что делаем после того как появилась. Что делать если не появилась.

« Last Edit: April 23, 2021, 05:50:32 PM by Vint »


Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
300-350 инклудов, чтобы не захламлять? Серьёзно?  А если строго определённые координаты элементов сместятся, что тогда? Это какой-то собственно ручный ад.  :D
« Last Edit: April 23, 2021, 06:06:49 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Если есть одинаковые куски по последовательности - выноси в подпрограммы. Типа такого
Code: (clickermann) [Select]
SUB(search_pic, $sp_x1, $sp_y1, $sp_x2, $sp_y2, $sp_pic, $sp_mode)
    $time = $_time_t + 10
    WHILE($time > $_time_t)
        GETSCREEN($sp_x1, $sp_y1, $sp_x2, $sp_y2)
        COLORMODE(8, $sp_x1, $sp_y1, $sp_x2, $sp_y2)
        IF_PICTURE_IN($sp_x1, $sp_y1, $sp_x2, $sp_y2, STRCONCAT("screens\", $sp_pic, ".bmp"))
            IF($sp_mode = 1)
                $time = 0
                print("Распознал_", $sp_pic)
            ELSE
                print("Действую_", $sp_pic)
                LCLICK($_return1, $_return2)
                waitms(500)
            END_IF
        ELSE
            IF($sp_mode = 1)       
            ELSE
                $time = 0
                print("Дальше")
            END_IF
        END_IF
        waitms(100)
    END_CYC 
END_SUB

//
///Mission2
//
search_pic(817,586,950,623, "Mission1", 1)  // 1 - режим ожидает появления

// Если не распознал
IF($time ! 0)
    //Ожидаю предыдущее исчезновение пикселя
    print("Не_распознал_Mission1")
    $time = $_time_t + 10
    WHILE($time > $_time_t)
        GETSCREEN (990,217,1006,272)
        IF_PIXEL_IN (990,217,1006,272, 16053655)
            print("Действую_Mission0")
            waitms(300)
            LCLICK($_return1, $_return2+10)
            waitms(500)
        ELSE
            $time = 0
            waitms(100)
            print("Дальше")
        END_IF
    END_CYC
END_IF

///Ожидаю исчезновения картинки после нажатия на нее
search_pic(817,586,950,623, "Mission1", 2)  // 2 - режим ожидает пропадания

IF($time > 0)
    print("Время_ожидания_исчерпано_Mission1")
END_IF

Если вся последовательность повторяется несколько раз, можно её оформить в подпрограмму уровнем выше. Или переделать существующую в более плоский вид.

Непонятно что делаем если не нашлось за установленное время. Неужели просто оповещение.

Ну и да, с координатами областей можно что-то сделать. Ведь там наверняка одни и те же зоны для подобных действий. Таких зон 5-10, да неважно сколько. Можно задать переменным, тогда можно всё ещё сильнее укоротить.
« Last Edit: April 23, 2021, 06:20:48 PM by Vint »


Jet

  • Зашел в гости
  • *
  • Posts: 2
  • Как-то так..
    • View Profile
Quote
Непонятна роль куска в районе строк 46-58. Он лишний. Дальше идёт этот же поиск опять.
Да, (я тогда не знал про GOTO) но только тогда, когда условие ложно - сперва он ищет предыдущий пиксель/картинку,который был еще в предыдущем include'e - действует с ним - снова ищет текущий пиксель в текущем скрипте(include'e)

Quote
появиться одна из 3 разных картинок в разных координатах одновременно
Чтобы правильно написать этот кусок, нужно понимать что нужно. Код совсем не соответствует описанию, в нём нет поиска 3 картинок нив каком порядке.
Все вот эти "Кликаю на картинку/пиксель"  "действия к разным картинкам" и прочие общие слова ясности не добавляют. Нужно писать конкретно с привязкой к показанному коду.
Например: ищем картинку P1.bmp, должна обязательно/необязательно появится одна из/одна или несколько сразу  - P10.bmp, P20.bmp, P30.bmp
Нужно ждать пока появятся - все сразу/все по очереди/хотя бы одна и т.д. Что делаем после того как появилась. Что делать если не появилась.
Ищем картинку с таймером P1.bmp, должна обязательно появится одна из P1.bmp, P2.bmp, P3.bmp, P4.bmp сразу.
Нужно ждать пока появятся - хотя бы одна. После того как появилась делаем клик по картинке (Р1 - клик 10 раз, к Р2-Р4 это не применяется) и ожидаем исчезновение. Если не появилась - возвращение к предыдущему такому же условию которое вызвало картинку Р1.

Грубо говоря если нашел Р1 выполнил действия, то все ок - иди дальше к следующим include'ам искать картинки по списку. Если нашел Р2-Р4 - то ищи картинки еще в этом условии с таймерами на появление и исчезновение.
Насколько я понял это можно реализовать через подпрограммы вызывая их.

Почему мне не подходят обычные процедуры для каждой отдельной картинки? - потому что мне нужно ожидать картинку и ожидать исчезновения. После Else'a уже находясь в цикле я не могу его вызвать снова пока он не закончится и я не выйду с условия.

Для общей картины обьясню, что вообще происходит. Я нажимаю на кнопку которая повышает мой лвл(Р1) - когда я делаю это, может произойти 1 из 3 событий, из-за которых выскакивает новое окно: (Р2)недостаточно энергии, (Р3)недостаточно талонов, (Р4)новый уровень.
Соответственно когда мне выскакивает 1 из 3 окон я должен нажать на него и еще понажимать несколько картинок после него чтобы вернуться к Р1 и продолжить сценарий.

Вроде так, если нашел Р2-Р4 - кликаю на него и делаю другие действия (sub), ищу следующие картинки еще в этом условии и потом выхожу из него и иду дальше по сценарию по include'ам.
Как в одной подпрограмме искать несколько картинок поочереди например 5 раз путем повышения числа переменной $action_pic.
И если не нашел например вторую (pvp2) картинку - возвращалось на предыдущую (pvp1) - в конце повышения числа должно искать pvp5.bmp
Если не нашел первую (pvp1) - возвращайся к условию которое вызвало подпрограмму 63 строка(тоесть это уже выход из программы,если такое возможно)

Пример для понимания:
Code: (clickermann) [Select]
                               

SUB(action1, $sp_x1, $sp_y1, $sp_x2, $sp_y2, $action1_pic,$action_mode)

//====================// Координаты PVP
$sp_x1 = 902
$sp_y1 = 98
$sp_x2 = 923
$sp_y2 = 147
//====================


//====================// Название картинки - "pvp1"   
$action1_pic = pvp1                                   
//====================
 
   $time = $_time_t + 10
    WHILE($time > $_time_t)
        GETSCREEN($sp_x1, $sp_y1, $sp_x2, $sp_y2)
        COLORMODE(7, $sp_x1, $sp_y1, $sp_x2, $sp_y2)
        IF_PICTURE_IN($sp_x1, $sp_y1, $sp_x2, $sp_y2, STRCONCAT("screens\", $action1_pic, ".bmp"))
                IF($action_mode = 1)
               $time = 0
                print("Распознал_", $action1_pic)
            ELSE
                print("Действую_", $action1_pic)
                LCLICK($_return1, $_return2)
                waitms(500)
            END_IF
        ELSE
            IF($action_mode = 1)       
            ELSE
                $time = 0
                print("Дальше")
            END_IF
        END_IF
        waitms(100)
    END_CYC
IF($time ! 0)
print("Не_распознал")
//И если не нашел например вторую (pvp2) картинку - возвращалось на предыдущую (pvp1)
END_IF

END_SUB


FOR ($i, $i<10)// кликнуть 10 раз на Р1
   $time = $_time_t + 10 // таймер на 10 секунд
   WHILE($time > $_time_t)
   GETSCREEN
   COLORMODE (7)
   
   IF_PICTURE_IN (0,0,100,200, $_xmax,$_ymax, "screens\P1.bmp", -1, 100)
      $time = 0
      LCLICK($_return1, $_return2)
      WAITMS(100)
END_CYC     
      ELSE
         IF_PICTURE_IN (902,98,923,147, "screens\P2.bmp", -1, 100)
         $time = 0
         LCLICK($_return1, $_return2)
         //вызываю подпрограмму чтобы выполнить действия
         action1($sp_x1, $sp_y1, $sp_x2, $sp_y2, $action1_pic, 1)
         action1($sp_x1, $sp_y1, $sp_x2, $sp_y2, $action1_pic, 2)
         // и так далее вызывать
   
         ELSE
            IF_PICTURE_IN (750,230,910,300, $_xmax,$_ymax, "screens\P3.bmp", -1, 100)
            $time = 0
            LCLICK($_return1, $_return2)
            //вызываю подпрограмму чтобы выполнить действия
         action2()
         // и так далее вызывать
           
            ELSE
               IF_PICTURE_IN (470,560,610,650, "screens\P4.bmp", -1, 100)
               $time = 0
               LCLICK($_return1, $_return2)
               //вызываю подпрограмму чтобы выполнить действия
         action3()
         // и так далее вызывать
               END_IF
            END_IF
        END_IF   
   END_IF         
END_CYC


IF($time ! 0)
// время истекло, ни одна из картинок не найдена
END_IF


« Last Edit: April 25, 2021, 07:22:27 PM by Jet »