Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Hito on May 27, 2018, 11:20:48 PM

Title: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 27, 2018, 11:20:48 PM
Что-то типа:
Code: (clickermann) [Select]
$a="ups"
STRCONCAT("$",$a)=1
Понимаю что пример не правильный, так как в результате я пытаюсь СТРОКЕ - "$ups", а не переменной, присвоить значение - 1,  но мне надо, чтобы получилась переменная - $ups=1
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Oraven on May 28, 2018, 07:14:52 AM
Для этого придуманы массивы.
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 07:26:22 AM
Для этого придуманы массивы.

На ка - попробуй вот так запустить скрипт с массивом:
Code: (clickermann) [Select]
$a="ups"
$b[$a]=1

Или как ты предлагаешь? Пример можно?
Мне это нужно для этой части скрипта:
Code: (clickermann) [Select]
SUB(PICTURE, $picture, $currency)
   IF(STRCONCAT("$",$picture) > 0) // Попадала эта картинка в эту подпрограмму, или нет.
      // Если да, тогда один вариант поиска картинки
   else
      // А если нет, тогда второй вариант поиска картинки
      // И отмечаем, что мы ее уже искали вторым вариантом поиска
      STRCONCAT("$",$picture)=1
   END_IF
END_SUB

Вот как это можно реализовать?
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Vint on May 28, 2018, 08:33:45 AM
У тебя неправильное понимание что нужно делать. Массивы то правильно, но ты их пытаешься применить по старому как задумал.
В кликере нет ассоциативных массивов (или словарей), ты же хочешь словарь? Ну так предложили использовать другие методы, хоть и менее удобные.

Возьму грех на душу и дам то, что не люблю. То, что ввели с 12 версии

Code: (clickermann) [Select]
DEFINE($ups, 0)

SETVAR("$ups", 1)
LOGWRITE($ups)

Это недокоманда, совершенно не нужная. Потому как присваивать значения ты можешь, но есть нюанс... переменная уже должна существовать.
Т.е. на лету генерировать сотни переменных с нужными именами не выйдет, их всё равно нужно прописывать в коде.


Правильней и практичней для данного примера заменить имя в $picture числом (другие тоже числами). И создать простой массив. $picture будет индексом массива.
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 09:00:33 AM
переменная уже должна существовать.
Это-то как раз и не подходит...

Правильней и практичней для данного примера заменить имя в $picture числом (другие тоже числами). И создать простой массив. $picture будет индексом массива.
Я об этом уже думал, но не долго, так как с числами я просто заморочусь... У меня сотня картинок (пока сотня... список пополняется по мере написания скрипта) и каждую картинку по числу понимать - что это за картинка... Я скончаюсь... :)

Чтобы было понятно... Когда скрипт ищет картинку впервые, то он ищет ее по всему экрану и находя, записывает ее координаты в ини, а если ищет ее повторно, то считывает координаты этой картинки из ини и ищет ее по точным координатам. Это для ускорения работы скрипта.
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 09:22:10 AM
Для более полного понимания ситуэйшен, вот более полная подпрограмма:
Code: (clickermann) [Select]
SUB(PICTURE, $picture, $currency)
   IF(STRCONCAT("$",$picture) > 0) // Попадала эта картинка в эту подпрограмму, или нет.
      $x1=INIREAD ("picture.ini", "x1", $picture)
      $y1=INIREAD ("picture.ini", "y1", $picture)
      $x2=INIREAD ("picture.ini", "x2", $picture)
      $y2=INIREAD ("picture.ini", "y2", $picture)
      IF_PICTURE_IN ($x1,$y1, $x2,$y2, STRCONCAT("skrini\",$picture,".bmp"), -1, $currency)
         LOGWRITE (STRCONCAT("PICTURE: ",$picture," Найдена!"))
         $pic=1
      else
         LOGWRITE (STRCONCAT("PICTURE: ",$picture," Не найдена..."))
         $pic=0
      END_IF
   else
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT("skrini\",$picture,".bmp"), -1, $currency)
         LOGWRITE (STRCONCAT("PICTURE: ",$picture," Найдена!"))
         STRCONCAT("$",$picture)=1
         INIWRITE ("picture.ini", "x1", $_return1, $picture)
         INIWRITE ("picture.ini", "y1", $_return2, $picture)
         INIWRITE ("picture.ini", "x2", ($_return1+INIREAD ("picture.ini", "shirina", $picture)), $picture)
         INIWRITE ("picture.ini", "y2", ($_return2+INIREAD ("picture.ini", "visota", $picture)), $picture)
         $pic=1
      else
         LOGWRITE (STRCONCAT("PICTURE: ",$picture," Не найдена..."))
         $pic=0
      END_IF
   END_IF
END_SUB

GETSCREEN
COLORMODE(6)
PICTURE ("Типа картинка", 100)
IF($pic>0)
 
else

END_IF
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 10:13:17 AM
переменная уже должна существовать.

Видимо придется создавать переменные с именами всех картинок...
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Vint on May 28, 2018, 10:27:35 AM
Это-то как раз и не подходит...
Как я и думал.

Я об этом уже думал, но не долго, так как с числами я просто заморочусь... У меня сотня картинок (пока сотня... список пополняется по мере написания скрипта) и каждую картинку по числу понимать - что это за картинка... Я скончаюсь... :)
Сотня не так уж страшно, чисел на много хватит   :);D

Тогда сам собой напрашивается способ комбинированного имени число+строка
Например:
100_ups.bmp
101_flip.bmp
...
так не запутаешься, кроме номера видно человеческое имя.

Вот заводишь массив где будешь учитывать свои поиски $find длиной в количество картинок.
В ПП получаешь своё имя $picture и используешь его как обычно.
Вырезаешь первые 3 символа, переводишь в число, вот тебе и индекс этой картинки в массиве.

Code: (clickermann) [Select]
$picture = "100_ups.bmp"
$ind = INT(STRCUT($picture, 1, 3))
IF($find[$ind] > 0)
...
...
$find[$ind] = 1
и т.д.
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 10:33:25 AM
Тогда сам собой напрашивается способ комбинированного имени число+строка
Например:
100_ups.bmp
101_flip.bmp
...
так не запутаешься, кроме номера видно человеческое имя.

Вот заводишь массив где будешь учитывать свои поиски $find длиной в количество картинок.
В ПП получаешь своё имя $picture и используешь его как обычно.
Вырезаешь первые 3 символа, переводишь в число, вот тебе и индекс этой картинки в массиве.

Code: (clickermann) [Select]
$picture = "100_ups.bmp"
$ind = INT(STRCUT($picture, 1, 3))
IF($find[$ind] > 0)
...
...
$find[$ind] = 1
и т.д.

Что-то ты такое наваял умное... В чем моими слипшимися мозгами еще разбираться нуна.
Буду разбираться... :)
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 10:47:46 AM
Видимо придется создавать переменные с именами всех картинок...

С этим ничего не получится...
Code: (clickermann) [Select]
DEFINE($ups, 0)

SETVAR(STRCONCAT("$","ups"), 1)
IF(STRCONCAT($,"ups") = 0)
   LOGWRITE($ups)
END_IF
IF-то как реализовать...?
В общем отпадает, как я понимаю. Буду разбираться в:
Code: (clickermann) [Select]
$picture = "100_ups.bmp"
$ind = INT(STRCUT($picture, 1, 3))
IF($find[$ind] > 0)
...
...
$find[$ind] = 1
и т.д.

Аааа...! $ind = INT(STRCUT($picture, 1, 3)) - тут ты  $ind передаешь первые три символа (число) в названии картинки...
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 12:28:39 PM
В чем проблема, ребят?

https://yadi.sk/i/Omxn9d3o3WcVYM (https://yadi.sk/i/Omxn9d3o3WcVYM)

Скрипт:
Code: (clickermann) [Select]
SUB(PICTURE, $picture, $currency)
   $ind = INT(STRCUT($picture, 1, 3))
   
   LOGWRITE ($ind)
   LOGWRITE ($find[$ind])
   
   IF($find[$ind] > 0)
      $x1=INIREAD ("picture.ini", "x1", $picture)
      $y1=INIREAD ("picture.ini", "y1", $picture)
      $x2=INIREAD ("picture.ini", "x2", $picture)
      $y2=INIREAD ("picture.ini", "y2", $picture)
      IF_PICTURE_IN ($x1,$y1, $x2,$y2, STRCONCAT("skrini\",$picture,".bmp"), -1, $currency)
         $pic=1
      else
         $pic=0
      END_IF
   else
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT("skrini\",$picture,".bmp"), -1, $currency)
         $find[$ind] = 1
         INIWRITE ("picture.ini", "x1", $_return1, $picture)
         INIWRITE ("picture.ini", "y1", $_return2, $picture)
         INIWRITE ("picture.ini", "x2", ($_return1+INIREAD ("picture.ini", "shirina", $picture)), $picture)
         INIWRITE ("picture.ini", "y2", ($_return2+INIREAD ("picture.ini", "visota", $picture)), $picture)
         $pic=1
      else
         $pic=0
      END_IF
   END_IF
END_SUB


$panel_check = 0
WHILE($panel_check = 0)
   GETSCREEN
   COLORMODE(6)
   PICTURE ("100_karta", 100)
   IF($pic=1)
      LOGWRITE ("Карту нашли. Ищем подземелье опыта")
      PICTURE ("107_podzemelye_opita_p", 100)
      IF($pic=1)
         $panel_check = 1
      else
         WAITMS(50)
      END_IF
   else
      WAITMS(50)
   END_IF
END_CYC

HALT

Искомые скрины:
https://yadi.sk/i/FWRLpZdM3WcVuW (https://yadi.sk/i/FWRLpZdM3WcVuW)

https://yadi.sk/i/jF8K6HWo3WcVx3 (https://yadi.sk/i/jF8K6HWo3WcVx3)

Если кто тестить будет, можно искать прям на первом скрине. Там область поиска красными кругами не затронута.
Затык во втором проходе, в подпрограмме - где-то между LOGWRITE ($ind) и LOGWRITE ($find[$ind])
То есть - во втором заходе $find[$ind] уже не создается, или ей значение не присваивается.
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Vint on May 28, 2018, 12:53:22 PM
Так ты не создал массив $find
...$find длиной в количество картинок.

и не заполнил нулями. Сравниваешь мусор из неопределённого массива
В начале скрипта заполни массив
Code: (clickermann) [Select]
FOR($i=0, $i < 10)  // индексы в твоих картинках 0...9
    $find[$i] = 0
END_CYC

И 100 я для примера привёл, начинай с 000, 001, 002... Ну можешь и со 100, для удобства, только первые 100 элементов будут не используемые.
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: Hito on May 28, 2018, 04:22:11 PM
Так ты не создал массив $find
Спасибо!
Title: Re: Можно ли как-то автоматом создать переменную?
Post by: SeniorSSS on May 30, 2018, 03:52:43 PM
Можно сравнивать картинки с конкретной папки внутри for цикла...имена картинок типовой типа картинка1, картинка2...на совпадении i будет индексом...минус не слишком то быстро может это работать...плюс массив вообще не нужен