Помощь - Поиск - Пользователи - Календарь
Полная версия: Puzzle
UoKit.com Форумы > Кликер > UO Pilot
FREEON
Игра в которой требуется составить мозаику из множества фрагментов рисунка различной формы.
У нас есть поле состоящее из 16 элементов мы знаем где они должны располагаться:
Нажмите для просмотра прикрепленного файла
Нам нужно проверять позиции (от 1 до 16) на соответствия расположения на поле. Если плитки совпадают то мы переходим к проверке позиции следующего элемента. Если плитка не совпадает то мы передвигаем ее в нужную позицию:
Нажмите для просмотра прикрепленного файла
Перемещать плитки можно от клетки к клетки(вверх вниз влево вправо) не перепрыгивая через нее.
Пример для теста скрипта(запустить Javascript Puzzle.html):
Нажмите для просмотра прикрепленного файла
P.S. В примере можно картинку таскать на любую позицию, нам так делать нельзя.
FREEON
Вариант1(ищем шаблоны из папки и собираем пазл)
Можно ли как-то одну картинку из памяти разбить на области(сохранить элементы и затем делать поиск)?
Код

set linedelay 0                         //Установить задержку между строками в 0 мс.
log clear                               //Очистить лог
log mode compact                        //отключить лишнюю инфу лога
log open 1 630 200 100                  //*открыть лог в координатах x=1 y=1 и установить размер окна 200х150 пикселей
set $path "D:\_UOPilot\newimage\Puzzle" //*вставить путь к папке с картинками Викторины начальный этап
dir (%image $path *.png*)               //поиск шаблона для сбора пазла
log В папке найдено: size(%image) шаблонов
for #i 1 size(%image)                   //цикл для поиска шаблона
    set #v findimage(8, 8 509, 509 (%image [#i 1]) %a)   //область Поля поиска шаблона
    //сканируем часть поля и часть картинки для определения № шаблона
    if  #v > 0                          //если шаблон найден
        //???взять из картинки 16 изображений по сетке 4x4
        //записать их в массив запомнив их истинное(верное) положение и координаты
        wait 100
        left 235, 238                   //делаем клик для запуска игры(разбивки пазла на рандомные куски)
        //set #pazl 0                   //переменная для подсчёта правильного положения плитак пазла
        //while #pazl < 16              //выполняем цикл пока все точки не совпадут
        while_not = 16                  //пока не совподают все части пазла, ищем их
            for                         //ищем 1ю часть пазла и проверяем ее с истинным положением
                if                      //если положение верное
                                        //переходим к проверке следующей части пазла
                else
                                        //находим путь и перемещаем ее в нужную область
                end_if
            end_for
        end_while
        log Пазл собрали
    else
        log Не смог найти шаблон
    end_if
end_for
end_script
FREEON
Вариант 2(сами сохраняем шаблон и затем ищем по ему)
Как записать условие(цикл) для проверки сохранённых позиций изображения с текущими?
Код
set linedelay 0                         //Установить задержку между строками в 0 мс.
log clear                               //Очистить лог
log mode compact                        //отключить лишнюю инфу лога
log open 1 630 200 100                  //*открыть лог в координатах x=1 y=1 и установить размер окна 200х150 пикселей

set #v findimage(8, 8 509, 509 (%image [#i 1]) %a)   //область Поля поиска шаблона частей
set %a1 GetImage  (50, 20 55, 25) //запоминаем шаблон и кооодинаты пазла в позиции 1-1 изображение 5х5 пикселей
//log %a1 [1 1] - адрес в памяти
//log %a1 [1 2] - ширина изображения
//log %a1 [1 3] - высота изображения
//log %a1 [1 4] - длина строки в байтах
set %a2 GetImage  (150, 20 155, 25) //запоминаем шаблон и кооодинаты пазла в позиции 1-2
set %a3 GetImage  (250, 20 255, 25)
set %a4 GetImage  (350, 20 355, 25)
set %a5 GetImage  (50, 120 55, 125)
set %a6 GetImage  (150, 120 155, 125)
set %a7 GetImage  (250, 120 255, 125)
set %a8 GetImage  (350, 120 355, 125)
set %a9 GetImage  (50, 220 55, 225)
set %a10 GetImage  (150, 220 155, 225)
set %a11 GetImage  (250, 220 255, 225)
set %a12 GetImage  (350, 320 355, 325)
set %a13 GetImage  (50, 320 55, 325)
set %a14 GetImage  (150, 320 155, 325)
set %a15 GetImage  (250, 320 255, 325)
set %a16 GetImage  (350, 320 355, 325) //запоминаем шаблон и кооодинаты пазла в позиции 4-4

wait 100
left 235, 238                   //делаем клик для запуска игры(разбивки пазла на рандомные куски)

while_not ??? = 16                  // Условие, пока не совподают все части пазла, ищем их
    for                         //проверяем части пазла по очереди на соответствие с истинным положением
        if координаты а1 = a1 текущие???  // плитка находится в нужных координатах то курим бамбук
            log Пишем что все хорошо                //переходим к проверке следующей части пазла
        else
                                        //ищем путь домой и перемещаем ее в нужную область
        end_if
    end_for
end_while
log Пазл собрали
end_script
cirus
Тут вообще не нужны картинки. Можно использовать тот же принцип что и в '2048' тут https://forum.uokit.com/index.php?s=&sh...st&p=431246.
При запуске появляется оригинальная картинка. Ищем на ней findcolor'ом все цвета (0-16777215) с шагом 100 по X и Y. Получим массив из 16 точек, т. к. картинка 4*4. Когда появится пазл, останется лишь найти эти цвета и расставить плитки по порядку.
cirus
код
Код
// сделать привязку
// запускать скрипт когда открыта оригинальная картинка, а не сам пазл
set #startX 50   // координата X (любая точка в пределах левой верхней картинки пазла)
set #startY 120   // координата Y (любая точка в пределах левой верхней картинки пазла)
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact
showwindow minimize windowhandle
set #endX #startX + #stepX * 4 - 1
set #endY #startY + #stepY * 4 - 1

set #a findcolor (#startX #startY #endX #endY #stepX #stepY (0-16777215) %a)  // поиск
hint #a
if  #a > 0
    kleft #startX #startY   // клик по картинке чтобы начать собирать
    wait 2000
    for #i 1 15    // собираем
        set #b findcolor (#startX #startY #endX #endY #stepX #stepY (%a[#i 3]) %b 2 1)  // поиск цвета
        if  #b > 0
            kleft_down %b[1 1] %b[1 2]      // зажать левую кнопку мыши
            wait 200
            set #ii #i - 1
            set #x #startX + mod(#ii 4) * #stepX  // координата X
            set #y #startY + #ii / 4 * #stepY    // координата Y
            move  #x #y  // переместить курсор
            wait 200
            kleft_up #x #y   // отпустить левую кнопку мыши
            wait 200
        end_if
    end_for
end_if
showwindow windowhandle
end_script
FREEON
Цитата(cirus @ 24.2.2019, 19:28) *

Код

set #ii #i - 1
set #x #startX + mod(#ii 4) * #stepX  // координата X
set #y #startY + #ii / 4 * #stepY    // координата Y


Я так понимаю идет расчет координат для перетаскивания. Но можно ли подробнее разжевать что куда идет?
DarkMaster
Цитата

Я так понимаю идет расчет координат для перетаскивания. Но можно ли подробнее разжевать что куда идет?

Сразу предупреждаю - это НЕ наезд, не "читайте маны", "сам дурак" и прочее) Это совет. Здесь не так много кода, но он не самый простой ну просто потому, что вот такой алгоритм. Это не криво написано и т.д. Объяснять такие мелкие и чуть запутанные куски бывает очень сложно ввиду того, что объяснение будет длинее всего этого кода и понять его будет только сложнее. Просто попроубйте вникнуть и прокрутить пару циклов в голове. Это очень полезно и для понимания и для тренировки и для прогресса, как программиста/скриптера. Код нужно прокручивать в голове wink.gif
cirus
Код
log clear
log mode compact
for #i 0 15
    set #x mod (#i 4)
    set #y #i / 4
    log #i    [#x #y]
end_for
end_script

Только учитывайте что в пилоте индексация массивов с 1, а не 0.
FREEON
Цитата(DarkMaster @ 24.2.2019, 20:12) *

Сразу предупреждаю - это НЕ наезд, не "читайте маны", "сам дурак" и прочее) Это совет. Здесь не так много кода, но он не самый простой ну просто потому, что вот такой алгоритм. Это не криво написано и т.д. Объяснять такие мелкие и чуть запутанные куски бывает очень сложно ввиду того, что объяснение будет длинее всего этого кода и понять его будет только сложнее. Просто попроубйте вникнуть и прокрутить пару циклов в голове. Это очень полезно и для понимания и для тренировки и для прогресса, как программиста/скриптера. Код нужно прокручивать в голове wink.gif

Лано я прымерно там понимаю чо к чему за исключением mod и #ii.
А как реализовать фишку если нет возможности перетаскивать сразу в нужную точку, а можно лишь делать ход(несколько ходов) шагом в #step 100 пикселей, можно ли прикрутить универсальную формулу? Конечно вижу хитрость, паузить скрипт и в ручную перегонять туда...но хотелось бы без ручек rolleyes.gif
Ну заглядывая наперед что бы не мешать собраные плитки ставить в рамки ограничивать область перемещения...к примеру когда работаем с плитками #i = 1-4 можем ходить по всему полю(4х4), работая с плитками 5-8 можем передвигаться по радиусу 3х4(верхняя область в запрете), с 9-11 можем двигаться по р. 2х4 и плитками 12-16 по радиусу 1х4 снизу
cirus
Цитата
А как реализовать фишку если нет возможности перетаскивать сразу в нужную точку

код
Код
// сделать привязку
// запускать скрипт когда открыта оригинальная картинка, а не сам пазл
set #startX 50   // координата X (любая точка в пределах левой верхней картинки пазла)
set #startY 120   // координата Y (любая точка в пределах левой верхней картинки пазла)
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact
showwindow minimize windowhandle
set #endX #startX + #stepX * 4 - 1
set #endY #startY + #stepY * 4 - 1

set #a findcolor (#startX #startY #endX #endY #stepX #stepY (0-16777215) %a)  // поиск
hint #a
if  #a > 0
    kleft #startX #startY   // клик по картинке чтобы начать собирать
    wait 2000
    for #i 1 15    // собираем
        set #b findcolor (#startX #startY #endX #endY #stepX #stepY (%a[#i 3]) %b 2 1)  // поиск цвета
        if  #b > 0
            set #ii #i - 1
            set #x mod(#ii 4)
            set #y #ii / 4
            set #x2 (%b[1 1] -  #startX) / #stepX
            set #y2 (%b[1 2] - #startY) / #stepY

            if  #x2 > #x
                while #x2 > #x
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #x2 #x2 - 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            else
                while #x2 < #x
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #x2 #x2 + 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            end_if

            if  #y2 > #y
                while #y2 > #y
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #y2 #y2 - 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            else
                while #y2 < #y
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #y2 #y2 + 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            end_if

        end_if
    end_for
end_if
showwindow windowhandle
end_script
FREEON
Цитата(cirus @ 24.2.2019, 21:51) *

код
Код
// сделать привязку
// запускать скрипт когда открыта оригинальная картинка, а не сам пазл
set #startX 50   // координата X (любая точка в пределах левой верхней картинки пазла)
set #startY 120   // координата Y (любая точка в пределах левой верхней картинки пазла)
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact
showwindow minimize windowhandle
set #endX #startX + #stepX * 4 - 1
set #endY #startY + #stepY * 4 - 1

set #a findcolor (#startX #startY #endX #endY #stepX #stepY (0-16777215) %a)  // поиск
hint #a
if  #a > 0
    kleft #startX #startY   // клик по картинке чтобы начать собирать
    wait 2000
    for #i 1 15    // собираем
        set #b findcolor (#startX #startY #endX #endY #stepX #stepY (%a[#i 3]) %b 2 1)  // поиск цвета
        if  #b > 0
            set #ii #i - 1
            set #x mod(#ii 4)
            set #y #ii / 4
            set #x2 (%b[1 1] -  #startX) / #stepX
            set #y2 (%b[1 2] - #startY) / #stepY

            if  #x2 > #x
                while #x2 > #x
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #x2 #x2 - 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            else
                while #x2 < #x
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #x2 #x2 + 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            end_if

            if  #y2 > #y
                while #y2 > #y
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #y2 #y2 - 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            else
                while #y2 < #y
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    kleft_down #x3 #y3
                    wait 100
                    set #y2 #y2 + 1
                    set #x3 #startX + #x2 * #stepX
                    set #y3 #startY + #y2 * #stepY
                    move  #x3 #y3
                    wait 100
                    kleft_up #x3 #y3
                    wait 100
                end_while
            end_if

        end_if
    end_for
end_if
showwindow windowhandle
end_script


Офигенно! Ваапшчэ шикарно!!!Благодарю smile.gif
Но у мну есть ещё вопрос а как из массива findcolor извлечь ResultArray или обратиться к адресу(координаты цвет) или как в 2048 мы там сканили цыфры но не понятно какой адрес у нее в массиве например что бы написать правила для их сложения или перемещения
cirus
Цитата
обратиться к адресу(координаты цвет)

Код
%a[1 1] - координата X1     %a[1 2] - координата Y1     %a[1 3] - цвет
%a[2 1] - координата X2     %a[2 2] - координата Y2     %a[2 3] - цвет
и т.д.
FREEON
Скрипт работает хорошо, но в моем случае, когда пазл рассыпается происходит смещение пикселей.
Например XY исходная точка(и.т.) конечная точка(к.т.):
1-1: и.т. 410, 210 >>> к.т. 410, 210
1-2: и.т. 510, 210 >>> к.т. 512, 210
1-3: и.т. 610, 210 >>> к.т. 614, 210
1-4: и.т. 710, 210 >>> к.т. 716, 210
------------------------------------------
2-1: и.т. 410, 310 >>> к.т. 410, 312
2-2: и.т. 510, 310 >>> к.т. 512, 312
2-3: и.т. 610, 310 >>> к.т. 614, 312
2-4: и.т. 710, 310 >>> к.т. 716, 312
------------------------------------------
4-4: и.т. 710, 510 >>> к.т. 716, 516
то есть происходит смещение на +2 пикселя с каждой новой плиткой для set #b
Нажмите для просмотра прикрепленного файла
cirus
Цитата
происходит смещение пикселей.

В этом пазле или другом?
Можно вместо findcolor использовать get color, будет медленнее, но можно учитывать смещение для каждой следующей проверки цвета.
FREEON
Цитата(cirus @ 25.2.2019, 2:15) *

В этом пазле или другом?
Можно вместо findcolor использовать get color, будет медленнее, но можно учитывать смещение для каждой следующей проверки цвета.

К скрипту вопросов нет работает хорошо тестил не раз. Но в моем случае картинка она не обрезается, а просто делится на 16 частей и между ними как между тортом намазывается раствор (прибавляются два пикселя черных) а лишняя часть обрезается. В итоге картинки равных размеров но со смещением пикселей.
Нажмите для просмотра прикрепленного файла
cirus
Вместо:
Код
set #b findcolor (#startX #startY #endX #endY #stepX #stepY (%a[#i 3]) %b 2 1)  // поиск цвета

get color
Разница лишь в том, что findcolor за раз проверит 16 точек, но с фиксированным шагом, а get color'ом придётся проверять точки отдельно, но шаг можно менять при каждой проверке.
FREEON
Цитата(cirus @ 25.2.2019, 3:12) *

Вместо:
Код
set #b findcolor (#startX #startY #endX #endY #stepX #stepY (%a[#i 3]) %b 2 1)  // поиск цвета

get color
Разница лишь в том, что findcolor за раз проверит 16 точек, но с фиксированным шагом, а get color'ом придётся проверять точки отдельно, но шаг можно менять при каждой проверке.

Нет возможности затестить так как событие недоступно(раз в неделю), но так должен выглядеть код со смещением?
Код

get color #b (#startX #startY #endX #endY #stepX #stepY (%a[#i 3]) %b 2 1)  // поиск цвета
        set #x %b [2 1] + 2           // прибавляем к координате X размер рамки по X
        set #y %b [2 2]               // прибавляем к координате Y размер рамки по Y, если смещение 0 можно не писать
        set #x %b [16 1] + 6          // прибавляем к координате X размер рамки по X
        set #y %b [16 2] + 6           // прибавляем к координате Y размер рамки по Y
cirus
Цитата
но так должен выглядеть код со смещением

Нет конечно. Синтаксис get color посмотрите.
FREEON
Цитата(cirus @ 3.3.2019, 0:06) *

Нет конечно. Синтаксис get color посмотрите.

хотя не...мы знаем цвет и нам нужно найти его координаты и нужно найти его от первой точки + размер поля и максимальное смещение 6 пикселей?
Код

init_arr %a [1 3] //получаем цвет
set #x #startX + 406
set #y #startY + 406
get color #b
sutra
Цитата
мы знаем цвет и нам нужно найти его координаты

Так в чём проблема? Не понимаю, как можно решать задачи проектирования алгоритма игры, не зная работы простейших операторов. Есть вопросы по алгоритму - это одно. Есть вопросы по синтаксису - это другое (хотя на такие элементарные вещи есть справка).
FREEON
Цитата(sutra @ 3.3.2019, 0:48) *

Так в чём проблема? Не понимаю, как можно решать задачи проектирования алгоритма игры, не зная работы простейших операторов. Есть вопросы по алгоритму - это одно. Есть вопросы по синтаксису - это другое (хотя на такие элементарные вещи есть справка).

ну да есть... тока в справке ищется один пиксель но не 16...
sutra
Цитата
init_arr

init - это инициализация, что? можно получить при инициализации??

Цитата
ну да есть... тока в справке ищется один пиксель но не 16...
findcolor ищет ВСЁ. Там есть шаг.


Поиск активной, выделенной и т.п. области ищется с шагом равным высоте (ширине) клетки, ищется колором.
FREEON
Цитата(sutra @ 3.3.2019, 0:53) *

init - это инициализация, что? можно получить при инициализации??

да знаю ток нам нужно из первого поиска findcolor записать цвет и примотать его к get color, а это я не знаю как сделать потому что (%a[#i 3]) - такого типа якорь не сработает
sutra
Нужна скорость, надо просто убить время и перейти на язык lua, благо парни потрудились и теперь почти всё неплохо описано во встроенной справке.
FREEON
Цитата(sutra @ 3.3.2019, 0:56) *

init - это инициализация, что? можно получить при инициализации??

findcolor ищет ВСЁ. Там есть шаг.
Поиск активной, выделенной и т.п. области ищется с шагом равным высоте (ширине) клетки, ищется колором.

открыу амерыку, а а ничо что мне к этому шагу нужно добавить смещение пикселей так как точки плавают
Нажмите для просмотра прикрепленного файла
sutra
Цитата
примотать его к get color
Так а зачем приматывать-то? Финдом получите сразу ВСЕ координаты. Вообще не нужен get color. Это просто упрощённый вариант findcolor-а. Find - ИЩЕТ (в области), get - даёт в конкретных координатах, то же самое что искать финдом в области поиска равной одному пикселю.


Цитата
открыу амерыку, а а ничо что мне к этому шагу нужно добавить смещение пикселей так как точки плавают

А как можно добавить смещение, если ПЛАВАЕТ? Я не вникал в конкретику задачи, но на вскидку всё несложно. Опять конфликт интересов получается. Нет алгоритма? Или что-то не ищет или ищет не ТО, или ищет не ТАМ?

Добавить смещение к шагу если оно известно. Если же определённое количество пикселей должно присутствовать в определённой области и они могут находиться в разных местах конкретной области поиска, есть параметр количества найденных пикселей. В таком случае просто сделать цикл, для анализа всех 16 клеток, путём поиска нужного цвета пикселей в нужном (достаточном) количестве.
FREEON
Цитата(sutra @ 3.3.2019, 1:04) *

Так а зачем приматывать-то? Финдом получите сразу ВСЕ координаты. Вообще не нужен get color. Это просто упрощённый вариант findcolor-а. Find - ИЩЕТ (в области), get - даёт в конкретных координатах, то же самое что искать финдом в области поиска равной одному пикселю.

потому что 1й тип поиска мы делаем для запоминания...а второй нужен что бы собрать...два финда не получится потому что вот
Нажмите для просмотра прикрепленного файла
в первом поиске 16 пикселей четкий равный шаг, а на втором поле идет тот же щаг, но помимо того что пиксели разбросаны в рандомном порядки так и они смещаются на 2 пикселя в каждой плитке. Сирус для обычного поиска написал скрипт но у меня задача немного сложнее из-за отклонения и не понимаю как к ним якоря приделать. Задача не сложная но когда знаний в программировании ноль и uopilot первый язык где столкнулся с кодом да еще задачи не из простых то все...я как пес все понимаю но записать в виде кода не могу mellow.gif а задачи которые уходят по сложности за примеры справки становятся неразрешимыми для меня sad.gif
sutra
Всё получится, мне очень трудно понять из эскизов, в чём проблема, но вроде я угадал. Надо просто поискать во всех 16 клетках нужный цвет. Надо найти в разбросе координат? В чём проблема? Надо найти несколько пикселей нужного цвета? В Чём проблема? Извините, не вникал, но не вижу задачи. Если есть отличия клеток и эти отличия Вам известны, надо просто найти эти отличия. В чём тут проблема, не понимаю.

Цитата
так и они смещаются на 2 пикселя в каждой плитке

Так и задайте область поиска БОЛЬШЕ на 3 пикселя.

Цитата
а задачи которые уходят по сложности за примеры справки становятся неразрешимыми для меня
Фигня это, освоите, просто Вам нужны примеры и опыт. К сожалению у меня с интуицией проблемы. Без конкретной, понятной для меня постановки задачи, мне сложно что-то советовать. Если бы я хоть раз в жизни играл в эту игру, совет родился бы мгновенно. Если пойму в чём тут сложность принятия решения, однозначно дам 100% рабочий вариант.


На всидку опять же. Надо организовать цикл, точнее 2 цикла один внутри другого от 1 до 4. И искать цвет в области от левого угла клетки + сколько там может быть пикселей, ну скажем плюс 5 по обоим осям. Финдом это ищется без вопросов.

А в конкретном Вашем случае, после наложения искомые пиксели уплывают на СТАТИЧНОЕ число пикселей по горизонтали и вертикали, просто в цикле (обоих циклах) увеличивать координаты поиска пикселя ровно на индекс цикла.

Тогда можно и get color-ом это делать.

Код
for #i 1 4
  for #j 1 4
    set #Xfind ... бла бла * #j
    set #Yfind ... бла бла * #i
    get color #color #Xfind + j  #Yfind + i  
    ...
  end_for
end_for

Смысл примерно такой. К статичным координатам прибавляем смещение равное индексам циклов.
cirus
Цитата
смещаются на 2 пикселя в каждой плитке

get color
Код
set #startX 0   // координата X
set #startY 0   // координата Y
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact

set #deltaX 0
set #deltaY 0
for #i 1 4
    set #ii #i - 1
    set #y #startY + #ii * #stepY + #deltaY
    set #deltaX 0
    for #j 1 4
        set #jj #j - 1
        set #x #startX + #jj * #stepX + #deltaX
        set #deltaX #deltaX + 2

        get color #color #x #y  // получили цвет
        set %b [#j #i] #color   // записали в массив
        log #x #y    #color
//        move #x #y
//        wait 300
    end_for
    set #deltaY #deltaY + 2
    log
end_for
end_script

Тоже самое:
findcolor
Код
set #startX 0   // координата X
set #startY 0   // координата Y
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact

set #deltaX 0
set #deltaY 0
set #endX #startX + #stepX * 3 + 6
set #endY #startY + #stepY * 3 + 6

set #a findcolor (#startX #startY #endX #endY (0-16777215) %b)  // поиск
if  #a > 0
    for #i 1 4
        set #ii #i - 1
        set #y #startY + #ii * #stepY + #deltaY
        set #deltaX 0
        for #j 1 4
            set #jj #j - 1
            set #x #startX + #jj * #stepX + #deltaX
            set #deltaX #deltaX + 2

            set #index #y * (#endX + 1) + #x + 1
            log #x #y   %b [#index 3]
//            move #x #y
//            wait 300
        end_for
        set #deltaY #deltaY + 2
        log
    end_for
end_if
end_script

sutra
Ну вот собственно и конкретный код именно того, о чём говорилось, Сайрус молодчина, мне просто лень было вспоминать язык Пилота.
FREEON
Цитата(cirus @ 3.3.2019, 2:09) *

get color
Код
set #startX 0   // координата X
set #startY 0   // координата Y
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact

set #deltaX 0
set #deltaY 0
for #i 1 4
    set #ii #i - 1
    set #y #startY + #ii * #stepY + #deltaY
    set #deltaX 0
    for #j 1 4
        set #jj #j - 1
        set #x #startX + #jj * #stepX + #deltaX
        set #deltaX #deltaX + 2

        get color #color #x #y  // получили цвет
        set %b [#j #i] #color   // записали в массив
        log #x #y    #color
//        move #x #y
//        wait 300
    end_for
    set #deltaY #deltaY + 2
    log
end_for
end_script

Тоже самое:
findcolor
Код
set #startX 0   // координата X
set #startY 0   // координата Y
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact

set #deltaX 0
set #deltaY 0
set #endX #startX + #stepX * 3 + 6
set #endY #startY + #stepY * 3 + 6

set #a findcolor (#startX #startY #endX #endY (0-16777215) %b)  // поиск
if  #a > 0
    for #i 1 4
        set #ii #i - 1
        set #y #startY + #ii * #stepY + #deltaY
        set #deltaX 0
        for #j 1 4
            set #jj #j - 1
            set #x #startX + #jj * #stepX + #deltaX
            set #deltaX #deltaX + 2

            set #index #y * (#endX + 1) + #x + 1
            log #x #y   %b [#index 3]
//            move #x #y
//            wait 300
        end_for
        set #deltaY #deltaY + 2
        log
    end_for
end_if
end_script


Код

set #startX 410   // координата X
set #startY 210   // координата Y
set #stepX 100 // шаг по Y
set #stepY 100 // шаг по Y

log clear
log mode compact

set #deltaX 0
set #deltaY 0
set #endX #startX + #stepX * 3 + 6
set #endY #startY + #stepY * 3 + 6

set #a findcolor (#startX #startY #endX #endY (0-16777215) %b)  // поиск
for #k 1 16 1
    log %b[#k 1] %b[#k 2] %b[#k 3] //пишем в лог точки поиска
end_for
log -----------------------------
if  #a > 0
    while_not 457, 282 0  //ждем пока пазл рассыпится
        wait 500
    end_while
    wait 1s
    for #i 1 4
        set #ii #i - 1
        set #y #startY + #ii * #stepY + #deltaY
        set #deltaX 0
        for #j 1 4
            set #jj #j - 1
            set #x #startX + #jj * #stepX + #deltaX
            set #deltaX #deltaX + 2

            set #index #y * (#endX + 1) + #x + 1
            log #x #y   %b [#index 3]
            //move #x #y
            //wait 300
        end_for
        set #deltaY #deltaY + 2
        log
    end_for
end_if
end_script

Log:
Цитата

410 210 4794391
411 210 4728598
412 210 4662805
413 210 4597012
414 210 4662805
415 210 4662805
416 210 4662805
417 210 4597012
418 210 4662035
419 210 4662035
420 210 4662035
421 210 4793364
422 210 4793364
423 210 4793110
424 210 4858903
425 210 4858903
-----------------------------
410 210
512 210
614 210
716 210

410 312
512 312
614 312
716 312

410 414
512 414
614 414
716 414

410 516
512 516
614 516
716 516

как бы не вкуриваю чо он выводит ohmy.gif
cirus
Цитата
чо он выводит

Координаты и цвет в этих координатах.
Цитата
for #k 1 16 1
log %b[#k 1] %b[#k 2] %b[#k 3] //пишем в лог точки поиска
end_for

Это убрать.
Цитата
set #index #y * (#endX + 1) + #x + 1

Заменить на:
Код
set #index (#y - #startY) * (#endX - #startX + 1) + #x - #startX + 1
FREEON
Цитата(cirus @ 3.3.2019, 19:14) *

Координаты и цвет в этих координатах.

Неее... это и хотел узнать их цвет и координаты в точках...но смущает их шаг в 1 пиксель, по идее должно было вывести шаг по 100px по обоим осям координат.
Цитата

Это убрать.

Заменить на:
Код
set #index (#y - #startY) * (#endX - #startX + 1) + #x - #startX + 1


Заменил...вот результат log
410 210 4794391
411 210 4728598
412 210 4662805
413 210 4597012
414 210 4662805
415 210 4662805
416 210 4662805
417 210 4597012
418 210 4662035
419 210 4662035
420 210 4662035
421 210 4793364
422 210 4793364
423 210 4793110
424 210 4858903
425 210 4858903
-----------------------------
410 210 4794391
512 210 6824719
614 210 14516026
716 210 7091473

410 312 8270624
512 312 13591585
614 312 6059417
716 312 12148251

410 414 9130295
512 414 13285049
614 414 12899815
716 414 6719661

410 516 11058372
512 516 15523547
614 516 13393441
716 516 12884349
cirus
Цитата
но смущает их шаг в 1 пиксель

Потому что это неправильно и постом выше написано что надо убрать цикл.
Цитата
но идее должно было вывести шаг по 100px по обоим осям координат.

Не 100, а 102, сами же писали что смещение на 2 пикселя для каждой плитки.

FREEON
Цитата(cirus @ 3.3.2019, 19:48) *

Не 100, а 102, сами же писали что смещение на 2 пикселя для каждой плитки.

Все верно на 2 после разбивки пазла.
А как правильно записать вывод лога? чо цикл не катит ведь если построчно писать то оно ж по идее так же запишется ведь счетчик #k эта ж тоже самое что разбивка на элементы...или нет
Теперь шаблон запоминаем этой строкой?
Код
set #a findcolor (#startX #startY #endX #endY (0-16777215) %b)  // поиск
cirus
Цитата
Теперь шаблон запоминаем этой строкой?

Нет. Как было так и остаётся, потому что:
Цитата
когда пазл рассыпается происходит смещение пикселей.

Запоминать надо до того как он изменился. А сначала никакого смещения нет.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.