Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: barnybad on September 21, 2018, 12:46:05 AM
-
Здравствуйте, прошу вашей помощи с оптимизацией скрипта, для начала хочу убрать все команды GOTO.
Этот скрипт для игры Eва онлайн. Логика следующая: Сначала проверяется статус дронов, если они простаивают, запускается подпрограмма (СабАтакаПервойЦели)
Далее производится выбор цели, нажатие кнопки захвата цели, ожидание взятия на прицел, после чего производится атака, далее ожидаем пока цель будет уничтожена.
//===============Объявление констант=======================
$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)
//=============================================
-
Выпрыгивать из циклов и подпрограмм нельзя.
У тебя там единственный цикл работает как условие, его нужно просто заменить на условие, тогда можно из этого условия без проблем выпрыгивать.
Смысл подпрограмм оптимизировать повторяющийся код, а у тебя 1 вызов на весь скрипт.
Вот твой код без подпрограммы и цикла, теперь должен работать верно.
//===============Объявление констант=======================
$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)
//=============================================
Теперь избавляем код от ГОТО
//===============Объявление констант=======================
$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
-
Большое спасибо за помощь, стало намного красивее и грамотнее. SUBы я начал использовать как задел на будущие функции, хотел разбить различные действия(запуск дронов, полет на станцию и т.д.) на подпрограммы, а потом вызывать их при необходимости. kiril следуя вашему совету убрал проверку цветов под курсором, когда начинал писать этот скрипт все цвета смотрел в редакторе через лупу, и там когда наводишь на какой нибудь элемент он начинает подсвечиваться, я думал что и цвет тоже будет меняться, поэтому перед GETSCREEN переводил туда курсор, но потом наделал скринов с коррекцией цвета и понял что необходимый цвет не менялся. Текущая версия:
// 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