проектирование головоломки - PullRequest
1 голос
/ 31 октября 2010

Я планирую разработать игру-головоломку. Теперь у меня уже есть изображения и фрагменты изображений, поэтому нам не нужен алгоритм для разрезания изображения на части.

На стороне пользовательского интерфейса будет две секции

  1. Первый раздел содержит разбитые изображения в случайном порядке.
  2. Второй раздел содержит схему полного изображения. Пользователь должен перетащить вырезанные изображения на контурное изображение.

Я не уверен, как можно совмещать части на контуре? Есть идеи по поводу алгоритма или стартовых указателей?

Ответы [ 5 ]

2 голосов
/ 04 ноября 2010

Разрешить пользователю перетаскивать каждый элемент в область контура. Разрешить поворот части с шагом 90 градусов.

Вариант 1: Если часть находится в правильном месте в общей головоломке, и под правильным углом, И соединена с другой частью, то защелкните ее на месте с некоторой обратной связью с пользователем. Внешний край головоломки может рассчитывать на связь с краями.

Вариант 2: Сосед - это смежная часть головоломки, когда она собрана. Когда кусочки головоломки перепутаны, у них остаются те же соседи. Каждая часть головоломки (кроме краевых) имеет четырех соседей.

Если кусок находится рядом с одним из его соседей под правильным углом относительно этого соседа, то привязайте его к другому фрагменту. Затем позвольте двум (или более) фигурам перетаскиваться как единое целое, как это делается с одним куском. Это позволило бы пользователю собирать подразделы головоломки в любой области, как это делается с помощью физической головоломки, и связывать подразделы друг с другом.

Вы можете проверить деталь, перемещаемую к его четырем соседям, чтобы увидеть, достаточно ли они близки, чтобы соединиться. Если у правильного края элемента достаточно близко к соответствующему краю соседа, под тем же углом, то они совпадают.

Есть несколько способов проверить относительные местоположения. Один из способов - временно повернуть координаты части, которую вы тестируете, чтобы она была в вертикальном положении, а затем повернуть координаты всех желаемых соседей, также временно, на один угол. (Используйте один и тот же центр вращения для всех поворотов.) Затем вы можете легко проверить, достаточно ли они близки для соответствия. Если пользователь перетаскивает подсборку, вам необходимо проверить каждую несопоставленную кромку в подсборке.

Вариант 2 более сложный и реалистичный. Вариант 1 можно еще больше упростить, исключив вращение деталей и сделав для каждой детали первоначальный угол.

1 голос
/ 31 октября 2010

Для правильной формы вы можете пойти с матрицей.Я рекомендую это как первый подход.Разделить головоломку так же просто, как определить X, Y размеры матрицы.Для каждой фигуры у вас есть серия из четырех значений, по одной для каждой стороны, с указанием, плоская ли она, указывающая или указывающая. Это даст вам очень классическую настройку головоломки.

Как фигурына самом деле внешний вид становится строгим графическим интерфейсом.Теперь для первого черновика я рекомендую заставить его работать с идеально квадратными кусочками.Получение прямоугольных фрагментов изображения должно быть простым в любой среде графического интерфейса.

Для перехода к фигурным фигурам вам понадобится серия шаблонов.Они станут масками, которые вы примените к изображению.Каждая маска вырезает крошечную часть изображения, чтобы создать ваш кусок.Вам, вероятно, нужно будет динамически создавать маски, чтобы подогнать их под загадку.Сначала начните с просто треугольных соединений.После того, как вы это сделаете, вы можете сделать математику, чтобы получить красивые выпуклые формы разъема.Найдите «клип» и «маску» в вашей графической среде.

Если вы хотите создавать неправильные формы многоугольника, которые не соответствуют общему матричному расположению, то вам нужно проделать гораздо больше работы.Вот почему я рекомендую, чтобы квадрат сначала работал как хороший пример.Теперь вам нужно углубиться в теорию графов и разбиение.Возьмите несколько книг по 3D-программированию, сосредотачиваясь на алгоритмах, поскольку они все время делятся.Хотя я не сомневаюсь, что есть книга с этой конкретной темой.

Веселитесь.

0 голосов
/ 09 ноября 2010

Вы можете создать массив объектов класса «PuzzleTile»

Каждая такая плитка имеет изображение и целое число
После каждого хода проверять, правильно ли отсортированы целые числа, значит:
123
456
789

Вы можете сделать функцию для того, что возвращает bool.

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

0 голосов
/ 09 ноября 2010

1) Как разбить изображение на случайные полигоны

Похоже, вы разобрались в этой части.(из: «Теперь у меня уже есть изображения и фрагменты изображений, поэтому нам не нужен алгоритм для разрезания изображения на части.»)

2) Какая структура данных может решить проблему

В этом примере вы можете создать классную фигуру, например, класс Scribble, и ваши фигуры будут массивом объектов класса фигуры.Таким образом, у вас будет два массива: (i) массив фактических фрагментов изображения (ii) массив контуров фрагмента изображения

Таким образом, всякий раз, когда вы перетаскиваете один фрагмент на полный контур изображения, он проверяет, является лиОбъект фрагмента изображения пересекается с более чем на 80% и ID (переменная-член объекта Piece) фактического фрагмента изображения и контуров фрагмента изображения совпадает, тогда вы получите правильный фрагмент в нужном месте ...

3) Реализация пользовательского интерфейса

Проверьте это out.

0 голосов
/ 31 октября 2010

структура данных проста, я думаю - каждый мир будет указывать на своих соседей и будет сохранять фактическую форму для отображения.

в MMI (UI) приложения - какова ваша среда разработки?Если это окна - я бы пошел с C # и winforms или даже лучше, wpf.если это Unix, вам нужно будет посоветоваться с кем-то еще, потому что я здесь не эксперт.

...