Да не так уж сложно это сделать на скриптах то.
1) Берем картинку и разбиваем на кусочки так:
puzzle_x = 10 # Позиция паззла по oX
puzzle_y = 10 # Позиция паззла по oY
piece_width = original_img.width / pieces_in_row
piece_height = original_img.height / rows
@pieces = []
for n in 0..rows
piece_row = []
for m in 0..pieces_in_row
piece = Sprite.new(Viewport.new(m * piece_width + puzzle_x, n * piece_height + puzzle_y, piece_width, piece_height))
piece.contents = Bitmap.new(piece_width, piece_height)
piece.contents.blt(0, 0, Rect.new(m * piece_width, n * piece_height, piece_width, piece_height))
piece.x = m * piece_width + puzzle_x
piece.y = n * piece_height + puzzle_y
piece_row.push(piece)
end
@pieces.push(piece_row)
end
Таким образом получаем набор кусочков исходного изображения.
2) Позволить пользователю выбирать кусочки.
Делается аналогично выбору во всяких менюшках. Приблизительно так:
def initialize
@row = 0
@column = 0
selection_reset
end
def selection_reset
@selected_piece_id = -1
end
def onUserTriggeredHorizontal(isRightDir)
if isRightDir
@column += 1
else
@column -= 1
end
end
def onUserTriggeredVertical(isDownDir)
if isDownDir
@row += 1
else
@row -= 1
end
end
def swap_pieces(piece1, piece2)
tmp_x = piece1.x
tmp_y = piece1.y
piece1.x = piece2.x
piece1.y = piece2.y
piece2.x = tmp_x
piece2.y = tmp_y
end
def onUserTriggeredC
if @selected_piece_id
swap_pieces(@selected_piece, @pieces[@row][@column])
end
@selected_piece_id = @pieces[@row][@column]
check_win_conditions
end
def onUserTriggeredB
selection_reset
end
def check_win_conditions
# Тут пробежать по всем кусочкам и проверить на своих ли они местах
# Для этого, в них можно, например, записывать порядковый номер
end
Итог: Картинка разбивается на кусочки, которые независимы и могут быть перемешаны случайным образом.
Пользователь может выбрать кусочек и поменять его местами с другим кусочком.
После каждого хода происходит проверка, не собрано ли исходное изображение.