Обнаружение "больше не двигается" в игре-головоломке - PullRequest
1 голос
/ 05 марта 2012

Некоторое время назад я написал небольшую игру во Flash, которую теперь перекодирую на C # с моим новым опытом программирования.Однако в этот раз я хочу реализовать идею определения того, когда решетка стала невозможной для решения.Это скорее концептуальная головоломка, чем что-либо еще, но я возьму любые ресурсы, которые у вас могут быть.

Игра включает в себя перемещение игрока вверх, вниз, влево или вправо по карте, перемещая блоки вокруг.Уровень выигрывается, когда больше не осталось блоков определенных видов.Однако легко оказаться на нерастворимой карте.Например, если игрок начинает застрять в кольце блоков стен, то нет никакого способа его решить вообще.

Извините за абстрактный вопрос, но есть ли у кого-нибудь какие-либо подсказки для этого?

Ответы [ 4 ]

2 голосов
/ 05 марта 2012

У вас есть два варианта. Оба имеют свои преимущества и недостатки, поэтому вы можете объединить идеи обоих в свое решение.

Вариант 1: написать эвристику

Подумайте о ситуациях, которые делают игру невозможной для решения (например, застревание в кольце блоков стен). Обнаружьте такие ситуации и напечатайте «больше не двигайтесь», как только такая ситуация возникнет. Чем больше таких ситуаций вы сможете придумать и реализовать, тем лучше будет ваш алгоритм.

Преимущество: легко и быстро.

Недостаток: в некоторых случаях игра неразрешима, но ваш алгоритм ее не обнаруживает.

Вариант 2: Написать решатель

Напишите программу, которая с учетом состояния вашей игры (где находится игрок, где находятся блоки и т. Д.) Выводит список шагов, которые можно предпринять для решения игры (или null или какое-то другое специальное значение, когда решения больше нет - это ваш случай "больше никаких ходов").

Как реализовать что-то подобное, зависит от точных правил игры. Простой подход состоит в том, чтобы выполнить Поиск в ширину в Игровом дереве : каждый узел в вашем дереве является игровым состоянием, а каждая дуга между узлами является возможным действием, которое игрок может выполнить может взять (двигаться вверх, двигаться вниз и т. д.).

Преимущество: надежно определяет, когда игру больше нельзя выиграть. Кроме того, эта программа может использоваться, чтобы давать подсказки игроку, когда он застревает.

Недостаток: в зависимости от сложности вашей игры вычисление решения может занять много лет. Для очень простых игр это может сработать; для некоторых простых игр это может занять очень много времени, а для довольно сложных игр, таких как шахматы или шашки, это очень сложно или невозможно.

0 голосов
/ 05 марта 2012

Мне нужно что-то подобное один раз. Я сделал случайный сгенерированный лабиринт, и мне нужно было узнать, возможно ли его решить ...

Я сделал тест, который проверил все возможные решения. Площадь игры (2D) составляла 10 * 14 плиток, и игрок мог двигаться в 4 направлениях (как в вашей игре). Моя игра была просто о переходе из точки А в точку Б. С одной стороны, ваша игра примерно такая же, она собирается переместить блоки из точки А в В. Я бы начал с текущей позиции блоков, а затем создал алгоритм, который попробуйте переместить его в каждом направлении. Если бы для блока было возможно какое-либо направление, я бы добавил плитку (к которой я пытался переместить блок) в список, содержащий все еще не проверенные плитки, которые нужно было проверить ...

Итак, начните с одной плитки ... проверьте 4 направления ... затем проверьте плитки, на которые можно было перейти. Таким образом, если было возможно переместить блок вправо, то вам нужно проверить, можно ли переместить блок из тайла вправо в любую другую позицию. Чтобы отследить, какие плитки вы тестировали, объявите переменную в плитке, которая сообщает, тестируется ли она или нет, и список плиток, которые «можно достичь» и еще не тестировали.

0 голосов
/ 05 марта 2012

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

Конечно, сбез описания игры, невозможно дать вам какой-то конкретный совет, но просто примите совет @ Heinzi и помните, что вы только смотрите, есть ли какие-либо законные действия.Так что если вы действительно можете построить непустое Игровое дерево , то осталось несколько законных ходов.

0 голосов
/ 05 марта 2012

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

Конечно, для таких игр, как пасьянс, вы должны учитывать только то, что знает пользователь, а не скрытые элементы в игре - некоторые пасьянсы просто невозможно начать, но игрок не должен этого знать. Для других, более сложных игр, грубая сила не подходит, потому что дерево генерируется слишком долго. В этих случаях вам нужно найти общие шаблоны и обнаружить их.

Извините, это слишком расплывчато для какого-либо конкретного ответа. Но это мои советы.

...