Генерация мира
Модераторы: Sanja, Максим Кич
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Было бы наивно предполагать, что можно обойтись одним идеальным генератором. Генератор следует подбирать исходя из идеи уровня (подземелье, пещеры, муравейник, замок), либо комбинировать генераторы.BreakMT писал(а):Ну возможно, но в примере Кича уровни получаются довольно кривыми. Но это все ИМХО конечно. Т.к. лично мне нравится, когда пространства побольше.
Для этого нужно этот муравейник немного разрушить, потом расскажу как я делаю, когда крушу уровень:)
Вот муравейник, например, действительно предполагает, что уровни будут кривыми. Если слово «кривой» употреблено в прямом смысле, конечно.
Дальше его можно разнообразить. Как и любой другой генератор. В идеале генераторы следует комбинировать.
Dump the screen? [y/n]
Наверно позновато пишу, да и не совем в тему, но уж как есть.
Тема у вас вроде началась с генерации мира, а затем продолжилась классическим спором на тему генерацией подземелий, так вот я, в основном, по поводу первого.
Как-то я расматривал проблемы генерации мира с точки зрения высот и понял, что нет ничего лучшего, чем какая-то заковыристая, нетривиальная функция двух переменных, где значение функции является высотой над уровнем миря, а переменные соответственно координатами. Немного поэксперементировал с этим. В принципе результаты меня удовлетворили, но я, как обычно, в исследованиях не доделал до конца. Сейчас глянул - фиг что понял, кроме того что функции были суммой синусов и косинусов от многочленов 5-6-й степени. Если кого-то заинтересует - могу скинуть, что получилось.
По поводу наброса ландшафта. Где-то так делал для другой игры (естественно недоделанной). Накидывал точки на плоскости и придавал им значения (типа лес, кустарник, степь, тундра) где-то 1/100 от общего числа точек, а затем расширял полученные зоны, рэндомом выбирая точку и продливая в произвольном направлении линией данный тип ланшафта, на случайное количество клеток. После чего заполнял по особой (не помню какой) схеме клетки между сторонами угла, состоящего из одного рельефа, когда таковые получались. Ну и потом на это реки как-то накладывал и горы. Эта прога потерялась, когда старый харддиск сломался.
Ну и по поводу подземелий. Когда писал АДОМ, делал просто - накидывал комнаты и попарно соединял проходами (выбор направления, случайная длина - пока не пересекутся, естественно следя за тем чтоб стены других комнат не нарушались, точнее углы, чтобы дверей в углах не получалось). Потом проверка и исправление ошибок и неудачных моментов. В-общем, ровно как в АДОМЕ подземелья старался сделать. Но не совсем так вышло. Это тоже могу выложить, если кому-то интересно.
P.S. АДОМ естественно до конца не доделал, но движок почти готов был - файт, монстры, левела, стрельба, вещи, сейвы, дружественность/агрессивность - кроме магии и монтерс инвентори. Тож могу выложить.
Тема у вас вроде началась с генерации мира, а затем продолжилась классическим спором на тему генерацией подземелий, так вот я, в основном, по поводу первого.
Как-то я расматривал проблемы генерации мира с точки зрения высот и понял, что нет ничего лучшего, чем какая-то заковыристая, нетривиальная функция двух переменных, где значение функции является высотой над уровнем миря, а переменные соответственно координатами. Немного поэксперементировал с этим. В принципе результаты меня удовлетворили, но я, как обычно, в исследованиях не доделал до конца. Сейчас глянул - фиг что понял, кроме того что функции были суммой синусов и косинусов от многочленов 5-6-й степени. Если кого-то заинтересует - могу скинуть, что получилось.
По поводу наброса ландшафта. Где-то так делал для другой игры (естественно недоделанной). Накидывал точки на плоскости и придавал им значения (типа лес, кустарник, степь, тундра) где-то 1/100 от общего числа точек, а затем расширял полученные зоны, рэндомом выбирая точку и продливая в произвольном направлении линией данный тип ланшафта, на случайное количество клеток. После чего заполнял по особой (не помню какой) схеме клетки между сторонами угла, состоящего из одного рельефа, когда таковые получались. Ну и потом на это реки как-то накладывал и горы. Эта прога потерялась, когда старый харддиск сломался.
Ну и по поводу подземелий. Когда писал АДОМ, делал просто - накидывал комнаты и попарно соединял проходами (выбор направления, случайная длина - пока не пересекутся, естественно следя за тем чтоб стены других комнат не нарушались, точнее углы, чтобы дверей в углах не получалось). Потом проверка и исправление ошибок и неудачных моментов. В-общем, ровно как в АДОМЕ подземелья старался сделать. Но не совсем так вышло. Это тоже могу выложить, если кому-то интересно.
P.S. АДОМ естественно до конца не доделал, но движок почти готов был - файт, монстры, левела, стрельба, вещи, сейвы, дружественность/агрессивность - кроме магии и монтерс инвентори. Тож могу выложить.
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
ADB писал(а):
Насчёт конкретики, пожалуйста.
Сел, попытался вспомнить, как же я там делал - не смог, зато пришёл в голову несколько другой способ. Где накидывать не линиями и областями, а точками. Простейший Паскаль, думаю, все знают
program zones;
uses crt;
const x=78; y=23; baza=20; d=4; tip=5;
var l:char;k,i,j,ni,nj,col:byte;bb:boolean;kol:integer;
pole:array[1..x,1..y] of byte;
begin
textbackground(black);
textcolor(white);
randomize;
clrscr;
for i:=1 to x do for j:=1 to y do pole[i,j]:=0;
for kol:=1 to baza do begin
bb:=false;
while bb=false do begin
i:=random(x)+1;
j:=random(y)+1;
col:=random(tip)+1;
if pole[i,j]=0 then begin pole[i,j]:=col;
gotoxy(i+1,j+1);textcolor(col);write('#');bb:=true;end;
end;
end;
while kol<>x*y do begin
bb:=false;
while bb=false do begin
i:=random(x)+1;
j:=random(y)+1;
if pole[i,j]<>0 then bb:=true;
end;
k:=random(d*4)+1;
if k>2*d then ni:=i
else if k>d then ni:=i+k-d
else ni:=i+k-d-1;
if k<=2*d then nj:=j
else if k>3*d then nj:=j+k-d*3
else nj:=j+k-d*3-1;
if ni<1 then ni:=1;if ni>x then ni:=x;
if nj<1 then nj:=1;if nj>y then nj:=y;
if pole[ni,nj]=0 then begin
pole[ni,nj]:=pole[i,j];
gotoxy(ni+1,nj+1);textcolor(pole[i,j]);write('#');kol:=kol+1;end;
end;
l:=readkey;
end.
***Ессно, она не оптимальна по количеству проделанных операций, но это ясно решаемо, просто лень переделывать. Кстати, не проблемно и такого типа карты задавать несколькими байтами.
Конретнее быть не может. Уже с этим можно эксперементировать.
x,y - длина и ширина мира. baza - количество начальных очагов. d - максимально возможное минимальное расстояние точки от других точек такого же рельефа. tip - количество различных рельефов.
Скажем установив d=1, можно отменить все получающиеся "смешанные" зоны, хотя их можно считать и переходными типа лесотундры, болот с кустарником итд. Можно, к примеру, дать дополнительную установку, что вся тундра не южнее 5, а пустыня не севернее мах-5. Можно разные вероятности на разные типы местности поставить. Можно приближённость различных рельефов разную сделать. Да много чего.
Впрочем, для этого следует знать, что требуется получить - карту огромного мира подобного земному, карту большого острова или маленькую зону; какие типы местности нужны, как они друг на друга накладываются, должна ли быть вода итп. Например, речки точно так нельзя накидывать
И стоит реальные карты из атласов поизучать .
В-общем, это тоже общие фразы получились (всё что ниже проги) - но ведь я и не знаю конкретной цели.
P.S. Кстати, карты для 3-ей цивилизации, о которых тут говорили, мне не очень нравятся, однообразные слишком - понятно что всё ради балланса делалось. Вот для 2-ой отлично получалось, эти замечательные горные массивы длиной до 15 клеток...
Нууу, я ж написал, что не помню. А в-целом, я указывал идеи, а способы их реализации могут быть разнообразными. Предложенная идея основывается на определении какого-то количества случайных базовых точек разного рельефа - этаких очагов, которые в последствии расширяются поглощая всю карту. А уж кто каким способом это сделает... Тем более что нужно эксперементировать и настраивать.Это, конечно, все замечательно
Но хотелось бы конкретики, раз на то пошло
Насчёт конкретики, пожалуйста.
Сел, попытался вспомнить, как же я там делал - не смог, зато пришёл в голову несколько другой способ. Где накидывать не линиями и областями, а точками. Простейший Паскаль, думаю, все знают
program zones;
uses crt;
const x=78; y=23; baza=20; d=4; tip=5;
var l:char;k,i,j,ni,nj,col:byte;bb:boolean;kol:integer;
pole:array[1..x,1..y] of byte;
begin
textbackground(black);
textcolor(white);
randomize;
clrscr;
for i:=1 to x do for j:=1 to y do pole[i,j]:=0;
for kol:=1 to baza do begin
bb:=false;
while bb=false do begin
i:=random(x)+1;
j:=random(y)+1;
col:=random(tip)+1;
if pole[i,j]=0 then begin pole[i,j]:=col;
gotoxy(i+1,j+1);textcolor(col);write('#');bb:=true;end;
end;
end;
while kol<>x*y do begin
bb:=false;
while bb=false do begin
i:=random(x)+1;
j:=random(y)+1;
if pole[i,j]<>0 then bb:=true;
end;
k:=random(d*4)+1;
if k>2*d then ni:=i
else if k>d then ni:=i+k-d
else ni:=i+k-d-1;
if k<=2*d then nj:=j
else if k>3*d then nj:=j+k-d*3
else nj:=j+k-d*3-1;
if ni<1 then ni:=1;if ni>x then ni:=x;
if nj<1 then nj:=1;if nj>y then nj:=y;
if pole[ni,nj]=0 then begin
pole[ni,nj]:=pole[i,j];
gotoxy(ni+1,nj+1);textcolor(pole[i,j]);write('#');kol:=kol+1;end;
end;
l:=readkey;
end.
***Ессно, она не оптимальна по количеству проделанных операций, но это ясно решаемо, просто лень переделывать. Кстати, не проблемно и такого типа карты задавать несколькими байтами.
Конретнее быть не может. Уже с этим можно эксперементировать.
x,y - длина и ширина мира. baza - количество начальных очагов. d - максимально возможное минимальное расстояние точки от других точек такого же рельефа. tip - количество различных рельефов.
Скажем установив d=1, можно отменить все получающиеся "смешанные" зоны, хотя их можно считать и переходными типа лесотундры, болот с кустарником итд. Можно, к примеру, дать дополнительную установку, что вся тундра не южнее 5, а пустыня не севернее мах-5. Можно разные вероятности на разные типы местности поставить. Можно приближённость различных рельефов разную сделать. Да много чего.
Впрочем, для этого следует знать, что требуется получить - карту огромного мира подобного земному, карту большого острова или маленькую зону; какие типы местности нужны, как они друг на друга накладываются, должна ли быть вода итп. Например, речки точно так нельзя накидывать
И стоит реальные карты из атласов поизучать .
В-общем, это тоже общие фразы получились (всё что ниже проги) - но ведь я и не знаю конкретной цели.
P.S. Кстати, карты для 3-ей цивилизации, о которых тут говорили, мне не очень нравятся, однообразные слишком - понятно что всё ради балланса делалось. Вот для 2-ой отлично получалось, эти замечательные горные массивы длиной до 15 клеток...
Последний раз редактировалось Troll 09 июл 2007, 15:23, всего редактировалось 1 раз.
BreakMT писал(а):
Хотя рабочее название было My_adom.exe
Офф-топ.
Ясно, что потом бы изменил, я в принципе только движок писал, были, конеш, прикидки как там сюжет будет, но цельной картины не было. Отдалённо DungeonCrawl должен был напоминать, но это я теперь знаю...
Пару слов. Что точно там бы было - это отсутствие левелов, только качание скиллов, причём прикладное. Ну и с богами мутка посеръёзнее чем в Crawl'е планировалась.
Шутку понял, жалею что так не планировал.Ты свой рогалик адомом назвал чтоли?
Хотя рабочее название было My_adom.exe
Офф-топ.
Ясно, что потом бы изменил, я в принципе только движок писал, были, конеш, прикидки как там сюжет будет, но цельной картины не было. Отдалённо DungeonCrawl должен был напоминать, но это я теперь знаю...
Пару слов. Что точно там бы было - это отсутствие левелов, только качание скиллов, причём прикладное. Ну и с богами мутка посеръёзнее чем в Crawl'е планировалась.
Точно, очередной.Sanja писал(а):Скорее "Ачеридной".Максим Кич писал(а):Аншынт
А что в этом плохого? Следтельно Бискап дейтвительно создал культовую игру.
А надо ли???Sanja писал(а): Troll
Выкладывай, раз грозился
Хорошо.
Необходимые пояснения:
1. Пойдёт ли прога где ещё кроме моей машины - фиг его знает. Под ДОС точно должна функционировать.
2. Сразу прошу на мой инглиш мне не указывать - сам знаю.
Знаю, что курсор прыгает - видно не везде поотменял его. Под ДОС (full screen) всё зашибись кстати.
3. Команды.
Передвижение на нумлоке. Удары также. i - инвентарь и далее по подсказкам. t - стрельба, перевести курсор и указать куда. o,c - открыть/закрыть. k - выбить. s - сеарч. d и запятая - бросить/поднять. >,< - понятно что. Ctr+e и Shift+q - выход. Ещё команда есть Ctr+h - типа поменять действующую руку и сколькими руками сражаться - на случай если в вопросах при смене оружия/щита/лука чего то не того ответил.
4. Примечания.
Двери можно бить оружием - шанс что сломается (попортится, погнётся, треснет итд), и "k"ick'ать - никаких последствий пока не написал. При стрельбе из лука он ломается с очень высокой вероятностью. Фиг сейчас найду, где это исправить. Заметил глюк с shooting/throwing - не те надписи, что следует. Но ерунда это. Можно поигратся с файтами монстов между собой.
5. Короче, адом-адомом на данном этапе. Дальше - лучше должно было быть. Может как-то всю идею распишу. В двух словах - реализьму побольше хотелось.
*** Второй вложенный файл - это генератор лабиринтов.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 35 гостей