Использование 2D-массивов для создания уровня

У меня есть 2D-массив 9x9. Я хочу создать очень Binding of Isaac-esque напольную систему. Я хочу использовать 2D-массив для создания карты комнат в массиве 9x9. Я просмотрел весь Интернет, но не могу найти алгоритм или какой-то полезный код, который поможет мне это сделать. Проблемы таковы: использование 2D-массива для создания пола из комнат, которые соединяются - скажем, что-то вроде этого, где 1 - это комнаты, а 0 - это ничто...

[['0','0','0','0','0','0','0','0','0'],
 ['0','0','0','0','1','0','0','0','0'],
 ['0','0','1','1','1','1','1','0','0'],
 ['0','0','1','0','1','0','0','1','0'],
 ['0','2','1','1','1','1','1','1','0'],
 ['0','0','0','0','1','0','1','0','0'],
 ['0','0','0','0','1','0','1','1','0'],
 ['0','0','0','0','1','0','0','0','0'],
 ['0','0','0','0','0','0','0','0','0']]

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

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


person Owen Penn    schedule 08.06.2020    source источник
comment
Вы можете определить список возможных типов комнат и их свойств. В качестве отправной точки максимальное количество дверей в нем (в будущем вы можете добавить другие ограничения, например, минимальное расстояние от центра). Для каждого генератора уровней вы храните информацию о том, сколько комнат данного типа вы хотите на уровне. Начните с комнаты в центре. Затем вы можете просто итеративно попытаться построить карту, размещая одну комнату A в каждой итерации так, чтобы она соприкасалась с существующей комнатой B, и если это нарушает ограничения A или B, тогда ищите другое место. Также можно случайным образом добавить больше дверей. .   -  person Sopel    schedule 09.06.2020


Ответы (1)


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

Вопрос 1) Использование двумерного массива

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

Начнем с простого, я предполагаю, что все комнаты имеют размер 1x1,

Чтобы определить двери, прикрепленные к этой комнате, используя ваш массив 2d, вы должны пройти через каждую комнату с вложенным циклом for и проверить их соседние соседи.

Очень простой псевдокод

# your 2d array is called map in this example
room_array = []
for i in range(len(map)):
    new_room_row = []

    for j in range(len(map[i])):
        new_room = Room()

        # when our room is initialized all doors are false
        # checking each direction if it's not nothing
        if map[i-1][j] != 0
            new_room.up_door = true
        if map[i+1][j] != 0
            new_room.down_door = true
        if map[i][j-1] != 0
            new_room.left_door = true
        if map[i][j+1] != 0
            new_room.right_door = true

      new_room_row.push(new_room)

  room_array.push(new_room_row)

Итак, мы начнем с создания «room_array», который станет следующим шагом в разработке подземелья. Массив комнат представляет собой 2D-карту того же размера, что и массив карт, но с большей детализацией. Мы перебираем массив карт и создаем новую комнату, которая представляет каждый элемент вашего массива карт. По пути мы проверяем соседние элементы, чтобы увидеть, нужна ли нам дверь, открывающаяся в этом направлении для этой комнаты. Когда у вас есть все комнаты, вам просто нужно назначить им спрайт/рисунок/стены и т. д. в зависимости от того, где находятся двери. (Столкновение может быть сложно сделать в pygame, у меня нет большого опыта использования pygame, но я проделал большую работу в Unity)

Вопрос 2) Ограничения по комнатам и создание карты

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

Это действительно сводится к вашему алгоритму. Есть много способов сделать это, но я бы просто удостоверился, что при создании исходной «карты» 2D-массива есть как минимум 1 комната с 1 соседом. Пример Способы сделать это:

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

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

person JonKleehammer    schedule 08.06.2020