Author Topic: Сравнение рисунков  (Read 6217 times)

0 Members and 2 Guests are viewing this topic.

Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Сравнение рисунков
« on: June 15, 2014, 04:44:25 PM »
Привет Всем! Может не точно обозначил тему, но блин, задача у меня ( и для меня) оказалась сложная. Может кто-нибудь накидает идеи.
Необходимо вот что. Я ищу сначала первый, один рисунок из 20 в одном месте на экране. Потом ищу второй один рисунок из 20 в другом месте на экране. А потом, в третьем месте, мне нужно найти через сканпикчур, есть ли второй рисунок (рисунки) (который я уже нашёл во втором месте), и если находит хоть один, мне нужно посмотреть есть ли с ним рядом первый рисунок (который я нашёл в первом месте). Вот такая хитрожопность :) Кто что подскажет буду очень рад. Спасибо :)
П.С. Жалко, что не работает goto с переменными или массивами, а так же в if_picture_in (..., "picture.bmp") нельзя вставить в ковычки вместо пикчур переменную или массив. Поэтому я и не знаю, как сделать мою задачу?! Может в будущем что-либо из этого поменяется, если это вообще возможно :)

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: Сравнение рисунков
« Reply #1 on: June 15, 2014, 07:22:10 PM »
Привет Всем! Может не точно обозначил тему, но блин, задача у меня ( и для меня) оказалась сложная. Может кто-нибудь накидает идеи.
Необходимо вот что. Я ищу сначала первый, один рисунок из 20 в одном месте на экране. Потом ищу второй один рисунок из 20 в другом месте на экране. А потом, в третьем месте, мне нужно найти через сканпикчур, есть ли второй рисунок (рисунки) (который я уже нашёл во втором месте), и если находит хоть один, мне нужно посмотреть есть ли с ним рядом первый рисунок (который я нашёл в первом месте). Вот такая хитрожопность :) Кто что подскажет буду очень рад. Спасибо :)
а в чем проблема то. алгоритм ты на словах описал. где затык? поиск картинок, флаги. все реализуемо.

Quote
П.С. Жалко, что не работает goto с переменными или массивами, а так же в if_picture_in (..., "picture.bmp") нельзя вставить в ковычки вместо пикчур переменную или массив. Поэтому я и не знаю, как сделать мою задачу?! Может в будущем что-либо из этого поменяется, если это вообще возможно :)
почему нельзя задавать имя файла через переменную то? религия не позволяет?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Сравнение рисунков
« Reply #2 on: June 15, 2014, 08:20:13 PM »

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Сравнение рисунков
« Reply #3 on: June 16, 2014, 01:32:25 AM »
а ведь на самом деле жалко, что не работает goto с переменными. тем стало бы больше в X раз.
а зачем нам вообще гоуту?
« Last Edit: June 16, 2014, 01:38:08 AM by i0 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Сравнение рисунков
« Reply #4 on: June 16, 2014, 01:54:25 AM »
На ГОТО далеко не уедешь...

Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Сравнение рисунков
« Reply #5 on: June 16, 2014, 02:34:59 AM »
а в чем проблема то. алгоритм ты на словах описал. где затык? поиск картинок, флаги. все реализуемо.
почему нельзя задавать имя файла через переменную то? религия не позволяет?
1) Я не знаю, как задавать через переменную имя файла.
2) Не знаю, что такое флаги.
3) Вот как я вижу, как это можно сделать.

Я ищу первую одну картинку из 20 в первом месте.

Code: (clickermann) [Select]
if_picture_in(..... , "0.bmp")
...
end_if
if_picture_in(..... , "1.bmp")
...
end_if

...

if_picture_in(..... , "20.bmp")
...
end_if

Потом ищу второй один рисунок из 20 во втором месте.

Code: (clickermann) [Select]
if_picture_in(..... , "0s.bmp")
...
end_if
if_picture_in(..... , "1s.bmp")
...
end_if

...

if_picture_in(..... , "20s.bmp")
...
end_if


И вот тут. Мне нужно потом найти в третьем месте 2 рисунок (рисунки), который я уже нашёл, и посмотреть, есть ли рядом с ним 1 рисунок, который я уже нашёл.
Т.к. 2ых рисунков может быть не один, я ищу соответственно через сканпикчур. Допустим, второй рисунок у меня был 13s.bmp, а первый 8.bmp

Code: (clickermann) [Select]
getscreen
scanpicture($var, 314,253,940,280, "13s.bmp")
while (arrsize($var) > 0)
  $y = arrpop($var)
  $x = arrpop($var)
IF_PICTURE_IN ($x-16,$y,$x,$y+10, "8.bmp")
...
END_IF 
end_cyc

скажем, вот такой вариант мне полностью подходит, я так думаю. НО, проблема в том, как мне сделать так, чтобы кликер знал, что он нашёл первый рисунок 8, и что рядом с 13s нужно искать именно 8? Если бы можно было вот сюда
Code: (clickermann) [Select]
IF_PICTURE_IN ($x-16,$y,$x,$y+10, "8.bmp")
вставить заместо 8 переменную или массив, например вот так
Code: (clickermann) [Select]
IF_PICTURE_IN ($x-16,$y,$x,$y+10, "$pic.bmp")
то проблема бы была решена! Но в кавычки нельзя вставлять ни переменную, ни массивы. По крайне мере я не знаю как?! Вот так у меня дела.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение рисунков
« Reply #6 on: June 16, 2014, 07:18:30 AM »
Всё гораздо проще. "Вот сюда" можно вписать переменную (не массив) как тебе и сказали. Просто вписываешь ты её неправильно.
Code: (clickermann) [Select]
$pic = "13s.bmp"  // задаём переменную
IF_PICTURE_IN ($x-16,$y,$x,$y+10, $pic)
...
Переменная и не должна стоять в кавычках. Значение переменной это всё имя файла - строковая переменная уже в кавычках.


Про флаги. Это переменные принимающие значения в зависимости от определённых условий/событий. Например, нашёл - присвоил переменной 1, не нашёл - 0.
В нашем случае лучше присвоить переменной сразу нужное значение.
Вот ты ищешь первую картинку
Code: (clickermann) [Select]
$pic1 = ""
if_picture_in(..... , "0.bmp")
$pic1 = "0.bmp"
...
end_if
if_picture_in(..... , "1.bmp")
$pic1 = "1.bmp"
...
end_if
 
...
 
if_picture_in(..... , "20.bmp")
$pic1 = "20.bmp"
...
end_if
Так же и вторая. Ну ты понял. Эти переменные $pic1, $pic2 используешь при поиске во второй части кода.
...

Можно сделать всё компактнее и проще. Т.к. имена номерные можно перебирать их в цикле.
Code: (clickermann) [Select]
$pic1 = ""
$pic2 = ""
GETSCREEN
$i = 0
FOR($i,$i<20)
   if_picture_in(..... , STRCONCAT($i, ".bmp"))  // ищем 1
      $pic1 = STRCONCAT($i, ".bmp")  // запоминаем имя найденной
      $i = 100 // досрочно выходим из цикла для ускорения
   end_if
END_CYC
// ищем вторую часть марлезонского балета
$i = 0
FOR($i,$i<20)
   if_picture_in(..... , STRCONCAT($i, "s.bmp"))  // ищем 2
      $pic2 = STRCONCAT($i, "s.bmp")
      $i = 100
   end_if
END_CYC
// финальный поиск-сравнение
if (($pic1 ! "") & ($pic2 ! "")) // это чтобы небыло ошибки если не нашли 1 или 2
   scanpicture($var, 314,253,940,280, $pic2)
   while (arrsize($var) > 0)
      $y = arrpop($var)
      $x = arrpop($var)
      IF_PICTURE_IN ($x-16,$y,$x,$y+10, $pic1)
         //...
      END_IF
   end_cyc
end_if

Вот и всё.
Если всё это не на одном экране, добавляем GETSCREEN по вкусу.

И не нужны (ну совершенно!) никакие GOTO, тем более по переменной-метке.
Лучше всё таки подналечь и добавить break/continue для выпрыгивания/продолжения циклов
и return для выпрыгивания из подпрограмм.
Выпрыгиватели желательно многоуровневые типа: ExitLoop (2) выскочить из двух уровней вложенных циклов...
« Last Edit: June 16, 2014, 11:11:41 AM by Vint »


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Сравнение рисунков
« Reply #7 on: June 16, 2014, 01:22:47 PM »
Ну кто бы мог подумать! Игорь! Как всегда просто спасает меня!!! У меня просто нет слов благодарности, одни эмоции! Вот голова! И как же я без этого жил?! Спасибо, Игорёк!
Я и понятия не имел, что переменную можно вот так... в кавычках. И да, теперь все просто. Флагами я, естественно, пользуюсь, просто не знал, что это флаги :) И огромное спасибо, за циклы! Я и хотел их делать, если возможна переменная! Но, как ты написал, я ещё не разобрался. Так и не освоил строки. Но обязательно разберусь, т.к. мне это нужно, а главное интересно! Но вот про последнее... все эти уровни... я вообще пока не осведомлен. Да возможно пока и не требуется :)
А так, Спасибо. Вы просто красавцы! :)
« Last Edit: June 16, 2014, 01:25:30 PM by Skomopox »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение рисунков
« Reply #8 on: June 16, 2014, 01:49:56 PM »
Последнее это не тебе, это Johnny


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Сравнение рисунков
« Reply #9 on: June 16, 2014, 05:01:37 PM »
 ;D

Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Сравнение рисунков
« Reply #10 on: June 18, 2014, 06:45:24 AM »
Игорь! Не срабатывает вот это:

Code: (clickermann) [Select]
scanpicture($var, 314,253,940,280, $pic2)
   while (arrsize($var) > 0)
      $y = arrpop($var)
      $x = arrpop($var)
    ==========>   IF_PICTURE_IN ($x-16,$y,$x,$y+10, $pic1)
         //...
      END_IF
   end_cyc

А именно там, где указывает стрелка (просто нарисовал её, т.к. почему-то нельзя в коде для кликера ни цветом выделять, ни что-либо ещё)! Т.е. суть в чём. Я пробовал по разному. И если нам даже просто убрать иф пикчур, а заместо него поставим, допустим мув:

Code: (clickermann) [Select]
scanpicture($var, 314,253,940,280, $pic2)
   while (arrsize($var) > 0)
      $y = arrpop($var)
      $x = arrpop($var)
        waitms(500)
        move($x,$y)
   end_cyc

Тут он всё прекрасно находит и двигает мышку по найденным картинкам.
Но как только пытаюсь сделать какие-либо вычисления с $X и $y

Code: (clickermann) [Select]
scanpicture($var, 314,253,940,280, $pic2)
   while (arrsize($var) > 0)
      $y = arrpop($var)
      $x = arrpop($var)
        waitms(500)
         ==========> move($x-16,$y+10)
   end_cyc

 то всё, пишет - Ошибка при интерпретации строки, прервать выполнение сценария? Это что-то в кликере или снова я что-то не то делаю? Есть варианты? Спасибо!
« Last Edit: June 18, 2014, 06:48:51 AM by Skomopox »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение рисунков
« Reply #11 on: June 18, 2014, 08:06:19 AM »
выведи в лог эти x, y
Попробуй доставать из массива по индексу, а не через arrpop
Помню в альфах arrpop глючил.

Code: (clickermann) [Select]
scanpicture($var, 314,253,940,280, $pic2)
$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($var))
   $x = $var [$ARR_NUM]
   $y = $var [$ARR_NUM+1]
   INC($ARR_NUM,2)
   IF_PICTURE_IN ($x-16,$y,$x,$y+10, $pic1)
      //...
   END_IF
END_CYC
UNDEFINE($ARR_SCAN)


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение рисунков
« Reply #12 on: June 18, 2014, 08:09:55 AM »
Скорее всего в 4.10 в массив числа попадают (или достаются арпопом) как строки.
Сделай их числами
Code: (clickermann) [Select]
$y = INT(arrpop($var))
$x = INT(arrpop($var))

Но это конечно косяк, если так. Не смертельно, но крови попить может.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Сравнение рисунков
« Reply #13 on: June 18, 2014, 08:44:52 AM »
Потестил. Так и есть. В массиве лежат правильно - числа.
arrpop достаёт их как строки.
По индексу таких проблем нет.


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Сравнение рисунков
« Reply #14 on: June 18, 2014, 08:56:38 AM »
Ура!!!! Работает через инт! Вот голова! И откуда ты все знаешь? :) Завтра продолжу писать дальше скрипт. Спасибо!