Прежде всего, существует множество способов выполнения процедурного генерирования, и ни один из них не является легким вообще, я сделаю такой подход к тому, как вы могли бы заставить его работать, зависит от того, возьмете ли вы его, измените или откажетесь от него.
Будет псевдокод в JS, так как это легче понять.
1º Определите точку входа, так как вы хотите построить средневековый город, мы начнем с квадрата, поэтому предположим, что в вашем городе будет 300 квадратных квадратов, а квадрат будет посередине (обозначен знаком X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º теперь у нас будут проспекты, их будет случайное количество, они будут прямыми и начнутся со средней площади или с других проспектов.
let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square
for av in av_from_square
avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
// we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size
Это должно дать вам площадь и пару главных улиц
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Теперь мы должны установить проспекты, которые не начинаются на главной площади, они будут пересекать другие проспекты
for av in (n_avenues - av_from_square){
const av_to_intersect = avenues[RANDOM(0,avenues.length)];
//check av_to... and get a perpendicular vector (explained bellow)
av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];
}
Чтобы получить перпендикулярные векторы, вы должны поменять местами шнуры x, y и отменить новый y:
swiped == x: noswiped.y, y: -1 * (noswiped.x)
Прямо сейчас у вас должно быть что-то похожее на это, разве это не похоже на город? :П
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º Теперь вам нужно только соединить проспекты с короткими улицами. Кроме того, вы можете создавать случайные квадраты по всему городу и делать то же, что и выше, для всех них, или просто создавать небольшие улицы из некоторых вспомогательных площадей, это ваше дело.
Помните, чем короче ваши улицы, тем хаотичным выглядит город.