Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: sektant23tm on December 27, 2018, 04:51:38 PM
-
Добрый день знатоки кликермана! :)
Сразу к делу:
Я написал бота под игру,он прекрасно работает и выполняет все что мне от него нужно.Время от времени я стараюсь его улучшить,чтобы он работал точнее и быстрее.Сейчас при запуске бот около 30 секунд гетскринит,считывает существующие координаты всех нужных в игре окон(через IF_PICTURES_IN) и запоминает координаты и в дальнейшем ему не приходится при обращении к ним искать их заново по всему экрану,он уже имеет их координаты.Захотел я сделать это считывание координат более быстрым и интереесным.
Я решил переделать скрипт,чтобы он прежде чем искать картинку по всему экрану обращался в config.ini для поиска координаты этого окна с предыдущего прогона.Тоесть например кликер ищет окно склада,обращается к INI файлу,находит там $xsklad и $ysklad(стартовые координаты картинки) ,проверяет условие IF_PICTURE_IN ($xsklad, $ysklad, $x_max,$y_max, "img/sklad.bmp", -1, 90) .Если скрипт срабатывает - бот переходит к поиску следующей картинки,если не срабатывает,то $xsklad и $ysklad делает равным 0,ищет еще раз и ,обнаружив,перезаписывает координаты в INI файл.Все это я сделал,все это легко
Код имеет примерно такой вид
//----------------SKLAD---------------------------//
$analiz="0"
WHILE($analiz < 1)
$xsklad=INIREAD("config.ini", "$xsklad","Analizsystem")
$ysklad=INIREAD("config.ini", "$ysklad","Analizsystem")
IF_PICTURE_IN ($xsklad, $ysklad, $x_max,$y_max, "img/sklad.bmp", -1, 90)
print("SKLAD..ОК")
$xsklad=$_return1
$ysklad=$_return2
$analiz="1"
print("Перезаписываю координаты")
INIWRITE("config.ini", "$xsklad", $xsklad ,"Analizsystem")
INIWRITE("config.ini", "$ysklad", $ysklad ,"Analizsystem")
ELSE
$xsklad="0"
$ysklad="0"
$record="1"
END_IF
END_CYC
//=======================================================//
Так вот,перед тем как основной скрипт приступит к работе ему надо найти около 30 таких картинок на экране.Я как нубас могу написать просто 30 раз кусок этого кода каждый раз меняя переменные $xsklad и $ysklad на другие,но я хочу сделать это красиво через WHILE чтобы при каждом новом цикле этого оператора у меня из INI файла брались значения трех переменных (картинка,х,у),подставлялись в cкрипт и отрабатывали ,после чего по новой до тех пор пока while не закроется.Но я столкнулся с проблемой,что я не могу заменить одну переменную на другую.Например у нас есть кусочек кода
$xnn=INIREAD("config.ini", "$xnn","Analizsystem")
В нем я хочу заменить $xnn на $xdps.Я пробовал через все что нашел в справке,особенно близок был STRREPLACE,но все мои усилия привели лишь к тому,что $xdps воспринимался программой не как переменная при подобного рода замене,а как просто текст.По сути мне нужно понять как именно заменить одну переменную на другую,не приравнять их ,а именно заменить.
Я очень надеюсь что решение очень простое,но я по неопытности и невнимательности его каким-то образом обошел.
-
Чтобы обрабатывать имена переменных как текст в кликере есть функции GETVAR и SETVAR. Единственное, нужно чтобы переменные уже существовали. То есть нельзя с помощью одной только SETVAR на генерировать переменных.
Пример
$var = 0 // объявляем переменную
SETVAR ("$var", 12345) // присваиваем переменной значение
$tmp = GETVAR ("$var") // извлекаем значение из переменой в другую переменную
LOGWRITE ($tmp) // Смотрим значение в логе
HALT
Вот пример твоего скрипта для одной проверки.
SUB(check, $x1, $x2, $par, $img)
$x=INT(INIREAD("config.ini", $x1, $par))
$y=INT(INIREAD("config.ini", $x2, $par))
$analiz = 0
$rewrite=0
GETSCREEN
WHILE($analiz = 0)
IF_PICTURE_IN ($x,$y, $x_max,$y_max, $img, -1, 90)
print("SKLAD..ОК")
SETVAR ($x1, $_return1)
SETVAR ($x2, $_return2)
$analiz = 1
print("Перезаписываю координаты")
INIWRITE("config.ini", $x1, $_return1, $par)
INIWRITE("config.ini", $x2, $_return2, $par)
INC($rewrite,1)
ELSE
INC($rewrite,1)
$x=0
$y=0
END_IF
IF(($rewrite = 2)&($analiz = 0))
HINTPOPUP(STRCONCAT("Картинка ", $img , " не найдена"), "Ошибка")
LOGWRITE ("Картинка ", $img, " не найдена")
HALT
END_IF
END_CYC
END_SUB
// здесь нужно объявить все используемые переменные
$xsklad = 0
$ysklad = 0
// Далее производим поиск
//----------------SKLAD---------------------------//
check("$xsklad","$ysklad","Analizsystem","img/sklad.bmp")
Для остальных картинок пишем еще одну строку вызова подпрограммы check и вписываем нужные параметры.
Кстати зачем ты присваиваешь числа перемененным как текст? Тут наоборот лучше INTом принудительно перевести текст полученный из INI в числа, чтоб потом меньше проблем было.
-
Спасибо за помощь,вроде работает.
Кстати зачем ты присваиваешь числа перемененным как текст?
Я не слишком опытен пока в таких вопросах.Я всего месяц юзаю программу,до этого никогда не програмировал,так что,можно сказать,учусь на ходу. :)
-
:) Пока переделывал код возник еще один вопрос.Как реализовать вот такую механику?
SUB(gowarp,$telowarpa)
//---===STARTWARP===---//
WHILE($warponper < 24)
#include "WARPON.cms"
waitms(300)
IF($errorwarp = 1)
//НИЖЕ ЕСЛИ ВАРП НЕ ПРОШЕЛ
$telowarpa
//--//
$warponper="0"
$errorwarp="0"
END_IF
END_CYC
//---======---===---===---//
END_SUB
gowarp("rewarp()")
Грубо говоря у нас есть подпрограмма,которая контролирует движение корабля в пространстве.Если все сработало как надо - хорошо,но если нет(миссклик например),должна вызываться подпрограмма rewarp() и цикл отработается по новой.Сейчас gowarp("rewarp()") отрабатывается в теле SUB(gowarp,$telowarpa) через $telowarpa как простой набор текста,а не как подпрограмма.Должно выйти что-то вроде переменной подпрограммы в подпрограмме.
-
Команды и операторы кликера не являются элементами высшего порядка. Их нельзя присвоить переменным. Переменным можно присвоить только два типа: число и строка.
Твоё решение простое. Прописать вызов подпрограммы rewarp() внутри gowarp - жёстко.
Не очень понятно из примера, зачем ты пытался передать имя подпрограммы. Предполагаю, что планировалось, как это многие хотят, вызывать ту или иную подпрограмму в зависимости от параметра. Тогда передавать нужно не имя подпрограммы, а значение - флаг. На основе этого значения, с помощью условий, делать вызов той или иной заведомо прописанной в коде подпрограммы.
Пример:
SUB(main, $subpr)
// куча кода
// вызываем ту или иную подпрограмму указанную в $subpr
SWITCH($subpr)
CASE(1)
s1()
CASE(2)
s2()
CASE(3)
// ...
END_SWITCH
// куча кода
END_SUB
// так вызовется подпрограмма s1
main(1)
// так вызовется подпрограмма s2
main(2)