Генерация леса
Эта статья была первоначально написана для Darren Hebden's RLNews
Прежде всего я хотел бы сказать - это красиво и просто, но делает работу и очень легко реализуется.
Прежде всего мы должны принять несколько вещей. Первая карта является массивом, к настоящему времени его размеры 50x50. Второе, что T - используется для дерева и G - используется для земли. Начнем.
procedure TForm1.DrawForest(x,y:integer);
var
n,s,e,w,i,j,k,d: integer;
begin
i := x;
j := y;
// это - насколько большим будет лес
for k := 1 to 20 do begin
// север юг восток запад; диапазон до шести не сделает лес
// слишком большим и даст предсказуемый образец
n := random(6);
e := random(6);
s := random(6);
w := random(6);
// если мы делаем север, тогда...
// если мы не делаем, пропускаем это
if n = 1 then begin
// это должно гарантировать, что когда мы перезапускаемся
// в конечном счете, что мы выйдем из той же позиции
i := i - 1;
map[i,j] := 'T';
end;
if s = 1 then begin // сделайте вышеуказанное на юг
i := i + 1;
map[i,j] := 'T';
end;
if e = 1 then begin // кроме того на восток
j := j + 1;
map[i,j] := 'T';
end;
if w = 1 then begin // и запад
j := j - 1;
map[i,j] := 'T';
end;
end;
end;
Теперь мы можем сделать лес вокруг x, y и для этого нам нужно выбрать позицию произвольно на своей карте. Для этой задачи мы создадим кнопку.
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z,i: integer;
begin
z := random(10); // число участков леса
for i := 1 to z do begin
// произвольно выбираем x,y позицию для леса
x := random(50);
y := random(50);
drawforest(x,y);
end;
end;
Теперь у Вас есть лес на весь мир. Есть многие другие вещи, с которыми Вы можете использовать это; мой личный любимый способ использовать этот алгоритм, чтобы произвольно генерировать пещеры изменением T на G.
Автор: Bryan Strait.
Источник: Creating a forest.
Перевел: Сергей В. Ждановских [Alchemist], 15.05.2005.