Во-первых, вам нужно некоторое чувство местоположения. Ваши различные объекты занимают некоторое количество координатного пространства.
Вы должны решить, насколько регулярны эти разные вещи. В простейшем случае вы можете поместить их в свое координатное пространство в виде простых прямоугольников (или прямоугольных тел), чтобы упростить планирование мест.
Если вещи нерегулярны - и плотно упакованы - жизнь несколько сложнее.
Определить карту, чтобы содержать местоположения. Каждое местоположение имеет диапазон координат; если вы работаете с простыми прямоугольниками, то у каждого местоположения может быть (левый, верхний, правый, нижний) кортеж.
Ваша Карта будет нуждаться в методах, чтобы определить, кто находится в данном пространстве, что находится рядом с ним и т. Д.
Затем вы можете выполнить это модульное тестирование с фиксированным набором отработанных вами местоположений, которые все можно сбросить на карту и пройти некоторые базовые проверки работоспособности на отсутствие конфликтов, смежности и т. П.
Во-вторых, вам нужен своего рода "генератор лабиринта". Односвязный лабиринт легко генерируется как древовидная структура, сложенная в заданное пространство.
Лабиринт / дерево имеет «корневой» узел, который будет центром лабиринта. Не обязательно физический центр вашего пространства, но корневой узел будет серединой структуры лабиринта.
В идеале, одна ветвь этого узла содержит один «вход» во все пространство.
Другая ветвь этого узла содержит один «выход» из всего пространства.
Кто-то может бродить от входа к выходу, посещая множество «тупиковых» мест по пути.
Выберите место для корневого узла. Поместите его в свое место на карте.
Это будет иметь 1 - n входов, каждый из которых является поддеревом с корневым узлом и 1 - n входов. Именно этот бизнес с несколькими входами делает дерево естественным образом подходящим для этой структуры. Также правильное дерево всегда хорошо связано тем, что у вас никогда не бывает изолированных разделов, которые не могут быть достигнуты.
Вы - рекурсивно - расправляетесь с корневым узлом, выбирая местоположения и сбрасывая их в доступное пространство.
Проведите модульный тест, чтобы убедиться, что он достаточно хорошо заполняет пространство.
Остальные ваши требования - точная настройка того, как генератор лабиринта выбирает места.
Самое простое - иметь таблицу весов и случайный выбор. Выберите случайное число, сравните его с весами, чтобы увидеть, какой тип местоположения будет идентифицирован.
Ваше определение пространства может быть 2D или 3D - оба довольно рациональны. Для получения бонусного кредита подумайте, как бы вы реализовали 2D-пространство, выложенное плиткой с шестиугольниками вместо квадратов.
Эта «геометрия» может быть плагином Strategy для различных алгоритмов. Если вы можете заменить квадратное 2D на шестиугольное 2D, вы хорошо поработали над OO Design.