Форум программистов, компьютерный форум CyberForum.ru

Процедурная генерация - C++

Восстановить пароль Регистрация
 
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 13:42     Процедурная генерация #1
Доброго времени суток, форумчане.
Как сделать переходы между комнатами? Читал о применении алгоритмов поиска пути, в частности А*. Принцип его работы знаю хорошо и найти выход из лабиринта смогу, но как мне быть если нет переходов между комнатами? Прикладываю то, что уже есть. Комнаты хранятся таким образом.
C++
1
2
3
4
5
struct Room
{
    int i, j, h, w;     
};
std::vector<Room>rooms;
Миниатюры
Процедурная генерация  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 13:42     Процедурная генерация
Посмотрите здесь:

Генерация звука C++
Генерация ребуса. C++
C++ генерация строк
C++ Генерация лабиринта
C++ Генерация комбинаций из n по m
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 13:44     Процедурная генерация #2
Связанным списком, а названия переменных уматовое
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 13:48  [ТС]     Процедурная генерация #3
rcyn, и всё же попросил бы поподробнее. Я не могу понять как мне связывать комнаты. Они ведь расположены не по порядку. В теории мне нужно сделать путь из каждой комнаты в каждую.
А что переменные? В этой структуре даже по таким названиям всё предельно ясно
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 13:59     Процедурная генерация #4
Лично мне не ясно. Если кому-то кроме ТС - ясно просветите как вы догадались

Сгенерировать комнаты, связать их друг с другом ), потом рандомизировать их номера.

C++
1
2
3
4
5
6
7
8
struct Room
{
   Room * NorthExit;
   Room * WestExit;
   Room * SouthExit;
   Room * EastExit;
   int m_Number;
};
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 14:07  [ТС]     Процедурная генерация #5
rcyn, i,j - координаты верхнего левого угла, w,h - ширина и высота соответственно.
Дык в этом и вопрос как связать их друг с другом. Как раз таки это я и не знаю.
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:18     Процедурная генерация #6
Arkaniy, "Связать" в каком смысле? Что нужно сделать? Чтобы ты мог в коде опеределить из какой комнаты в какую ты можешь "попасть", или чтобы графически они были соеденены (или и то и другое?) ?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 14:38  [ТС]     Процедурная генерация #7
rcyn, а ты сам писал "связать" в каком смысле?
Вот я беру первую комнату из вектора, как мне найти соседние комнаты? Мне проверять координаты всех остальных в поиске минимального расстояния?
Графически соединить не проблема.
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:38     Процедурная генерация #8
Можно просто хранить номера соседних комнат, но с указателями удобней.
Процедурная генерация
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
struct Room
{
   Room(int number,  Room * north = 0, Room * west = 0, Room * south = 0, Room * east = 0)
      : m_Number(number)
      , m_NorthExit(north)
      , m_WestExit(west)
      , m_SouthExit(south)
      , m_EastExit(east)
   {}
 
   Room * m_NorthExit;
   Room * m_WestExit;
   Room * m_SouthExit;
   Room * m_EastExit;
   int m_Number;
};
 
 
int main()
{
   Room room_001(1);
   Room room_002(2);
   Room room_003(3);
   Room room_004(4);
   Room room_005(5);
   Room room_006(6);
   Room room_007(7);
   Room room_008(8);
   Room room_009(9);
 
   room_001.m_SouthExit = &room_004;
   room_002.m_EastExit = &room_003; 
   room_002.m_SouthExit = &room_003;
   // . . .
   room_009.m_WestExit = &room_008;
}
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:50     Процедурная генерация #9
Arkaniy,

смотри пост выше
ты указателями пользоваться умеешь?

связать в смысле что каждый объект комнаты знает комнаты в которые можно перейти из него
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 14:54  [ТС]     Процедурная генерация #10
rcyn, умею конечно же. Но вот вопрос: я ведь не знаю какая комната соседняя. Если бы я знал это, то всей проблемы и не было б. Комнаты кидаются рандомно.
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:59     Процедурная генерация #11
Нарисуй как это должно выглядеть на картинке из ОП-поста.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 22:10  [ТС]     Процедурная генерация #12
Вобщем сейчас комнаты соединяет, но это всё сделано через через "одно" место. Я пытался не использовать поиск пути, но, видимо, не получится. Вопрос остается открытым.
Попробую объяснить подробнее.
Имеется двумерный массив MxN , в котором возможны, пока, 3 значения: 2 - стена, 1 - пространство в комнате и 0 - это всё "вне" комнат. Также есть вектор в котором записаны координаты каждой комнаты. По сути, мне нужно проложить путь через все единицы в массиве. Мне кажется, что координаты комнат тут толком и не нужны-то. Поправьте, если не прав. Я думаю, что можно взять случайную "единицу" в массиве и от нее прокладывать путь через все остальные, а когда дойду до "упора", то есть во все стороны упрусь в стены, тогда наступает ступор....
Подскажите как быть.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.04.2014, 22:19     Процедурная генерация #13
Цитата Сообщение от Arkaniy Посмотреть сообщение
3 значения: 2 - стена, 1 - пространство в комнате и 0 - это всё "вне" комнат.
мне кажется можно попробовать так
возьми стена 10000 вне комнат тоже какое то число(если можно ходить маленькое если нет то большое) и пространство в комнате 1
потом применить алгоритм поиска "волной" только добавлять не 1 а "вес" ячейки
если тебе нужно найти путь
но я честно говоря не очень понял что ты хочешь
путь из комнаты в комнату? внутри комнаты?
по рисунку не понятно между всеми комнатами стена, как перейти из одной в другую?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 22:22  [ТС]     Процедурная генерация #14
ValeryS, вот в том то дело, что нужно перейти из одной в другую
Нужно проложить этот путь, то есть добавить коридоры между комнатами. Путь внутри комнаты найти могу.
Я уже второй день бьюсь над этим
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.04.2014, 22:23     Процедурная генерация #15
Цитата Сообщение от Arkaniy Посмотреть сообщение
что нужно перейти из одной в другую
так там двери какие то должны быть? коридоры между комнатами?
иначе как пройти? стены ломать?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 22:24  [ТС]     Процедурная генерация #16
ValeryS, именно, ломать стены
Вот этом и проблема. По какому принципу их ломать...

Приложил, как должно получиться.
Миниатюры
Процедурная генерация   Процедурная генерация  
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.04.2014, 22:25     Процедурная генерация #17
Цитата Сообщение от Arkaniy Посмотреть сообщение
именно, ломать стены
и я так понял чем меньше ломаешь тем лучше?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
05.04.2014, 22:28  [ТС]     Процедурная генерация #18
ValeryS, думаю, что это не имеет значения.. я выше прикрепил как должно быть.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.04.2014, 22:37     Процедурная генерация #19
Цитата Сообщение от Arkaniy Посмотреть сообщение
думаю, что это не имеет значения..
ну тогда поиск кратчайшего расстояния, можно "волной"
заводи вспомогательный массив и в нем ищи путь, а потом накладывай на рабочий

Добавлено через 1 минуту
Цитата Сообщение от Arkaniy Посмотреть сообщение
я выше прикрепил как должно быть.
не заметил
т.е тебе не поиск пути нужен а слить между собой комнаты?
так скажем "прорубить двери"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 00:34     Процедурная генерация
Еще ссылки по теме:

C++ Генерация чисел
C++ Генерация массива
Генерация C++

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

Или воспользуйтесь поиском по форуму:
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
06.04.2014, 00:34  [ТС]     Процедурная генерация #20
ValeryS, да, прорубать двери и коридоры, чтобы можно было перемещаться между ними.
Сейчас начал делать через поиск пути. Создал еще 1 массив и в нем ищу алгоритмом А*. Потом наложу на основной.
Yandex
Объявления
06.04.2014, 00:34     Процедурная генерация
Ответ Создать тему
Опции темы

Текущее время: 09:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru