Author Topic: Переменные  (Read 4088 times)

0 Members and 2 Guests are viewing this topic.

sektant23tm

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Переменные
« 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 файл.Все это я сделал,все это легко


Код имеет примерно такой вид

Code: [Select]

//----------------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 не закроется.Но я столкнулся с проблемой,что я не могу заменить одну переменную на другую.Например у нас есть кусочек кода


Code: [Select]
$xnn=INIREAD("config.ini", "$xnn","Analizsystem")

В нем я хочу заменить $xnn на $xdps.Я пробовал через все что нашел в справке,особенно близок был STRREPLACE,но все мои усилия привели лишь к тому,что $xdps воспринимался программой не как переменная при подобного рода замене,а как просто текст.По сути мне нужно понять как именно заменить одну переменную на другую,не приравнять их ,а именно  заменить.


Я очень надеюсь что решение очень простое,но я по неопытности и невнимательности его каким-то образом обошел.



Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Переменные
« Reply #1 on: December 27, 2018, 08:15:08 PM »
Чтобы обрабатывать имена переменных как текст в кликере есть функции GETVAR и SETVAR. Единственное, нужно чтобы переменные уже существовали. То есть нельзя с помощью одной только SETVAR на генерировать переменных.

Пример
Code: (clickermann) [Select]
$var = 0 // объявляем переменную
SETVAR ("$var", 12345) // присваиваем переменной значение
$tmp = GETVAR ("$var") // извлекаем значение из переменой в другую переменную
LOGWRITE ($tmp) // Смотрим значение в логе
HALT

Вот пример твоего скрипта для одной проверки.
Code: (clickermann) [Select]
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 в числа, чтоб потом меньше проблем было.

sektant23tm

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Переменные
« Reply #2 on: December 27, 2018, 11:37:54 PM »
Спасибо за помощь,вроде работает.
Quote
Кстати зачем ты присваиваешь числа перемененным как текст?
Я не слишком опытен пока в таких вопросах.Я всего месяц юзаю программу,до этого никогда не програмировал,так что,можно сказать,учусь на ходу. :)

sektant23tm

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Переменные
« Reply #3 on: December 28, 2018, 12:38:46 PM »
 :) Пока переделывал код возник еще один вопрос.Как реализовать вот такую механику?

Code: [Select]

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 как простой набор текста,а не как подпрограмма.Должно выйти что-то вроде переменной подпрограммы в подпрограмме.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Переменные
« Reply #4 on: December 28, 2018, 02:53:08 PM »
Команды и операторы кликера не являются элементами высшего порядка. Их нельзя присвоить переменным. Переменным можно присвоить только два типа: число и строка.
Твоё решение простое. Прописать вызов подпрограммы rewarp() внутри gowarp - жёстко.

Не очень понятно из примера, зачем ты пытался передать имя подпрограммы. Предполагаю, что планировалось, как это многие хотят, вызывать ту или иную подпрограмму в зависимости от параметра. Тогда передавать нужно не имя подпрограммы, а значение - флаг. На основе этого значения, с помощью условий, делать вызов той или иной заведомо прописанной в коде подпрограммы.
Пример:
Code: (clickermann) [Select]
SUB(main, $subpr)
    // куча кода
   
    // вызываем ту или иную подпрограмму указанную в $subpr
    SWITCH($subpr)
        CASE(1)
            s1()
        CASE(2)
            s2()
        CASE(3)
            // ...
    END_SWITCH
    // куча кода
END_SUB

// так вызовется подпрограмма s1
main(1)

// так вызовется подпрограмма s2
main(2)
« Last Edit: December 28, 2018, 02:54:48 PM by Vint »