Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.05.2018
Сообщений: 51

Генерация подземелья массивом

04.07.2024, 08:43. Показов 785. Ответов 12

Студворк — интернет-сервис помощи студентам
Вообще не понимаю, можно пожалуйста с куском кода который это делает, уже года 2 смотрю уроки, есть похожее, но совсем не то что мне нужно. Все блоки в 3д и одикового размера.
Каждый блок размером 5 на 5 на 5.

я думаю что через массив как-то

Обозначения с картинок:
0 - это коридор, соединяет все комнаты и из коридора есть проход в любую комнату,
1 - стена комнаты, кадая комната окружена стенами
2 - дверь, которая в комнате от 1 до 4, и каждая дверь ведет в коридор
3 - пол комнаты, всегда откужен стенами и 1-4 дверьми
4- лестница на 2 этаж

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

(если картинка не загрузилась) на картинке тоже самое почти только понятней

111111111111
111114133331
111110233331
133310133331
133310111111
133320000000
133310111111
111110133331
000000233331
111111133331
111111111111

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2024, 08:43
Ответы с готовыми решениями:

Генерация подземелья
У меня проблема написал сначала эту программу на консоле и там все работает, а в юнити он не хочет нормально спаумить вот скрин вот...

Процедурная генерация подземелья по готовому алгоритму
Всем привет, нашел такой алгоритм по генерации подземелья и он мне очень понравился. Решил переписать его с Dart на C# и интегрировать в...

Генерация построения латинского квадрата с char массивом
Помогите составить программу генерации построения латинского квадрата с char массивом = {'a', 'b', 'c', 'd'}; Есть пример с int...

12
 Аватар для Entheogen
9 / 7 / 2
Регистрация: 23.02.2020
Сообщений: 121
20.07.2024, 02:07
Размер комнат разный?
0
0 / 0 / 0
Регистрация: 27.05.2018
Сообщений: 51
21.07.2024, 07:11  [ТС]
Цитата Сообщение от Entheogen Посмотреть сообщение
Размер комнат разный?
я же написал, по картинке видно что разный
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,213
21.07.2024, 20:36
Цитата Сообщение от Bright4092b Посмотреть сообщение
даже нейронка пишет что-то непонятное и нерабочее
учитывая сложность и то, что заранее есть схемы, в твоем случае стоит занять ручным творчеством. настоящим. руками создавать уровни. ведь это все равно интереснее, хотя и муторно. я как 3d-шник сделал бы именно так. целые супермаркеты приходилось делать застройщикам с окружающей инфраструктурой, а такое думаю и ты потянешь, если замахнулся на такое в 3D. не стоит все взваливать на алгоритмы. это не всегда подходит и целесообразно.

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

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

Добавлено через 9 минут
хотя... можно двумерный массив использовать. где нет ничего ничего не ставить, а по индексам ставить нужные блоки.
но массив в ручную цифрами нужно будет заполнять по чертежам. и блоки должны быть сразу со стенами и потолком. стены отдельно алгоритмами тулить не вариант, и с шагом в 5. в принципе возможно. давай подробности, какие блоки ? как выглядят ? покажи.
но все равно, я в таком случае за ручную работу. ведь еще есть в любую сторону двери...
0
1144 / 309 / 159
Регистрация: 30.07.2022
Сообщений: 1,782
Записей в блоге: 4
21.07.2024, 20:53
Bright4092b, если я правильно понял, а это было не просто, описание задачи кое как написано, вам надо по шаблону из массива с текстом воссоздать 3д уровень?

если я угадал, то вот скрипт:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using UnityEngine;
 
public class MapGenerator : MonoBehaviour
{
    [SerializeField] private GameObject wallPrefab; // Представление стены
    [SerializeField] private GameObject floorPrefab; // Представление пола
    [SerializeField] private GameObject doorPrefab; // Представление двери
    [SerializeField] private GameObject stairPrefab; // Представление лестницы
    [SerializeField] private GameObject corridorPrefab; // Представление коридора
 
    [SerializeField] private char[] map = {
        '1','1','1','1','1','1','1','1','1','1','1','1',
        '1','1','1','1','1','4','1','3','3','3','3','1',
        '1','1','1','1','1','0','2','3','3','3','3','1',
        '1','3','3','3','1','0','1','3','3','3','3','1',
        '1','3','3','3','1','0','1','1','1','1','1','1',
        '1','3','3','3','2','0','0','0','0','0','0','0',
        '1','3','3','3','1','0','1','1','1','1','1','1',
        '1','1','1','1','1','0','1','3','3','3','3','1',
        '0','0','0','0','0','0','2','3','3','3','3','1',
        '1','1','1','1','1','1','1','3','3','3','3','1',
        '1','1','1','1','1','1','1','1','1','1','1','1'
    };
 
    private void Start()
    {
        for (int i = 0; i < map.Length; i++)
        {
            int x = i % 12; // Количество столбцов
            int z = i / 12; // Количество строк
 
            Vector3 position = new Vector3(x, 0, z);
 
            switch (map[i])
            {
                case '0':
                    Instantiate(corridorPrefab, position, Quaternion.identity);
                    break;
                case '1':
                    Instantiate(wallPrefab, position, Quaternion.identity);
                    break;
                case '2':
                    Instantiate(doorPrefab, position, Quaternion.identity);
                    Instantiate(corridorPrefab, position, Quaternion.identity);
                    break;
                case '3':
                    Instantiate(floorPrefab, position, Quaternion.identity);
                    break;
                case '4':
                    Instantiate(stairPrefab, position, Quaternion.identity);
                    break;
            }
        }
    }
}
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,213
21.07.2024, 21:02
и там, где лестница, нужен блок с проемом вверх, с проемом вниз для верхнего этажа. нужен набор, хорошо продуманных блоков на все случаи, и с дверьми такая же история. либо дополнительно разворачивать один, если проем только с одной стороны, что бы алгоритмом такое собирать.
в общем показывай блоки, тогда можно подумать.

Добавлено через 5 минут
Цитата Сообщение от ieretsumi Посмотреть сообщение
если я угадал, то вот скрипт:
думаю не угадал. все несколько сложнее.
0
 Аватар для Entheogen
9 / 7 / 2
Регистрация: 23.02.2020
Сообщений: 121
23.07.2024, 22:51
Если делать декомпозицию задач, то получается:
1 Генерация самих комнат. (Заполнение данных комнат объектами и добавление входов и выходов)
2 Случайное распределение комнат на локации, так чтоб не накладывались друг на друга.
3 Добавление лестниц и переходов на др уровень.

1Генерация самих комнат.
Random.Range для размеров комнаты. Нужен массив обьектов что будут раставляться рандомно в комнатах. Либо можно просто наделать ассетов комнат в ручную. Как по мне лучше именно сделать кучу комнат в ручную.

2Случайное распределение комнат на локации.
Случайный выбор позиции на локации. Проверка места на наличае других комнат. Если таковых нет то установка. Другое дело если надо сгенерить корридор в одну клетку, а комнаты у вас неизвестно каких размеров и что к чему. Технически это не сложно.

Декомпозиция
2.1. Переменная офсет на ширину коридора. Далее все пункты делаются с учетом офсета для коридора.
2.2.Выбирается позиция. Пусть будет левый нижний угол.
2.3. Производится проверка области, размером с максимальный размер комнаты.
2.3.Если место свободно, то устанавливаем любую комнату из массива комнат используя Randon.Range. Если позиция занята то уменьшаем область проверки пока не получим истину на проверку позиции. Если проверка дойдет до минимального значения размера комнаты то там будет зал или что то в этом роде. Либо можно сделать комнаты размером менее 3 на 3 и в них нельзя зайти.
2.4.После установки комнаты. Выбирается следующая точка для установки комнаты. Смешение "курсора" для установки новой комнаты можно реализовать циклом который сдвигает на одну клетку по иксу курсор, проверяет занята ли она, если занята, то смещается еще на одну клетку по иксу.(Так же здесь нужна проверка достигнут ли край сцены по иксу.) Если свободна то производится пункт 2.3.
2.5. Если достигнут, то курсор смещается по иксу на ноль, а по у на +1.(Можно ради оптимизации не на один, а на размер минимальной комнаты). Повторяется пункт 2.4.
(Момент с оффсетом на корридор я отпустил. Во всех пунктах надо брать в учет это. К примеру с проверкой позиции надо к размеру комнаты добавлять и офсет. Вроде еще умножать офсет на 2.

3 Это уже самим сможете. К тому же я не знаю какие требования к проходимости.

Картинка очень наглядна, но остается множество вопросов.

На ютубе видео уроки по генерации комнат с проходами, но без коридоров как у вас.
0
0 / 0 / 0
Регистрация: 27.05.2018
Сообщений: 51
23.07.2024, 22:57  [ТС]
без кода вообще не понимаю как сделать 2, + нужно максимально близко но чтобы был один блок коридора.
3. я хз любым возможным, чтобы из одного коридора был доступ к любой комнате
0
 Аватар для Entheogen
9 / 7 / 2
Регистрация: 23.02.2020
Сообщений: 121
23.07.2024, 23:05
Вообще сперва лучше производить проверку с минимального размера к максимальному.

Расписал я вариант поверхностно, не сильно задаваясь какие могут быть подводные камни, а они будут и возможно методика совершенно не рабочая.
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,213
23.07.2024, 23:19
Цитата Сообщение от Entheogen Посмотреть сообщение
1Генерация самих комнат.
Random.Range для размеров комнаты. Нужен массив обьектов что будут раставляться рандомно в комнатах.
читайте внимательнее задачу. у него заранее заготовленные схемы и рандом не подходит. я просил показать какие у него блоки, просил показать код, который имеется на данный момент, чтобы разобраться и попытаться решить задачу, а он ждет код от нас. он похоже не достаточно хочет. никакой код не поможет, если блоки для этого не продуманы. руками тоже похоже не хочет собирать.
жди товарищ... жди !
0
 Аватар для Entheogen
9 / 7 / 2
Регистрация: 23.02.2020
Сообщений: 121
23.07.2024, 23:51
Цитата Сообщение от Bright4092b Посмотреть сообщение
+ нужно максимально близко но чтобы был один блок коридора.
За это отвечает оффсет. Да и для начало про коридоры можно забить и реализовать задачу расстановки комнат без корридора(оффсета). Когда получится, переписывать с добавлением корридора.(При переписывании все сломается явно).

Цитата Сообщение от Bright4092b Посмотреть сообщение
без кода вообще не понимаю как сделать 2
Что именно?

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

Добавлено через 8 минут
Цитата Сообщение от Gammister Посмотреть сообщение
читайте внимательнее задачу. у него заранее заготовленные схемы и рандом не подходит.
Если комнаты есть и готовы, то отлично.
0
1144 / 309 / 159
Регистрация: 30.07.2022
Сообщений: 1,782
Записей в блоге: 4
24.07.2024, 07:25
Bright4092b, воспользовался алгоритмом разбиения двоичного пространства чтобы сделать коридоры.
вот что у меня получилось


это уже больше похоже на то, что вы искали?
1
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,213
25.07.2024, 09:28
я так и не понял, у тебя задача рандомно генерить с условиями которые ты описал, или будут чертежи как твоя картинка ?
а то я тут мудохаюсь с твоим скриптом, а обратной связи что-то нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2024, 09:28
Помогаю со студенческими работами здесь

Задание про зелье и подземелья
Древнее зло пробудилось! Нашему герою пора собираться в путь и зачистить опасное подземелье, спустившись на самый последний этаж...

Реализовать код процедурной генерации подземелья
Хочу разобраться, как реализовать код генерации. Хочу выполнить его в концоле. Чтобы было как в различных рогаликах.

Как найти самый короткий выход из подземелья?
(взвешенный неориентированный граф) Искатель приключений Клаид как-то раз в своих скитаниях наткнулся на какую-то пещеру. Зайдя в нее,...

Разница между двумерным массивом и массивом указателей на строки
Что-то никак не могу разобраться с разницей двумерных массивов и массивов указателей на строки. Получается что каждый элемент двумерного...

Выбрать все координаты средней линии трапеции заданной массивом массивом координат XYZ в в файл
Добрый вечер господа сочувствующие! Дана трапеция представленная массивом координат из файла XYZ.txt в формате: 2020-09-30...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru