Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

Генерация 2d карт   Найти похожие ветки 

 
D-Man   (2004-12-15 17:42) [0]

Подскажите кто знает, как случайно разделить имеющийся кусок квадратного 2д пространства на несколько кривых территорий заданного размера. Чтобы  в результате получилось нечто вроде географической карты. Такое есть например в игре Генерал (http://newgame.agava.ru). И вообще подскажите где можно найти материалы по поводу генераторов карт для игр.


 
D-Man   (2004-12-15 20:32) [1]

Чуваки, подскажите хотябы как нарисовать один остров случайной формы, но заданного размера!


 
A22   (2004-12-15 20:57) [2]

построй вписанный в квадрат N-угольник правильный и добавь некоторый рандом в позицию каждой вершины. Ну, может, алгоритм не остановится на простом рандоме, но попробуй оттталкиваться от этого


 
D-Man   (2004-12-15 21:39) [3]

Хорошо бы сделать чтобы его площадь была точно рассчитанной, а так она может получиться с некоторым разбросом


 
тт   (2004-12-16 16:12) [4]

Есть ли на эту тему статьи?


 
Mihey_temporary ©   (2004-12-16 17:23) [5]


> Хорошо бы сделать чтобы его площадь была точно рассчитанной,
> а так она может получиться с некоторым разбросом


Построй правильный (или не правильный) N-угольник нужной тебе площади. Подойдёт и квадрат. Затем выбирай случайно какую-нибудь секущую прямую, для простоты параллельную одной из осей, и сдвигай вдоль неё половинки. И так много раз.


 
TButton ©   (2004-12-16 18:32) [6]

берешь байтовую матрицу NxN
заполняешь нулями
чтобы получить случайную фигуру площади M (M<N*N)
в случайной точке ставишь единицу
далее
for i:=1 to m-1 do
составляешь список ячеек граничащих с теми в которых единица
содержащих ноль
выбираешь из списка случайную и присваиваешь ей единицу

а могу и исходник подкинуть
прога генерировала архипелаг
счас найду


 
TButton ©   (2004-12-16 18:39) [7]

ага нашел
procedure TForm1.SpeedButton1Click(Sender: TObject);
 // собсно выбор случайной точки
 function RandomPoint:TPoint;
 var
   pl, rl: array of TPoint;
   i, j, k: integer;
   s: boolean;
 begin
   // preparing list of all water sectors
   SetLength(pl, 0);
   for i:=0 to 24 do
     for j:=0 to 24 do
     begin
       if map[i, j]=0 then
       begin
         SetLength(pl, high(pl)+2);
         pl[high(pl)].x:=i;
         pl[high(pl)].y:=j;
       end;
     end;
   // nothing - leaving
   if high(pl)=-1 then exit;
   // skaning list
   SetLength(rl, 0);
   for k:=0 to high(pl) do
   begin
     s:=false;
     for i:=pl[k].x-1 to pl[k].x+1 do
       for j:=pl[k].y-1 to pl[k].y+1 do
         if (not(((i<0)or(i>24))or((j<0)or(j>24))))and((i=pl[k].x)or(j=pl[k].y))and(map[i, j]=1)
           then s:=true;
     if s then
     begin
       SetLength(rl, high(rl)+2);
       rl[high(rl)]:=pl[k];
     end;
   end;
   k:=round(random*high(rl));
   result:=rl[k];
 end;
 // функция определяет суммарное количество "водных" клеток
 // на карте
 function WaterCount: integer;
 var
   i, j: integer;
 begin
   result:=0;
   for i:=0 to 24 do
     for j:=0 to 24 do
       if map[i, j]=0 then
         result:=result+1;
   result:=round(result/625*100);
 end;
var
 wc, i, j, n: integer;
 p: TPoint;
begin
 // очистка
 for i:=0 to 24 do
   for j:=0 to 24 do
     map[i, j]:=0;
 // случайное количество исходных точек
 n:=5+random(5);
 for i:=0 to n do
   map[random(25), random(25)]:=1;
 // количество воды 0-100
 wc:=TrackBar1.Position;
 while WaterCount>wc do
 begin
   p:=RandomPoint;
   map[p.x, p.y]:=1;
 end;
 table.Repaint;  
end;


 
D-Man   (2004-12-16 19:24) [8]


> Построй правильный (или не правильный) N-угольник нужной
> тебе площади. Подойдёт и квадрат. Затем выбирай случайно
> какую-нибудь секущую прямую, для простоты параллельную одной
> из осей, и сдвигай вдоль неё половинки. И так много раз.


Спасибо, вроде уловил.

TButton ©   (16.12.04 18:39) [7]
офигенно! щас проверю!

Я вообще вот к чему спрашивал. Не так давно, вдохновившись безумной идеей начал делать 2d игрушку. Жанр Action с элементами RPG. Геймплей мне видится очень похожим на Дьябло. Основная мысль в том, чтобы сделать ее по настоящему случайной, случайный мир, случайные квесты и события, а не иллюзия случайности, как во многих играх. Так вот я застрял на случайном разбиении тайловой карты на зоны (трава, грязь, вода, ...), чтобы в итоге получилась более или менее натуральная местность, наверняка кто-то видел или знает подходящий алгоритм на эту тему.
Кстати специально для этой игрухи я разобрался в том каким образом во 2м War Craft"е рисуется карта, т.е. сочетания травы с землей, деревьев с травой итд и реализовал это в коде. Кому
интересно могу просветить только не побрезгайте сабжем пожалуйста.


 
D-Man   (2004-12-16 20:43) [9]

TButton ©   (16.12.04 18:39) [7]

Блин никак не скомпилирую, можешь мне эту прогу целиком на мыло кинуть?


 
rts111 ©   (2004-12-16 20:52) [10]

Вот нашел.
Копирую модуль целиком.
Если немного переделать получится генератор.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 pic1:tbitmap;
 a:array of pwordarray;

 s:integer=400;
 p1:integer=300000;
 p2:integer=27;
 st:integer=1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var n,i,j,x,y:integer;
begin

for n:=1 to p2 do
a[st+random(s-2*st),st+random(s-2*st)]:=random($ffffff);

for n:=1 to p1 do
begin
 x:=st+random(s-2*st);
 y:=st+random(s-2*st);
 if a[y,x]>83
 then begin
      for j:=y-st to y+st do
      for i:=x-st to x+st do
      if a[j,i]=0 then a[j,i]:=a[y,x]+1;
      end;
end;

canvas.Draw(0,0,pic1);
end;

procedure TForm1.FormCreate(Sender: TObject);
var j,i:integer;
begin
pic1:=tbitmap.Create;
pic1.Width:=s;
pic1.Height:=s;
pic1.PixelFormat:=pf15bit;
setlength(a,s);
for j:=0 to s-1 do a[j]:=pic1.ScanLine[j];
for j:=0 to s-1 do
for i:=0 to s-1 do
a[j,i]:=0;
pic1.Canvas.Brush.Color:=$300000;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
pic1.Free;
end;

end.


 
D-Man   (2004-12-16 21:31) [11]

TButton

Разобрался с принципом. Вроде похоже. А еще если размер общей территории сделать побольше, а генерируемую землю ~10%, то получается похоже на реку, только с очень большими территориями (где-то 400х400) уже не очень хорошо.

rts111 ©   (16.12.04 20:52) [10]

аксес виолейшн на строке
a[st+random(s-2*st),st+random(s-2*st)]:=random($ffffff);
расскажи саму идею


 
rts111 ©   (2004-12-16 22:10) [12]

В инспекторе может быть забыл
form1 oncreate назначить процедуру procedure FormCreate(Sender: TObject);


 
D-Man   (2004-12-16 22:25) [13]


> В инспекторе может быть забыл
> form1 oncreate назначить процедуру procedure FormCreate(Sender:
> TObject);

Точно! Спасибо, интересная штука...


 
wiz ©   (2004-12-16 22:40) [14]

не совсем то, что ты просил, но...

Однажды развлекался идеей построения случайной географической карты местности (леса/поля/степи итп...)

в результате одной из проб получился следующий алгоритм:
http://gnar.fatal.ru/land_create.zip

в .pas даны краткие комментарии что происходит
в самой программе выставляем чекбоксы и давим поочерёдно на кнопки (Place, Progress, Smooth...)

штука далека от идеала, но может быть натолкнёт тебя на какие-нибудь интересные мысли?


 
wiz ©   (2004-12-16 22:42) [15]

PS: (совсем забыл) размер zip"а - 8 Kb


 
D-Man   (2004-12-17 00:22) [16]

2 wiz
Я как раз состряпал почти тоже самое, но все равно спасибо


 
wiz ©   (2004-12-17 11:07) [17]

2 D-Man: не за что :)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.059 c
1-1109491464
BVV
2005-02-27 11:04
2005.03.13
Принудительное завершение работы потоков


14-1109060470
Чеширский_Кот
2005-02-22 11:21
2005.03.13
Разбирающимся в ноутбуках


14-1108710940
Алексей#13
2005-02-18 10:15
2005.03.13
Имеем ли мы право?


1-1109359283
Willy
2005-02-25 22:21
2005.03.13
Панели


1-1109689050
Bad
2005-03-01 17:57
2005.03.13
Fine Reader?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский