![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Генерация лабиринтов
Soroka © (2004-10-27 15:41:00)Привет _профессора _игр !
Решила _вот_ спросить, _можно_ ли_ написать_ на_ ГЛ_сцене_ гнератор_ лабиринтов, _очень_ надо._Если _да, _тто_подскажите_где_взять_пример_того_что_нужно_для_этого_знать.
Заранее_всем_спасибочки.
Colt1978 (2004-12-04 17:04:00) [1]
> rts111 © (04.12.04 04:40) [34]
Даваольно таки интересно у тебя получилось...
Слыш а прикинь как тут кто-то писал в 3D это засунуть.... Туман... Гдето проглядывается конец лабиринта... и 3D лабиринт... Над ним летает камера, идёт игрок...
Помоему круто бы вышло...
rts111 (2004-12-04 04:40:00) [2]Вчера было время, решил поправить код приведенный выше,
вынести в отдельные функции генерацию и поиск пути, засиделся,
получилась такая программа, пока сырая:
http://rts111.narod.ru/labcode.rar- 4Kb.- код
http://rts111.narod.ru/labexe.rar- 180Kb.- exe
http://rts111.narod.ru/d3.html- описание(2 строчки) :)
Mike_Vazowskyi
>...а как можно его подправить чтоб было несколько выходов???
lab[x,y]:=0; x,y-координаты еще одного выхода.
>..но проходился он, в тоже время, по самому оптимальному???
Можно таким способом:сначала находится ближайший выход,
затем путь от текущей позиции до этого выхода.
Посмотри программу, там все это реализовано.
Mike_Vazowskyi (2004-11-29 00:05:00) [3]лабиринт интересный, а как можно его подправить чтоб было несколько выходов??? но проходился он, в тоже время, по самому оптимальному???
Colt1978 (2004-11-11 13:51:00) [4]Soroka, пиши сама.... Похоже тут никто не может, я сам както хотел разобраться с порталом, но потом остыл. Для своего проекта я не собираюсь использовать лабиринты, как хотел раньше. Что мне было необходимо нарисовал в Максе
Soroka (2004-11-07 10:59:00) [5]Так _намного_ лучше...
Всёже_может _кто_подскажет_как_хотябы_написать_лабиринт_не_на_портале_в_ПДЫсуту_а_на_чистом_Open_GL_?
rts111 (2004-11-03 12:10:00) [6]Попробуй следующие значения:
s:=3; // размер блока
w:=239; // ширина
h:=139; // высота
p:=0.2;
if not odd(tx+ty)then if random < 0.02 then break; {*}
//... if random<0.02 <- чем больше это число, тем короче стены (0.02<<1)
//если тебе не понятно можешь строчку {*} совсем удалить.
Soroka (2004-11-02 22:46:00) [7]Помоему ты что-то напутал...
rts111 (2004-11-02 22:38:00) [8](if not odd(tx+ty)then if random<0.3 then break; - эта строчка
влияет на длину стен попробуй например if random<0.01)
------------
от p - зависит количество стен.
rts111 (2004-11-02 22:15:00) [9]s:=3; // размер блока
w:=139; // ширина
h:=99; // высота
p:=0.3 (+ -) 0.2;
(if not odd(tx+ty)then if random<0.3 then break;-если нужны коматы
эту сточку не вставляй)
Как результат?
Soroka (2004-11-02 21:14:00) [10]rts111
Незнаю. попробовала с такими вот величинами:
s:=3; // размер блока
w:=239; // ширина
h:=201; // высота
p:=300;
звёздочку добавила...
В результате почему то путь в 9 случаях из 10 практически прямой, т.е. идёт через центр с маленькими заворотами. Глянь на размер карты лабиринта - раньше лучше вродебы было.
Colt1978- ты замутила лабирин уже на портале ? Интересно было бы глянуть...
Нет, у меня ничего не выходит, уже устала сидеть за компом.
rts111 (2004-11-02 17:47:00) [11]Soroka
Менять нужно чтобы стены примыкали и к нижней и к правой стене,
получаются более запутанные лабиринты.
Попробуй p:=0.1;или еще меньше - сгенерируются комнаты.
-----------------------
Если вставить в цикл генератора while строчку {*} и увеличить p,
получаются более запутанные лабиринты,
if ...
if ...
begin
if not odd(tx+ty)then if random<0.3 then break;{*}
lab[ty+ysm,tx+xsm]:=1;
...
Colt1978 (2004-11-02 16:36:00) [12]Поприколу будет если создавать сразу 2-е бээмпехи и закидывать лабиринт а в другую прохождение его.... Можно потом во всякие журналы слать головоломки... :-)
Sorokaты замутила лабирин уже на портале ? Интересно было бы глянуть...
Soroka (2004-11-02 16:27:00) [13]Сорри_а_зачем_их_менять_? _Я_визуального_изменения_не_нашла_.
Можно_ещё_спросить_а _что_это_за_плотность_(переменная)_для_чего_она_я_так_и_не_поняла_?
rts111 (2004-11-02 14:07:00) [14]Если вы используете приведенный выше код, замените
...
tx:=random(w div 2)*2;
ty:=random(h div 2)*2;
...
на
...
tx:=random((w+1)div 2)*2;
ty:=random((h+1)div 2)*2;
...
Colt1978 (2004-11-01 20:47:00) [15]Красивые лабиринты получаются... Прикольно
П7 (2004-11-01 17:07:00) [16]Лабиринты могжно представить 2 видов:
1. С комнатами
2. Без оных
В первом случае рисуются рендомные комнаты, затем соединяются
Во втором просто передором из рендомных точек прокладываем трассы до их пересечения... (: + Всякие условия, для большей красоты...
Colt1978 (2004-11-01 16:21:00) [17]Что-то глядя на код не понял ... перебором чтоли идёт ?
rts111 (2004-10-31 17:16:00) [18]procedure TForm1.Button1Click(Sender: TObject);
var
lab:array of array of word;
s,w,h:word;
p:real;
j,i:integer;
xsm,ysm:integer;
tn,tx,ty:integer;
ShowWay,NeedCheck:boolean;
enterX,enterY,exitX,exitY:word;
begin
s:=3; // размер блока
w:=139; // ширина
h:=99; // высота
p:=3; // плотность, если много меньше 1 получаются комнаты
ShowWay:=true;
setlength(lab,h,w);
for j:=0 to h-1 do
for i:=0 to w-1 do
if(i=0)or(j=0)or(i=w-1)or(j=h-1)
then lab[j,i]:=1
else lab[j,i]:=0;
enterX:=0;enterY:=(h div 2)or 1;lab[enterY,enterX]:=0; // вход
exitX:=w-1;exitY:=(h div 2)or 1;lab[exitY,exitX]:=0; // выход
Randomize;
for tn:=1 to round(w*h*p) do /////// Генерация ///////////////
begin
tx:=random(w div 2)*2;
ty:=random(h div 2)*2;
if lab[ty,tx]>0
then begin
case random(4)of
0 :begin xsm:= 1;ysm:= 0;end;
1 :begin xsm:=-1;ysm:= 0;end;
2 :begin xsm:= 0;ysm:= 1;end;
else begin xsm:= 0;ysm:=-1;end;
end;
NeedCheck:=true;
while NeedCheck
do begin
NeedCheck:=false;
if(tx+xsm>0)and(tx+xsm<w-1)and(ty+ysm>0)and(ty+ysm<h-1)then
if lab[ty+2*ysm,tx+2*xsm]=0 then
begin
lab[ty+ysm,tx+xsm]:=1;
ty:=ty+ysm;
tx:=tx+xsm;
NeedCheck:=true;
end
end;
end;
end;/////////////////////////////////////////////////////
Refresh;
canvas.Brush.Color:=0;
canvas.Pen.Color:=0;
for j:=0 to h-1 do for i:=0 to w-1 do if lab[j,i]=1 then
Canvas.Rectangle(i*s+10,j*s+10,i*s+s+10,j*s+s+10);
if ShowWay then
begin /////////////////////////////////////////////////////////////
lab[enterY,enterX]:=3;
while lab[exitY,exitX]=0
do begin
for j:=0 to h-1 do
for i:=0 to w-1 do
if lab[j,i]>1
then begin
if i<w-1 then if lab[j,i+1]=0 then lab[j,i+1]:=lab[j,i]+1;
if i>0 then if lab[j,i-1]=0 then lab[j,i-1]:=lab[j,i]+1;
if j<h-1 then if lab[j+1,i]=0 then lab[j+1,i]:=lab[j,i]+1;
if j>0 then if lab[j-1,i]=0 then lab[j-1,i]:=lab[j,i]+1;
end
end;
tx:=exitX;
ty:=exitY;
tn:=lab[ty,tx];
lab[ty,tx]:=2;
while lab[enterY,enterX]=3
do begin
if tx>0 then if lab[ty,tx-1]=tn-1 then tx:=tx-1;
if tx<w-1 then if lab[ty,tx+1]=tn-1 then tx:=tx+1;
if ty>0 then if lab[ty-1,tx]=tn-1 then ty:=ty-1;
if ty<h-1 then if lab[ty+1,tx]=tn-1 then ty:=ty+1;
tn:=lab[ty,tx];
lab[ty,tx]:=2;
end;
canvas.Brush.Color:=$00ff00;
canvas.Pen.Color:=$00ff00;
for j:=0 to h-1 do for i:=0 to w-1 do
case lab[j,i] of
2:Canvas.Rectangle(i*s+10,j*s+10,i*s+s+10,j*s+s+10);
1:;
else lab[j,i]:=0;
end;//case
end;///////////////////////////////////////////////////////////////
end;
Soroka (2004-10-31 14:34:00) [19]Код _проверила - отличный.
Все _лабиринты_проходимые,_т.е._нет _тупиковых,_здорово._Пытаюсь _пока_прикрутить_всё_этоэто_к_порталу._Правда_пока_нет_успехов_на_данном_поприще.
Заодно_решила_спросить_а _возможно_ли_построение_пути_прохождения_этогото_лабиринта_?
Colt1978 (2004-10-30 17:53:00) [20]Слушай... прикольно... Можешь добавить возможность распечатки я люблю проходить лабиранты.
Я думаю сможет ли кто теперь этот кусок к порталу прикрутить ??? Можно карты теперь на писать а такими вот герерирующимися уровнями себя баловать....