Author Topic: Оптимизация скрипта ( избавление от GOTO)  (Read 1751 times)

0 Members and 1 Guest are viewing this topic.

barnybad

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Здравствуйте, прошу вашей помощи с оптимизацией скрипта, для начала хочу убрать все команды GOTO.
Этот скрипт для игры Eва онлайн. Логика следующая: Сначала проверяется статус дронов, если они простаивают, запускается подпрограмма (СабАтакаПервойЦели)
Далее производится выбор цели, нажатие кнопки захвата цели, ожидание взятия на прицел, после чего производится атака, далее ожидаем пока цель будет уничтожена.
Code: [Select]
//===============Объявление констант=======================
$XFirsttarget = 1065 //  Х координаты первой цели
$YFirsttarget = 80  //  Y координаты первой цели
$XLock = 885        //  X координаты кнопки лока
$YLock = 85          //  Y координаты кнопки лока
$XDron = 620        //  X координаты первого дрона
$YDron = 122         //  Y координаты первого дрона
$Red   = 4145151     // Красный цвет лока
$Green = 4194111     // Зеленый цвет дронов
//===============Описание подпрограмм=====================
SUB(СабАтакаПервойЦели)
   МеткаНачало:
   PRINT("Начало скрипта")
   MOVE  ($XFirsttarget,$YFirsttarget)  // Перевод мыши на первую цель
   WAITMS(500)
   LCLICK($XFirsttarget,$YFirsttarget)  // Выбор первой цели
   WAIT(1)
   MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
   WAITMS(500)
   LCLICK($XLock,$YLock)                // Нажатие мыши на кнопку лока
   WAITMS(500)
   $Zalip = 1 // Переменная счетчик, с ее помощью происходит ожидание выполнения условия (PXL($XLock,$YLock)=$Red)
   МеткаВзятьЦель:
   MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
   WAITMS(500)
   GETSCREEN ($XLock-2,$YLock-2,$XLock+2,$YLock+2)                           // Делаем скрин
   PRINT("Проверка выделения цели " $Zalip)
   COLORMODE(6,$XLock-2,$YLock-2,$XLock+2,$YLock+2) //Упрощаем цвета в области
   IF(PXL($XLock,$YLock)=$Red)  // Проверяем пиксель кнопки лока
      WAITMS(500)
      keypress(#F)       //Атака дронов
      WAITMS(500)
      PRINT("Атака")
   ELSE
      WHILE ($Zalip<8) // Пока переменная меньше 8 переходим на метку (МеткаВзятьЦель)
         inc($Zalip)
         WAIT(2)
         GOTO(МеткаВзятьЦель)
      END_CYC
      GOTO(МеткаНачало) //Если за 8 проходов цель не навелась, возможно она исчезла, начинаем выбирать новую цель
   END_IF
   МеткаЖив:  // После начала атаки проверяем жива ли цель
   MOVE($XLock,$YLock)
   WAIT(1)
   GETSCREEN($XLock-2,$YLock-2,$XLock+2,$YLock+2)
   COLORMODE(6,$XLock-2,$YLock-2,$XLock+2,$YLock+2)
   IF(PXL($XLock,$YLock)=$Red)
      WAIT(2)
      PRINT("Еще жив")
      GOTO(МеткаЖив) // Пока пиксель $Red не выходим из цикла
   ELSE
    GOTO(ОсновнойСценарий) // Переходим к основному сценарию и проверяем активность дронов
   END_IF
END_SUB
//==============Основное тело программы=========
ОсновнойСценарий:
MOVE($XDron,$YDron)
GETSCREEN($XDron-2,$YDron-2,$XDron+2,$YDron+2)                            // Делаем скрин
PRINT("Проверка активности дронов")
COLORMODE(6,$XDron-2,$YDron-2,$XDron+2,$YDron+2) //Упрощаем цвета в области
IF(PXL($XDron,$YDron)=$Green)  // Проверяем активность дронов(Зеленый значит простой)
PRINT("Начинаем атаковать первую цель")
СабАтакаПервойЦели()
END_IF
WAIT(2)
//=============================================

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Оптимизация скрипта ( избавление от GOTO)
« Reply #1 on: September 21, 2018, 08:18:47 AM »
Выпрыгивать из циклов и подпрограмм нельзя.
У тебя там единственный цикл работает как условие, его нужно просто заменить на условие, тогда можно из этого условия без проблем выпрыгивать.
Смысл подпрограмм оптимизировать повторяющийся код, а у тебя 1 вызов на весь скрипт.
Вот твой код без подпрограммы и цикла, теперь должен работать верно.
Code: (clickermann) [Select]
//===============Объявление констант=======================
$XFirsttarget = 1065 //  Х координаты первой цели
$YFirsttarget = 80  //  Y координаты первой цели
$XLock = 885        //  X координаты кнопки лока
$YLock = 85          //  Y координаты кнопки лока
$XDron = 620        //  X координаты первого дрона
$YDron = 122         //  Y координаты первого дрона
$Red   = 4145151     // Красный цвет лока
$Green = 4194111     // Зеленый цвет дронов

//==============Основное тело программы=========
ОсновнойСценарий:
MOVE($XDron,$YDron)
GETSCREEN($XDron-2,$YDron-2,$XDron+2,$YDron+2)                            // Делаем скрин
PRINT("Проверка активности дронов")
COLORMODE(6,$XDron-2,$YDron-2,$XDron+2,$YDron+2) //Упрощаем цвета в области
IF(PXL($XDron,$YDron)=$Green)  // Проверяем активность дронов(Зеленый значит простой)
   PRINT("Начинаем атаковать первую цель")
   МеткаНачало:
   PRINT("Начало скрипта")
   MOVE($XFirsttarget,$YFirsttarget)  // Перевод мыши на первую цель
   WAITMS(500)
   LCLICK($XFirsttarget,$YFirsttarget)  // Выбор первой цели
   WAIT(1)
   MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
   WAITMS(500)
   LCLICK($XLock,$YLock)                // Нажатие мыши на кнопку лока
   WAITMS(500)
   $Zalip = 1 // Переменная счетчик, с ее помощью происходит ожидание выполнения условия (PXL($XLock,$YLock)=$Red)
   МеткаВзятьЦель:
   MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
   WAITMS(500)
   GETSCREEN ($XLock-2,$YLock-2,$XLock+2,$YLock+2)                           // Делаем скрин
   PRINT("Проверка выделения цели ", $Zalip)
   COLORMODE(6,$XLock-2,$YLock-2,$XLock+2,$YLock+2) //Упрощаем цвета в области
   IF(PXL($XLock,$YLock)=$Red)  // Проверяем пиксель кнопки лока
      WAITMS(500)
      keypress(#F)       //Атака дронов
      WAITMS(500)
      PRINT("Атака")
   ELSE
      IF($Zalip<8) // Пока переменная меньше 8 переходим на метку (МеткаВзятьЦель)
         inc($Zalip)
         WAIT(2)
         GOTO(МеткаВзятьЦель)
      END_IF
      GOTO(МеткаНачало) //Если за 8 проходов цель не навелась, возможно она исчезла, начинаем выбирать новую цель
   END_IF
   МеткаЖив:  // После начала атаки проверяем жива ли цель
   MOVE($XLock,$YLock)
   WAIT(1)
   GETSCREEN($XLock-2,$YLock-2,$XLock+2,$YLock+2)
   COLORMODE(6,$XLock-2,$YLock-2,$XLock+2,$YLock+2)
   IF(PXL($XLock,$YLock)=$Red)
      WAIT(2)
      PRINT("Еще жив")
      GOTO(МеткаЖив) // Пока пиксель $Red не выходим из цикла
   ELSE
      GOTO(ОсновнойСценарий) // Переходим к основному сценарию и проверяем активность дронов
   END_IF
END_IF
WAIT(2)
//=============================================

Теперь избавляем код от ГОТО
Code: (clickermann) [Select]
//===============Объявление констант=======================
$XFirsttarget = 1065 //  Х координаты первой цели
$YFirsttarget = 80  //  Y координаты первой цели
$XLock = 885        //  X координаты кнопки лока
$YLock = 85          //  Y координаты кнопки лока
$XDron = 620        //  X координаты первого дрона
$YDron = 122         //  Y координаты первого дрона
$Red   = 4145151     // Красный цвет лока
$Green = 4194111     // Зеленый цвет дронов

//==============Основное тело программы=========
WHILE(1) // Весконечный цикл
   MOVE($XDron,$YDron)
   WAITMS(50)
   PRINT("Проверка активности дронов")
   GETSCREEN($XDron-2,$YDron-2,$XDron+2,$YDron+2)   // Делаем скрин
   COLORMODE(6,$XDron-2,$YDron-2,$XDron+2,$YDron+2) //Упрощаем цвета в области
   IF(PXL($XDron,$YDron)=$Green)  // Проверяем активность дронов(Зеленый значит простой)
      PRINT("Начинаем атаковать первую цель")
     
      $check1 = 0
      WHILE($check1 = 0)
         PRINT("Начало скрипта")
         MOVE($XFirsttarget,$YFirsttarget)  // Перевод мыши на первую цель
         WAITMS(500)
         LCLICK($XFirsttarget,$YFirsttarget)  // Выбор первой цели
         WAIT(1)
         MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
         WAITMS(500)
         LCLICK($XLock,$YLock)                // Нажатие мыши на кнопку лока
         WAITMS(500)
         
         $Zalip = 0 // Переменная счетчик, с ее помощью происходит ожидание выполнения условия (PXL($XLock,$YLock)=$Red)
         $check2 = 0
         WHILE($check2 = 0)
            MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
            WAITMS(500)
            GETSCREEN ($XLock-2,$YLock-2,$XLock+2,$YLock+2)                           // Делаем скрин
            PRINT("Проверка выделения цели ", $Zalip)
            COLORMODE(6,$XLock-2,$YLock-2,$XLock+2,$YLock+2) //Упрощаем цвета в области
            IF(PXL($XLock,$YLock)=$Red)  // Проверяем пиксель кнопки лока
               WAITMS(500)
               keypress(#F)       //Атака дронов
               WAITMS(500)
               PRINT("Атака")
               $check1 = 1 // Разрешаем выход из цикла check1
               $check2 = 1 // Разрешаем выход из цикла check2
            ELSE
               IF($Zalip<8)
                  inc($Zalip)
                  WAIT(2)
               ELSE
                  $check2 = 1  // Если за 8 проходов цель не навелась, возможно она исчезла, начинаем выбирать новую цель
               END_IF
            END_IF
         END_CYC
         
      END_CYC
     
      $check = 0
      WHILE($check = 0)
         // После начала атаки проверяем жива ли цель
         MOVE($XLock,$YLock)
         WAIT(1)
         GETSCREEN($XLock-2,$YLock-2,$XLock+2,$YLock+2)
         COLORMODE(6,$XLock-2,$YLock-2,$XLock+2,$YLock+2)
         IF(PXL($XLock,$YLock)=$Red) // Пока пиксель $Red не выходим из цикла
            PRINT("Еще жив")
            WAIT(2)
         ELSE
            $check = 1 // Переходим к основному сценарию и проверяем активность дронов
         END_IF
      END_CYC
     
   END_IF
   WAIT(2)
END_CYC

barnybad

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Оптимизация скрипта ( избавление от GOTO)
« Reply #2 on: September 26, 2018, 11:45:25 PM »
Большое спасибо за помощь, стало намного красивее и грамотнее. SUBы я начал использовать как задел на будущие функции, хотел разбить различные действия(запуск дронов, полет на станцию и т.д.) на подпрограммы, а потом вызывать их при необходимости. kiril следуя вашему совету убрал проверку цветов под курсором, когда начинал писать этот скрипт все цвета смотрел в редакторе через лупу, и там когда наводишь на какой нибудь элемент он начинает подсвечиваться, я думал что и цвет тоже будет меняться, поэтому перед GETSCREEN переводил туда курсор, но потом наделал скринов с коррекцией цвета и понял что необходимый цвет не менялся. Текущая версия:
Code: (clickermann) [Select]
// 26.09.2018
#name "Ева онлайн"
 
//===============Объявление констант=======================
$XFirsttarget = 1065  //  Х координаты первой цели
$YFirsttarget = 80    //  Y координаты первой цели
$XLock = 885          //  X координаты кнопки лока
$YLock = 85           //  Y координаты кнопки лока
$XDron = 620          //  X координаты первого дрона
$YDron = 122          //  Y координаты первого дрона
$Red   = 4145151      //  Красный цвет лока
$Green = 4194111     //  Зеленый цвет дронов
 
//===============  избавление от лишней математики =====================
$XLock1 = $XLock-2    //  1X координата поиска кнопки лока
$YLock1 = $YLock-2    //   1Y координата поиска кнопки лока
$XLock2 = $XLock+2    //  2X координата поиска кнопки лока
$YLock2 = $YLock+2    // 2Y координата поиска кнопки лока
$XDron1 = $XDron-2    //  1X координата поиска первого дрона
$YDron1 = $YDron-2    //   1Y координата поиска первого дрона
$XDron2 = $XDron+2    //  1X координата поиска первого дрона
$YDron2 = $YDron+2    // 1Y координата поиска первого дрона
 
//==============Основное тело программы=========
PRINT("Проверка активности дронов")
GETSCREEN($XDron1,$YDron1,$XDron2,$YDron2)                            // Делаем скрин
COLORMODE(6,$XDron1,$YDron1,$XDron2,$YDron2) //Упрощаем цвета в области
IF(PXL($XDron,$YDron)=$Green)  // Проверяем активность дронов(Зеленый значит простой)
   PRINT("Начинаем атаковать первую цель")
   $Zalip = 1 // Переменная счетчик, с ее помощью происходит ожидание выполнения условия (PXL($XLock,$YLock)=$Red)
   WHILE ($Zalip!9)   //Если за 8 проходов цель не навелась, возможно она исчезла, начинаем выбирать новую цель
      PRINT("Начало скрипта")
      MOVE  ($XFirsttarget,$YFirsttarget)  // Перевод мыши на первую цель
      WAITMS(500)
      LCLICK($XFirsttarget,$YFirsttarget)  // Выбор первой цели
      WAIT(1)
      MOVE($XLock,$YLock)                  // Перевод мыши на кнопку лока
      WAITMS(500)
      LCLICK($XLock,$YLock)                // Нажатие мыши на кнопку лока
      WAITMS(500)
      $Zalip = 1 // Переменная счетчик, с ее помощью происходит ожидание выполнения условия (PXL($XLock,$YLock)=$Red)
      WHILE ($Zalip<8) // Пока переменная меньше 8 переходим на метку (МеткаВзятьЦель)
         PRINT("Проверка выделения цели ", $Zalip)
         GETSCREEN ($XLock1,$YLock1,$XLock2,$YLock2)  //  НЕ Делаем скрин! обновляем мграфический буфер программы!
         COLORMODE(6,$XLock1,$YLock1,$XLock2,$YLock2) //Упрощаем цвета в области
         IF(PXL($XLock,$YLock)=$Red)  // Проверяем пиксель кнопки лока
            WAITMS(500)
            KEYPRESS(#F)       //Атака дронов
            WAITMS(500)
            PRINT("Атака")
            $Zalip=9     //выход из цикла
         ELSE
            INC($Zalip,1)
            WAIT(2)
         END_IF
      END_CYC
   END_CYC
   MOVE($XLock,$YLock)
   WAIT(1)
   GETSCREEN($XLock1,$YLock1,$XLock2,$YLock2)
   COLORMODE(6,$XLock1,$YLock1,$XLock2,$YLock2)
   WHILE(PXL($XLock,$YLock)=$Red)  // После начала атаки проверяем жива ли цель
      PRINT("Еще жив курилка")  // Пока пиксель $Red не выходим из цикла
      WAIT(2)
      GETSCREEN($XLock1,$YLock1,$XLock2,$YLock2)
      COLORMODE(6,$XLock1,$YLock1,$XLock2,$YLock2)
   END_CYC
END_IF
WAIT(2)

Но этот скрипт все же работает не оптимально, так как он ждет пока не будет простоя дронов, после чего начинает наводиться на цель(это секунд 5, в это время дроны простаивают), хотелось что бы просиходил захват всех возможных целей, но есть ограничение в количестве одновременно захваченных врагов(где то 5), так же если нажать на кнопку захват цели на уже захваченном враге, то цель сбросится, и еще цели в списке могут меняться местами. Может кто подскажет какие нибудь идеи, конечно если в эту игру не играли, тяжело все это представить, но может есть те кто играл)
https://yadi.sk/i/ofXIdNfG7D4oCQ