Размещение здания в 2D дискретной игре

Я работаю в сетке-вселенной - объекты существуют только в целочисленных местах в двумерной матрице.

Некоторые термины:

Площадь - дискретное место. Каждый квадрат имеет координаты int x и int y, и никакие два квадрата не имеют одинаковую пару x и y.

Смежный: Квадрат X смежен с другим квадратом Y, если величина разницы в их координатах x или y не больше 1. Проще говоря, все квадраты сразу в N, NE, E, SE, S, SW Направления W и NW являются смежными.

Legend:
'?' - Unknown Traversibility
'X' - Non Traversable Square
'O' - Building (Non Traversable)
' ' - Traversable Square

Эта проблема:

Учитывая следующую общую ситуацию:

? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? O O ? ? ?
? ? ? O O ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?

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

Основные действительные решения:

X X X X X X X X          X X X     X X X          X X X X X X X X
X X X X X X X X          X X X     X X X          X X X X X X X X
X X X X X X X X          X X X     X X X          X X X X X X X X
X X X O O X X X          X X X O O X X X          X X X O O X X X
X X X O O X X X          X X X O O X X X          X X O O O X X X
                         X X X O   X X X                O X X X X
      O O                X X X O   X X X                X X X X X
                         X X X     X X X                X X X X X 

В настоящее время я перебираю все пройденные квадраты, прилегающие к четырем зданиям, и ищу квадраты, которые имеют 3 смежных проходных квадрата, но иногда это приводит к ситуациям, таким как:

X X X X X X X X          X X X X X X X X          X X X X X X X X
X X X X X X X X          X X X X X X X X          X X X X X   X X
X X X X X X X X          X X   O     X X          X     X X   O X
X X X O O X X X          X X   O O O X X          X     O O O X X
X X X O O X X X          X X   O O   X X          X X   O O   X X
X X X     X X X          X X         X X          X X         X X
X X X O O X X X          X X X     X X X          X X X     X X X
X X X     X X X          X X X     X X X          X X X     X X X 

Любые мысли о том, как я могу улучшить свой алгоритм?

РЕДАКТИРОВАТЬ: Добавлен еще один неудачный случай.

РЕДАКТИРОВАТЬ: Я также хотел бы быть в состоянии знать, если нет возможной конфигурации, в которой эти условия могут быть выполнены. Мне не гарантировано жизнеспособное решение, и я не хотел бы попробовать, если нет способа сделать это успешно.

3 ответа

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

Это должно сработать, если вы можете с уверенностью предположить, что вы не более стеснены, чем в случае задачи 2. Если имеется только один квадрат выхода, то единственные решения должны будут нарушать условие "не более одного", предложенное выше.

Ваши недействительные случаи из-за разделения свободного пространства на 2 части, верно? В этом случае грубым методом будет заполнение свободного пространства после размещения здания и проверка правильности размера подключенного пространства (на 2 клетки меньше, чем до размещения здания). Это кажется чрезмерным. Вы действительно хотите знать, связан ли график квадратов свободного пространства. В частности, вы хотите знать, все ли свободные площади вокруг новых зданий все еще связаны. Должны ли они быть локально связаны, или путь может быть сколь угодно длинным? то есть это действительно:

XXXXXXXX
XXX
XXXXXX
XXXXXX
XOXX
XXOOOXX
XXOOXX
XXXX
XXXXXX
XXXXXX

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

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

Я не знаю, является ли это наиболее эффективным подходом, но его было бы довольно просто реализовать, поскольку процедуры поиска пути A* довольно широко реализованы. И на самом деле, поскольку вам не нужен кратчайший путь, просто путь, вы можете просто выполнить заполнение свободного пространства, начиная с соседнего квадрата, пока не дойдете до края карты.

Другие вопросы по тегам