2012-04-03 2 views
2

Я уже реализовал функцию, когда кипер автоматически перемещается с использованием алгоритма поиска по ширине. Теперь я хочу, чтобы он также автоматически перемещал поля (если хранитель может перемещать поле из источника в пункт назначения, не перемещая другие поля). Как это сделать? Я пробовал модифицировать BFS, но еще не успел.Sokoban game: автоматически перемещать поля

ОБНОВЛЕНИЕ: Мне не нужно решать головоломку. Вместо этого я хочу разработать удобный пользовательский интерфейс, когда пользователь может перемещать коробки своей мышью. Для этого мне нужен некоторый алгоритм, который позволит вычислить последовательность перемещения. Но речь идет только о перемещении одного окна, и если для этого не нужно перемещать только другие блоки.

+0

Какова конкретная проблема, с которой вы сталкиваетесь (помимо широкого «она не работает»)? – Attila

+0

Он хорошо решает простые маршруты (когда путь к коробке содержит каждое место только один раз). Но есть также сложный случай, когда ящики в каждом месте больше чем один раз (например, вы перемещаете поле в большую область, чтобы переместить хранителя, а затем перемещает поле обратно по тому же пути). Я считаю, что я должен хранить не только, если посетили определенное местоположение, но и где был хранитель на данный момент). –

+0

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

ответ

4

Используйте поиск по ширине, как раньше (или A *, если хотите), но ищите соответствующий набор состояний.

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

Вот самый маленький нетривиальный пример. Предположим, у нас есть уровень Sokoban с квадратами помечены следующим образом:

Sokoban level with squares numbered 1 to 6

Сетка содержит хранитель и один блок.Пространство состояний состоит из пар квадратов, занятых хранителем и блоком. Есть 56 таких состояний, нарисованных как маленькие круги на диаграмме ниже.

state space with 56 states

Линия показывает возможные переходы внутри этого пространства состояний. Тонкие линии соответствуют перемещениям хранителя (и являются двунаправленными). Тяжелые линии соответствуют нажатию блока (следовательно, идут только в одном направлении). Это это состояние пробела, которое нужно искать.

Например, если блок начинается в 7 и хранителем на 8, то хранитель может нажать на блок 8, следуя красный путь в пространстве состояний:

non-trivial path in state space

Следует отметить, что вдоль этот путь, блок проходит через позиции 7-6-5-6-7-8. Вы не могли бы найти этот путь, просто рассматривая позиции для блока, так как блок дважды проходит через позиции 6 и 7.

+0

Спасибо за отличное объяснение. Не могли бы вы поделиться, как вы делали эти красивые иллюстрации? –

+1

Добро пожаловать. Я сделал диаграммы, используя [OmniGraffle] (http://www.omnigroup.com/products/omnigraffle/). –

+0

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

3

От Wikipedia - Sokoban:

Sokoban можно изучать с помощью теории вычислительной сложности. Было доказано, что проблема решения головоломок Sokoban NP-hard. 3 Это также интересно для искусственного интеллекта исследователей, потому что решение Sokoban можно сравнить с проектированием робота , который перемещает коробки на складе. Дальнейшая работа показала, что решение проблем Sokoban также является PSPACE-полным. [4]

Sokoban затруднен не только из-за его фактора разветвления ( , сопоставимого с шахматами), но и его огромной глубины поиска дерева; для некоторых уровней требуется более 1000 «толкает». Квалифицированные человеческие игроки полагаются в основном на эвристику; они, как правило, могут быстро отказаться от бесполезных или избыточных линий игры, а также распознать узоры и подцели, , резко сократив количество поиска.

Некоторые Сокобан головоломки могут быть решены автоматически с помощью алгоритма поиска с одним агентом, таким как IDA *, повышается за счет нескольких методов, которые используют знания предметно-ориентированного. [5] Это метод , используемый Rolling Stone, решателем Sokoban, разработанным Университетом Альберты GAMES Group. Более сложные уровни Сокобана , однако, недоступны даже для лучших автоматических решателей.

Это то, что вы хотели знать?

Кстати, решение головоломок Sokoban в оптимально оптимальном варианте - NP-hard, что означает, что вас ждет $1,000,000 prize, если вы выясните, как это сделать.

Смежные вопросы