Author Topic: Можно ли как-то автоматом создать переменную?  (Read 3337 times)

0 Members and 3 Guests are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Что-то типа:
Code: (clickermann) [Select]
$a="ups"
STRCONCAT("$",$a)=1
Понимаю что пример не правильный, так как в результате я пытаюсь СТРОКЕ - "$ups", а не переменной, присвоить значение - 1,  но мне надо, чтобы получилась переменная - $ups=1
« Last Edit: May 28, 2018, 01:45:38 AM by Hito »
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Для этого придуманы массивы.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Для этого придуманы массивы.

На ка - попробуй вот так запустить скрипт с массивом:
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

Вот как это можно реализовать?
« Last Edit: May 28, 2018, 08:13:39 AM by Hito »
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
У тебя неправильное понимание что нужно делать. Массивы то правильно, но ты их пытаешься применить по старому как задумал.
В кликере нет ассоциативных массивов (или словарей), ты же хочешь словарь? Ну так предложили использовать другие методы, хоть и менее удобные.

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

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

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

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


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


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
переменная уже должна существовать.
Это-то как раз и не подходит...

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

Чтобы было понятно... Когда скрипт ищет картинку впервые, то он ищет ее по всему экрану и находя, записывает ее координаты в ини, а если ищет ее повторно, то считывает координаты этой картинки из ини и ищет ее по точным координатам. Это для ускорения работы скрипта.
« Last Edit: May 28, 2018, 09:04:29 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Для более полного понимания ситуэйшен, вот более полная подпрограмма:
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
« Last Edit: May 28, 2018, 09:29:00 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
переменная уже должна существовать.

Видимо придется создавать переменные с именами всех картинок...
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Это-то как раз и не подходит...
Как я и думал.

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


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Тогда сам собой напрашивается способ комбинированного имени число+строка
Например:
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
и т.д.

Что-то ты такое наваял умное... В чем моими слипшимися мозгами еще разбираться нуна.
Буду разбираться... :)
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Видимо придется создавать переменные с именами всех картинок...

С этим ничего не получится...
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 передаешь первые три символа (число) в названии картинки...
« Last Edit: May 28, 2018, 10:51:11 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
В чем проблема, ребят?

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/jF8K6HWo3WcVx3

Если кто тестить будет, можно искать прям на первом скрине. Там область поиска красными кругами не затронута.
Затык во втором проходе, в подпрограмме - где-то между LOGWRITE ($ind) и LOGWRITE ($find[$ind])
То есть - во втором заходе $find[$ind] уже не создается, или ей значение не присваивается.
« Last Edit: May 28, 2018, 12:31:52 PM by Hito »
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Так ты не создал массив $find
...$find длиной в количество картинок.

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

И 100 я для примера привёл, начинай с 000, 001, 002... Ну можешь и со 100, для удобства, только первые 100 элементов будут не используемые.


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Так ты не создал массив $find
Спасибо!
Я не ду... Потому и не бу...

SeniorSSS

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Можно сравнивать картинки с конкретной папки внутри for цикла...имена картинок типовой типа картинка1, картинка2...на совпадении i будет индексом...минус не слишком то быстро может это работать...плюс массив вообще не нужен