Author Topic: IF внутри IF  (Read 2053 times)

0 Members and 1 Guest are viewing this topic.

invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
IF внутри IF
« on: August 24, 2021, 08:39:53 PM »
Всем добрый! Помогите умоляю, я начинающий кликермен, все прочитал, но то что мне нужно не нашел, везде пишут мол IF_PICTURE_IN нашел картинку и кликай, ELSE кликай в другое место, а мне нужно сканировать скрин, найти не пиксель а картинку которая всегда двигается так что применяю COLORMODE(6) и совпадения на 40 ставлю пока, так вот нужно найти картинку и если нашлась, то зажимаем ЛКМ и ищем эту картинку в еще 4 разных местах, если она где-то обнаружилась то не отпуская ЛКМ идет туда где нашли вторую и там отпускаем, там самым 2 картинки склеются, и все это в цикл, картинок таких разных 5 шт. всех по приоритетам выставлю, мне главное понять как сделать так чтоб кликер нашел одну, зажал ЛКМ и перетащил её туда где найдет вторую, а дальше поиск заново. а дальше дело за малым. Помогите плиз)


Code: [Select]
10: // ТИПА цикл, сюды возвращюсь если везде лажа
   GETSCREEN (1423, 567, 1755, 766)   // делаем скрин  поле боя
   IF_PICTURE_IN (1422, 567, 1484, 632, "4.bmp", -1, 40)  //ищем в координатах фотку
      LDOWN($_return1, $_return2)  //если нашли то зажимаем ЛКМ
      WAITMS(100)
      GOTO(1)  // и тут самое сложно, нужно найти в другом месте еще такую же картинка
               // гото 1 прыгаем на другой IF где ищем картинку     
   END_IF
//=============================================
1:   
      IF_PICTURE_IN (1484, 567, 5554, 632, "4.bmp", -1, 40) //если нашли то
         LUP($_return1, $_return2)      // то перетаскиваем сюда ЛКМ и отпускаем её, тем самым 2 картинка это 2 башни которые склеиваются.  Если тут не нашлb такую картику, ищем в другом месте и т.д
         WAITMS(100)
         GOTO(10)
      ELSE
         IF_PICTURE_IN (1557, 567, 1622, 632, "4.bmp", -1, 40)
            LUP($_return1, $_return2)   
            WAITMS(100)
            GOTO(10)         
         ELSE
            IF_PICTURE_IN (1622, 567, 1690, 632, "4.bmp", -1, 40)
               LUP($_return1, $_return2)   
               WAITMS(100)
               GOTO(10)
            ELSE
               IF_PICTURE_IN (1690, 567, 1757, 632, "4.bmp", -1, 40)
                  LUP($_return1, $_return2)   
                  WAITMS(100)
                  GOTO(10)
               ELSE
                  WAITMS(50)
               END_IF
END_IF
         END_IF
      END_IF
GOTO(10)
   

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #1 on: August 25, 2021, 08:40:45 AM »
и все это в цикл, картинок таких разных 5 шт
Начал хорошо объяснять, но получилось как в мэме "нарисовать сову".
Вот ты перетащил на вторую картинку... кстати, почему на вторую, если сказано чёрным по белому: "если нашлась", т.е. найтись могла любая из четырёх.
Так вот, перетащили на вторую другую и
и все это в цикл
а что это? Если картинки склеились, то первая и возможно вторая пропали/переместились. Что дальше в цикле то? Первая осталась на месте и искать оставшиеся 3? Первая пропала и нужно искать новую первую и оставшиеся 3?
В любом случае, не написал когда останавливать цикл? Ждать когда склеятся первая со всеми 4-я, если они не пропадают, то нужно же ждать именно каждую в своей области. Или ждать когда склеятся 5 любых картинок.

Есть ли код до и после этого кода? Если нет, все GOTO - безсмысленны. Если есть, выкинуть GOTO и поменять на нормальные конструкции.


invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: IF внутри IF
« Reply #2 on: August 25, 2021, 09:31:06 AM »
Действительно мой косяк, мне почему-то всегда не ловко просить помочь и стараюсь просить помочь ток о самом главном)

Quote
Есть ли код до и после этого кода? Если нет, все GOTO - безсмысленны. Если есть, выкинуть GOTO и поменять на нормальные конструкции.
Да это весь код, ну это начало, просто хочу понять как это сделать, а дальше распишу на 5 страниц, надеюсь)

Тогда расскажу прям как есть все все все!)
Есть поле битвы разбитое на клетки 5 на 3
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

У меня есть 5 разных башнь которые я выкидываю на поле появляются они в рандомном месте и сами они тоже рандомные, мне нужно склеивать одинаковые чтобы там появилась более мощная башня, но появится тоже рандомная, короче надо тыкать все время кнопку чтоб на поле появилась башня и склеивать одинаковые, есть башни которые нужно склеить в первую очередь, а есть которые трогать нужно только если уже нет других вариантов, все поле например закрыла одна и та же башня!
Вот и хочу написать цикл, ищем башню номер 1 например на всех этих клетках по отдельности, думаю так проще искать будет, если нашлась башня №1 на клетке ну 7 допустим, ищем такую же  дальше, нашли? Склеиваем, тыкаем кнопку чтоб кинуть на поле башню и повторяем все заново, если башня №1 нигде нет, ищем №2, нашли? ищем такую же и так далее, мне нужно понять как сделать механизм, если нашел одну, зажал ЛКМ и ищешь другую, нашел? идешь туда и отжимаешь ЛКМ если нет, отжал просто, тыкнул кнопку создание башни и еще раз ищешь, ну и с метками этими туплю, по любому нужно будет как то с метками делать.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #3 on: August 25, 2021, 10:13:59 AM »
мне нужно понять как сделать механизм, если нашел одну, зажал ЛКМ и ищешь другую, нашел? идешь туда и отжимаешь ЛКМ если нет, отжал просто
А не проще, если другой нет, не нажимать совсем, т.к. "отжал просто" это всё равно где-то и непонятно к чему это приведёт.

А так я понял что, нужно искать на поле 5 на 3 на каждой итерации копии одной из нескольких видов картинок.
Ищем картинку №1, если есть копии склеиваем. (Здесь не знаю что, может выставляем). Идём на новую итерацию опять искать копии картинки №1. Правильно?
Если копий текущей картинки нет, ищем следующую по списку - №2 и т.д.

Если всё так, проще искать сразу все копии одной картинки через SCANPICTURE. Если Нашлось больше одной - склеиваем первую найденную со второй найденной. Или можно все сразу склеить?

И поиск с 40% совпадением это неправильно. При таком проценте, ты будешь находить кучу копий почти в одном месте. В любом поиске, если процент опустился до 60 - жди беды. Это почти нерабочий вариант. 70 (даже 75) - 100 Чем больше, тем лучше.
Нужно попробовать поиск одной башни с разным % снижая его. Посмотреть на скольких находится. Можно сделать скрин. Ещё лучше если копий этой башни будет несколько в разных местах поля. Скрин, само собой, не сжатый.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #4 on: August 25, 2021, 10:32:43 AM »
Code: (clickermann) [Select]
$tower = 1
WHILE($tower <= 7)   // перебираем все башни от 1 до 7   башня_1.bmp - башня_7.bmp
    UNDEFINE($scan)
    GETSCREEN(1423, 567, 1755, 766)
    SCANPICTURE($scan, 1423, 567, 1755, 766, STRCONCAT("башня_", $tower, ".bmp"), -1, 90)
   
    $scan_size = ARRSIZE($scan)
    LOGWRITE("Найдена башня №", $tower, ", количество: ", $scan_size / 2)
    IF($scan_size > 2)
        LDOWN($scan[0], $scan[1])
        WAITMS(100)
        LUP($scan[2], $scan[3])
        WAITMS(100)
        // здесь "тыкаем кнопку чтоб кинуть на поле башню"
    ELSE  // найдено меньше двух штук
       INC($tower)  // переключаем на следующий номер башни
    END_IF
END_CYC

HALT

// если находятся дубли одной картинки в одном поле - нужно знать размеры поля для исключения
// если можно сразу склеить все цепочкой 1-2 2-3 и т.д. напиши, тогда так склеим в одном поиске.
« Last Edit: August 25, 2021, 10:34:40 AM by Vint »


invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: IF внутри IF
« Reply #5 on: August 25, 2021, 10:43:02 AM »
Quote
Или можно все сразу склеить?
Все одновременно склеить нельзя, сперва одну пару, потом другую.

Quote
А не проще, если другой нет, не нажимать совсем, т.к. "отжал просто" это всё равно где-то и непонятно к чему это приведёт.
У меня в голове просто чуть сложнее) если можно упростить, то я ток за!

Quote
И поиск с 40% совпадением это неправильно. При таком проценте, ты будешь находить кучу копий почти в одном месте. В любом поиске, если процент опустился до 60 - жди беды. Это почти нерабочий вариант. 70 (даже 75) - 100 Чем больше, тем лучше.
Нужно попробовать поиск одной башни с разным % снижая его. Посмотреть на скольких находится. Можно сделать скрин.
все это запомнил, принял, но это второстепенная задача, мне бы кусочек кода, от чего я буду отталкиваться,

Quote
Скрин, само собой, не сжатый.
Там башни стреляют, они вечно в анимации какой-то смотрят в разные стороны, поэтому по моему сугубо не опытному мнению, нужен COLORMODE и 100% там никак не найдет)


invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: IF внутри IF
« Reply #6 on: August 25, 2021, 10:58:25 AM »
Code: (clickermann) [Select]
$tower = 1
WHILE($tower <= 7)   // перебираем все башни от 1 до 7   башня_1.bmp - башня_7.bmp
    UNDEFINE($scan)
    GETSCREEN(1423, 567, 1755, 766)
    SCANPICTURE($scan, 1423, 567, 1755, 766, STRCONCAT("башня_", $tower, ".bmp"), -1, 90)
   
    $scan_size = ARRSIZE($scan)
    LOGWRITE("Найдена башня №", $tower, ", количество: ", $scan_size / 2)
    IF($scan_size > 2)
        LDOWN($scan[0], $scan[1])
        WAITMS(100)
        LUP($scan[2], $scan[3])
        WAITMS(100)
        // здесь "тыкаем кнопку чтоб кинуть на поле башню"
    ELSE  // найдено меньше двух штук
       INC($tower)  // переключаем на следующий номер башни
    END_IF
END_CYC

HALT

// если находятся дубли одной картинки в одном поле - нужно знать размеры поля для исключения
// если можно сразу склеить все цепочкой 1-2 2-3 и т.д. напиши, тогда так склеим в одном поиске.

ставлю 70% уже, ничего не происходит, даже не кликает на кнопку чтоб на поле кидать башни.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #7 on: August 25, 2021, 11:26:34 AM »
ставлю 70% уже, ничего не происходит, даже не кликает на кнопку чтоб на поле кидать башни.
Используй COLORMODE. Может нужно заготовку переделать по другому. Непонятно что там с прозрачностью.

Сперва добейся    :o: ;D ;D ;D ;D,  эммм, сперва добейся стабильного поиска картинок, с анимациями это не так просто, иногда совсем непросто.


invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: IF внутри IF
« Reply #8 on: August 25, 2021, 04:32:14 PM »
Кликер находит например башню №2 и просто тыкает на неё все время, мне кажется он просто её же и обнаруживает второй раз и пошел цикл на саму себя кликать, я предлагаю разбить поиск по клеткам, искать в каждой отдельно как я делал в своем коде, как это пихнуть в ваш код?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #9 on: August 25, 2021, 05:03:24 PM »
Кликер находит например башню №2 и просто тыкает на неё все время, мне кажется он просто её же и обнаруживает второй раз и пошел цикл на саму себя кликать, я предлагаю разбить поиск по клеткам, искать в каждой отдельно как я делал в своем коде, как это пихнуть в ваш код?

Никак, это будет другой код. Можно и по клеткам, а можно просто найденные отфильтровать в пределах клетки. Конечно если там количество не зашкаливает.
Сколько в логе пишет найдено?


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #10 on: August 25, 2021, 05:07:05 PM »
И непонятно почему нужно проверять 5 полей, если их там 15?


invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: IF внутри IF
« Reply #11 on: August 25, 2021, 05:23:42 PM »
И непонятно почему нужно проверять 5 полей, если их там 15?

В начале 5 сказал чтоб не заморачиваться, где 5 там и 50) теперь я понял что нужно в тончайших подробностях все объяснить )

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #12 on: August 25, 2021, 05:50:31 PM »
Вот по ячейкам.
Сначала ищет нужную башню вообще на поле. Если есть высчитываем в каком поле нашли.
Со следующего поля ищем такую же башню. Если нашли - склеиваем, не нашли - переходим к следующей башне.
Можно было тупо по всем 15 пробегаться, но может так чуть быстрее, меньше вызовов поиска.
Надеюсь нигде не ошибся в расчётах, код не тестировал. Если что, кричи.

Code: (clickermann) [Select]
#name "invahak"
// Author: Vint
// Version: 0.3 (25.08.2021)
// Скрипт для Clickermann v4.13.014


// Максимальный номер башни. Например для башня_1.bmp - башня_7.bmp
$max_tower = 7

// начальные координаты нулевого поля
$sx = 1423
$sy = 567

$ex = $sx + (66 * 5)
$ey = $sy + (66 * 3)

//0  1  2  3  4
//5  6  7  8  9
//10 11 12 13 14

$tower = 1
WHILE($tower <= $max_tower)
    $tower_count = 0
    GETSCREEN($sx, $sy, $ex, $ey)
    IF_PICTURE_IN($sx, $sy, $ex, $ey, STRCONCAT("башня_", $tower, ".bmp"), -1, 40))
        $tower1_x = $_return1
        $tower1_y = $_return2
       
        $row = INT($tower1_y / 66)
        $col = INT($tower1_x / 66)
       
        $field_num = ($row * 5) + $col
        LOGWRITE("Найдена башня №", $tower, ", в поле № ", $field_num, "  ", $col, "/", $row)
       
        FOR($f = $field_num + 1, $f < 15)
            $r = INT($f / 5)
            $c = $f - ($r * 5)
            $lx = $sx + (66 * $c)
            $ly = $sy + (66 * $r)
            IF_PICTURE_IN($lx, $ly, $lx+66, $ly+66, STRCONCAT("башня_", $tower, ".bmp"), -1, 40))
                LDOWN($tower1_x, $tower1_y)
                WAITMS(100)
                LUP($_return1, $_return2)
                WAITMS(100)
                $f = 100
                // здесь "тыкаем кнопку чтоб кинуть на поле башню"
            END_IF
        END_CYC
       
        IF($f < 100)
            INC($tower)  // переключаем на следующий номер башни
        END_IF
    ELSE  // найдено меньше двух штук
        INC($tower)  // переключаем на следующий номер башни
    END_IF
END_CYC

HALT
« Last Edit: August 25, 2021, 05:54:49 PM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF внутри IF
« Reply #13 on: August 25, 2021, 06:04:58 PM »
Вот вариант с прямым перебором 15 полей пока не найдёт больше 1 экземпляра
Code: (clickermann) [Select]
#name "invahak"
// Author: Vint
// Version: 0.4 (25.08.2021)
// Скрипт для Clickermann v4.13.014


// Максимальный номер башни. Например для башня_1.bmp - башня_7.bmp
$max_tower = 7

// начальные координаты нулевого поля
$sx = 1423
$sy = 567

$ex = $sx + (66 * 5)
$ey = $sy + (66 * 3)

//0  1  2  3  4
//5  6  7  8  9
//10 11 12 13 14

$tower = 1
WHILE($tower <= $max_tower)
    $tower_count = 0
    GETSCREEN($sx, $sy, $ex, $ey)
    FOR($f = 0, $f < 15)
        $r = INT($f / 5)
        $c = $f - ($r * 5)
        $lx = $sx + (66 * $c)
        $ly = $sy + (66 * $r)
        IF_PICTURE_IN($lx, $ly, $lx+66, $ly+66, STRCONCAT("башня_", $tower, ".bmp"), -1, 40))
            INC($tower_count)
            LOGWRITE("Найдена башня №", $tower, "  ", $tower_count, " экземпляр")
            IF($tower_count = 1)
                $tower1_x = $_return1
                $tower1_y = $_return2
            ELSE
                LDOWN($tower1_x, $tower1_y)
                WAITMS(100)
                LUP($_return1, $_return2)
                WAITMS(100)
                $f = 100
                // здесь "тыкаем кнопку чтоб кинуть на поле башню"
            END_IF           
        END_IF
    END_CYC
   
    IF($tower_count < 2)
        INC($tower)  // переключаем на следующий номер башни
    END_IF
END_CYC

HALT


invahak

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: IF внутри IF
« Reply #14 on: August 27, 2021, 08:27:39 AM »
Второй код работает на 20%) есть нюансы которые нужно доработать, но тут хотя бы я сам) клик мышки сдвинуть правее и ниже, а то кликает прям на край и не склеивает иногда, и пытается склеить нужные башни но они разного уровня, но тут уже никак, на 20% он все за одну воспринимает)  А так рабочий код, огромное спасибо!