Что нового

Сортировка картинок

Sergio

Новичок
Сообщения
41
Репутация
3
Искал на просторах интернета, но так и не смог найти информацию по поводу сортировки кубиков или игры три в ряд. В общем есть необходимость собрать из 6 квадратов картинку. Вся трудность как мне забить данные квадраты в массив (или может иной метод) и отсортировать их именно в таком порядке как мне надо. Появляются они в случайном порядке
 

Вложения

  • травка 1 - копия.png
    травка 1 - копия.png
    173.4 КБ · Просмотры: 18

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Если содержимое квадратов не меняется, то можно рассчитать контрольную сумму каждого квадрата
Код:
PixelChecksum()
Ещё можно нарезать квадраты на отдельные картинки и искать их на общем рисунке.
 
Автор
S

Sergio

Новичок
Сообщения
41
Репутация
3
InnI

Спасибо за наводку насчет определения квадрата, а как производить сортировку, с помощью какой функции?
Квадраты появляются в разном порядке, и составить их необходимо как на скриншоте. Если не сложно какую функцию использовать и какой алгоритм к действию?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Sergio
как производить сортировку
Что значит "сортировку"?

алгоритм к действию
1. Заранее создаёте массив контрольных сумм квадратов на собранной картинке - это ваша цель.
2. Создаёте массив контрольных сумм квадратов на "разобранной" картинке - это текущее расположение квадратов.
3. Теперь вы знаете, где квадраты находятся и где они должны быть. Остаётся только переместить.

Вот пример пункта 1. Сделан на базе вашей картинки. Для упрощения картинка пересохранена в bmp
Код:
Opt("PixelCoordMode", 0)

GUICreate("Pic", 424, 280)
$hPic = GUICtrlGetHandle(GUICtrlCreatePic("травка 1 - копия.bmp", 0, 0, 0, 0))
GUISetState()
Sleep(300)

Global $Left = 19, $Top = 13, $Size = 128, $Array[2][3]

For $i = 0 To 1
  $Y = $Top + $Size * $i
  For $j = 0 To 2
    $X = $Left + $Size * $j
    $Array[$i][$j] = PixelChecksum($X, $Y, $X + $Size - 1, $Y + $Size - 1, 1, $hPic)
  Next
Next

#include <Array.au3>
_ArrayDisplay($Array)
 
Автор
S

Sergio

Новичок
Сообщения
41
Репутация
3
InnI
В продолжение темы. Вот мы знаем где наши квадраты должны быть и где они находятся. Как теперь заставить программу перемещать квадраты на свои места. Сутки просидел, так и не разобрался.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Sergio
Как теперь заставить программу перемещать квадраты на свои места
Я не знаю, я в эту игру не играл. Подозреваю, что мышкой ;)
У вас есть координаты всех квадратов. Перемещаете мышь в пределы квадрата, зажимаете ЛКМ, и тащите в координаты нужного квадрата. Все три действия делает
Код:
MouseClickDrag()
 
Автор
S

Sergio

Новичок
Сообщения
41
Репутация
3
InnI

Я начинающий пользователь AUTOIT, поэтому, как у опытного эксперта в области программирования, прошу подсказку №3

вся сложность возникает, когда пытаюсь придумать как реализовать сравнение массивов. У них одни и те же элементы, но в разных местах. Как я понимаю, нужно сортировать массив который формируется на игровом поле в соответствии с тем что задан изначально, при этом еще и производить перетаскивание квадрата на нужную позицию.

Код:
Global $LeftPazl = 19, $TopPazl = 13, $SizePazl = 128, $ArrayPazl[2][3]	;координаты где появляется пазл
Global $Pazl_One[2][3] = [[3774743776,3571267940, 1878377077],[2524944636, 2560274624, 2320567673]]		; контрольные суммы собранного пазла №1
Global $Pazl_Two[2][3] = [[1681357896,2684826571, 1584684223],[4868741368, 1123548456, 2546324566]]		; контрольные суммы собранного пазла №2
Global $Pazl_Three[2][3] = [[1568745356,1235486456, 4862657465],[2560456624, 1459274625, 3215685258]]	; контрольные суммы собранного пазла №3

Func Pazl()

   For $m = 0 To 1
  $Y = $TopPazl + $SizePazl * $m
  For $n = 0 To 2
    $X = $Left + $Size * $n
    $ArrayPazl[$m][$n] = PixelChecksum($X, $Y, $X + $SizePazl - 3, $Y + $SizePazl - 3, 1)
  Next
Next
;где то здесь нужно сравнить полученный массив с заранее заданными. Не понятно как одновременно использовать и циклы для перебора элементов массива, и сравнивать разные массивы (заранее заданных массива более 3х будет(пазлов на проверку в игре много - типа антибот), и надо сначала как то выяснить какой массив вообще брать за эталон), и еще производить перетаскивание квадрата с одной позиции на другую.
   EndFunc


надеюсь сейчас понятно объяснил задачу.

з.ы.: чем снимать скриншоты, чтобы все цвета оставались в сохранности? А то есть подозрение, что не все цвета передают правильный оттенок при сохранении через PAINT.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Sergio
выяснить какой массив вообще брать за эталон
Если все пазлы разные, то и контрольные суммы будут разные. Следовательно, достаточно рассчитать контрольную сумму одного из квадратов (например, левого верхнего) и произвести поиск по всем массивам. В каком она будет найдена - тот массив и "эталон".

сравнение массивов
Предварительно создайте дополнительный массив координат - точек внутри квадратов.
Оригинальный массив контрольных сумм:
Код:
1111|2222|3333
4444|5555|6666
Массив координат точек внутри квадратов:
Код:
10:10|20:10|30:10
10:20|20:20|30:20
Полученный массив контрольных сумм:
Код:
3333|5555|2222
4444|1111|6666
Берёте первую сумму из элемента оригинального массива [0,0] и находите её в элементе массива [1,1]. Соответственно, перетаскиваете из координат элемента [1,1] в координаты элемента [0,0]. Не знаю, что происходит потом, но если квадраты на пазле меняются местами, то нужно и в полученном массиве поменять значения элементов
Код:
Global $aOriginal[][] = [[1111,2222,3333],[4444,5555,6666]]
Global $aCoord[][] = [["10:10","20:10","30:10"],["10:20","20:20","30:20"]]
Global $aFind[][] = [[3333,5555,2222],[4444,1111,6666]]

; ищем контрольную сумму
For $i = 0 To 1
  For $j = 0 To 2
    If $aOriginal[0][0] = $aFind[$i][$j] Then ExitLoop 2
  Next
Next

; получаем координаты из строки
$From = StringSplit($aCoord[$i][$j], ":")
$To = StringSplit($aCoord[0][0], ":")

; перетаскиваем квадрат
MouseClickDrag("Left", $From[1], $From[2], $To[1], $To[2])

; меняем значения элементов массива
$Temp = $aFind[0][0]
$aFind[0][0] = $aFind[$i][$j]
$aFind[$i][$j] = $Temp

; теперь всё то же самое для $aOriginal[0][1] и т.д.


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