Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
#1

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

05.04.2014, 13:42. Просмотров 1114. Ответов 19
Метки нет (Все метки)

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

Генерация - C++
#include &quot;iostream&quot; #include &quot;ctime&quot; #include &quot;cstdlib&quot; using namespace std; int main(){ srand(time(NULL)); setlocale(LC_ALL,...

генерация строк - C++
подскажите плиз как сгенерировать строки????????? void karta(){ char...

Генерация массива - C++
Помогите, пожалуйста. :cry: Например, есть число 01х01у0. Возьмем для пример такое - 01110110 Вопрос: можно ли задать в программе...

Генерация чисел - C++
Вообщем мне нужно сгенерировать отрицательное вещественное число с 2 цифрами целой и 2 цифрами дробной части. Отрицательное ведь так...

Генерация массива - C++
Что то не создает массив. // lab1.cpp: определяет точку входа для консольного приложения.и еще вопрос правильно ли я прописал чтобы...

генерация чисел - C++
Скажите, пожалуйста, как сгенерировать случайным образом отрицательные числа?

19
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 13:44 #2
Связанным списком, а названия переменных уматовое
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
05.04.2014, 13:48  [ТС] #3
rcyn, и всё же попросил бы поподробнее. Я не могу понять как мне связывать комнаты. Они ведь расположены не по порядку. В теории мне нужно сделать путь из каждой комнаты в каждую.
А что переменные? В этой структуре даже по таким названиям всё предельно ясно
0
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;
};
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
05.04.2014, 14:07  [ТС] #5
rcyn, i,j - координаты верхнего левого угла, w,h - ширина и высота соответственно.
Дык в этом и вопрос как связать их друг с другом. Как раз таки это я и не знаю.
1
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:18 #6
Arkaniy, "Связать" в каком смысле? Что нужно сделать? Чтобы ты мог в коде опеределить из какой комнаты в какую ты можешь "попасть", или чтобы графически они были соеденены (или и то и другое?) ?
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
05.04.2014, 14:38  [ТС] #7
rcyn, а ты сам писал "связать" в каком смысле?
Вот я беру первую комнату из вектора, как мне найти соседние комнаты? Мне проверять координаты всех остальных в поиске минимального расстояния?
Графически соединить не проблема.
0
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;
}
0
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:50 #9
Arkaniy,

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

связать в смысле что каждый объект комнаты знает комнаты в которые можно перейти из него
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
05.04.2014, 14:54  [ТС] #10
rcyn, умею конечно же. Но вот вопрос: я ведь не знаю какая комната соседняя. Если бы я знал это, то всей проблемы и не было б. Комнаты кидаются рандомно.
0
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
05.04.2014, 14:59 #11
Нарисуй как это должно выглядеть на картинке из ОП-поста.
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
05.04.2014, 22:10  [ТС] #12
Вобщем сейчас комнаты соединяет, но это всё сделано через через "одно" место. Я пытался не использовать поиск пути, но, видимо, не получится. Вопрос остается открытым.
Попробую объяснить подробнее.
Имеется двумерный массив MxN , в котором возможны, пока, 3 значения: 2 - стена, 1 - пространство в комнате и 0 - это всё "вне" комнат. Также есть вектор в котором записаны координаты каждой комнаты. По сути, мне нужно проложить путь через все единицы в массиве. Мне кажется, что координаты комнат тут толком и не нужны-то. Поправьте, если не прав. Я думаю, что можно взять случайную "единицу" в массиве и от нее прокладывать путь через все остальные, а когда дойду до "упора", то есть во все стороны упрусь в стены, тогда наступает ступор....
Подскажите как быть.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,215
05.04.2014, 22:19 #13
Цитата Сообщение от Arkaniy Посмотреть сообщение
3 значения: 2 - стена, 1 - пространство в комнате и 0 - это всё "вне" комнат.
мне кажется можно попробовать так
возьми стена 10000 вне комнат тоже какое то число(если можно ходить маленькое если нет то большое) и пространство в комнате 1
потом применить алгоритм поиска "волной" только добавлять не 1 а "вес" ячейки
если тебе нужно найти путь
но я честно говоря не очень понял что ты хочешь
путь из комнаты в комнату? внутри комнаты?
по рисунку не понятно между всеми комнатами стена, как перейти из одной в другую?
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
05.04.2014, 22:22  [ТС] #14
ValeryS, вот в том то дело, что нужно перейти из одной в другую
Нужно проложить этот путь, то есть добавить коридоры между комнатами. Путь внутри комнаты найти могу.
Я уже второй день бьюсь над этим
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,215
05.04.2014, 22:23 #15
Цитата Сообщение от Arkaniy Посмотреть сообщение
что нужно перейти из одной в другую
так там двери какие то должны быть? коридоры между комнатами?
иначе как пройти? стены ломать?
0
05.04.2014, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 22:23
Привет! Вот еще темы с ответами:

Генерация ребуса. - C++
Ув. программисты, помогите составить алгоритм генерации ребуса следующего вида и проверки однозначности его решения (хотя бы вручную):

Генерация программы - C++
Есть рабочая программа.Требуется в помощь в компиляции её в Visual Studio 2005 Происходит выход из программы без просмотра...

Генерация лабиринта - C++
Разработать приложение, генерирующее лабиринт размером m x n клеток. Дополнительные условия: а) Вход и выход – произвольные клетки...

Генерация чисел - C++
Доброго времени суток, не могли бы вы подсказать как выбрать рандомно число из двух чисел 2 и 4 и в диапозоне от 1 до 4 благодарю


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru