Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генерация лабиринтов


Страницы:   1 2

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]

Слушай... прикольно... Можешь добавить возможность распечатки я люблю проходить лабиранты.
Я думаю сможет ли кто теперь этот кусок к порталу прикрутить ??? Можно карты теперь на писать а такими вот герерирующимися уровнями себя баловать....


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо